<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Texte de bulles Car";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.TextedebullesCar
        {mso-style-name:"Texte de bulles Car";
        mso-style-priority:99;
        mso-style-link:"Texte de bulles";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hello, I use FFMPEG 4.0.2 to decode h264/hevc video streams from RTSP cameras on a Windows system.<o:p></o:p></p>
<p class="MsoNormal">But, due to the CPU limitation, I want to use the hwdevice to decompress.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Based on hw_decode.c sample file I try to use cuda or d3d11va.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I can use cuda working <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">My code is :<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVCodecHWConfig*    pHWConfig ;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVBufferRef*        pHWDeviceCtx;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">enum AVPixelFormat  HwPixfmt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVHWDeviceType      HwDeviceType;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVPixelFormat       hwPixelFormat;
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVHWDeviceType      hwDeviceType;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">int                 methods;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">AVFrame*            pSWFrame;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">static enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">{ const enum AVPixelFormat *p;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  <o:p>
</o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  for (p = pix_fmts; *p != -1; p++)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   { if (*p == AV_PIX_FMT_RGB0) //hw_pix_fmt for CUDA<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">      return *p;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  <o:p>
</o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  printf("Failed to get HW surface format\r\n");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  return AV_PIX_FMT_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">int hw_decoder_init(AVCodecContext *ctx, const enum AVHWDeviceType type)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">{ int err = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  <o:p>
</o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  if ((err = av_hwdevice_ctx_create(&pHWDeviceCtx, type, NULL, NULL, 0)) < 0)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   { return err;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  if (av_hwdevice_ctx_init(m_lpHWDeviceCtx) < 0)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   { return -1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  ctx->hw_device_ctx = lpfnav_buffer_ref(m_lpHWDeviceCtx);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  return err;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">///////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">in the decode part (1 per decoding Thread)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">pCodec = avcodec_find_decoder_by_name("h264_cuvid");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">if (pCodec != NULL)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  { hwPixelFormat = AV_PIX_FMT_NONE;
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    hwDeviceType  = AV_HWDEVICE_TYPE_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    methods = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    for (int i = 0;; i++)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     { const AVCodecHWConfig* hw_config = lpfnavcodec_get_hw_config(m_lpCodec, i);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">       if (!hw_config)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { pCodec = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">       if (hw_config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && hw_config->device_type == AV_HWDEVICE_TYPE_CUDA)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { HwPixfmt = hw_config->pix_fmt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          pHWConfig = (AVCodecHWConfig*)hw_config;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">         
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          if (!(hw_config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL))
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           { // Second Options<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             methods      = hw_config->methods;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             HwPixfmt     = hw_config->pix_fmt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             hwDeviceType = hw_config->device_type;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    enum AVHWDeviceType iterateType = AV_HWDEVICE_TYPE_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    while ((iterateType  = av_hwdevice_iterate_types (iterateType)) != AV_HWDEVICE_TYPE_NONE)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     { if (iterateType == AV_HWDEVICE_TYPE_CUDA)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { HwDeviceType = iterateType;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     }
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  ....<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     if ((pCodec != NULL) && (pCodecCtx == NULL))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">      { pCodecCtx = avcodec_alloc_context3(pCodec);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        if (pCodecCtx != NULL)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">         { if (pHWConfig != NULL)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            { pCodecCtx->get_format = get_hw_format;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                    hw_decoder_init( pCodecCtx, HwDeviceType)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            }  
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           // Init CodecContext<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           if (pCodecCtx->width == 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            { pCodecCtx->pix_fmt           = AV_PIX_FMT_YUV420P;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->codec_type        = AVMEDIA_TYPE_VIDEO;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->codec_id          = AV_CODEC_ID_H264;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->coded_width       = 1280<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->coded_height      = 720<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->width             = 1280<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->height            = 720<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->thread_count      = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->thread_type       = FF_THREAD_FRAME|FF_THREAD_SLICE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              pCodecCtx->err_recognition   = AV_EF_EXPLODE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">         }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">      }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     if ((pCodecCtx!=NULL) && (pCodec!=NULL)&&(!avcodec_is_open(pCodecCtx)))<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">      { if ( pCodec != NULL)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">         { ......<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           iResult = avcodec_open2( pCodecCtx, pCodec, &optionsDict);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               iRes = avcodec_send_packet( pCodecCtx, &pPacket);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           if (iRes>=0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            { iRes = avcodec_receive_frame( pCodecCtx, pFrame );<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              if (iRes == AVERROR(EAGAIN) || iRes == AVERROR_EOF)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               { av_frame_free(&pFrame);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">              else<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               if (iRes < 0)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                { printf("receive_frame Error while decoding\r\n");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               else<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">               if (pFrame->format == HwPixfmt)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                { sw_frame = av_frame_alloc();<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                  if ((iRes = av_hwframe_transfer_data( sw_frame, pFrame, 0)) < 0)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                   { tmp_frame = pFrame;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                  else<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                   { tmp_frame = sw_frame;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">                }  
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">            ...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">When I set the av_log, I can see when it works :<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Format cuda chosen by get_format().<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded lib: nvcuvid.dll<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidGetDecoderCaps<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCreateDecoder<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidDestroyDecoder<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidDecodePicture<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidMapVideoFrame<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidUnmapVideoFrame<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCtxLockCreate<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCtxLockDestroy<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCtxLock<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCtxUnlock<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCreateVideoSource<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCreateVideoSourceW<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidDestroyVideoSource<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidSetVideoSourceState<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidGetVideoSourceState<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidGetSourceVideoFormat<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidGetSourceAudioFormat<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidCreateVideoParser<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidParseVideoData<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Loaded sym: cuvidDestroyVideoParser<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded lib: nvcuda.dll<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuInit<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuDeviceGetCount<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuDeviceGet<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuDeviceGetName<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuDeviceComputeCapability<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuCtxCreate_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuCtxSetLimit<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuCtxPushCurrent_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuCtxPopCurrent_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuCtxDestroy_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuMemAlloc_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuMemFree_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuMemcpy2D_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuMemcpy2DAsync_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGetErrorName<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGetErrorString<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuStreamCreate<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuStreamQuery<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuStreamSynchronize<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuStreamDestroy_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuStreamAddCallback<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuEventCreate<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuEventDestroy_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuEventSynchronize<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuEventQuery<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuEventRecord<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGLGetDevices_v2<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGraphicsGLRegisterImage<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGraphicsUnregisterResource<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGraphicsMapResources<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGraphicsUnmapResources<o:p></o:p></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e36d800] Loaded sym: cuGraphicsSubResourceGetMappedArray<o:p></o:p></p>
<p class="MsoNormal">[AVBSFContext @ 0e3befc0] The input looks like it is Annex B already<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] CUVID capabilities for h264_cuvid:<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] 8 bit: supported: 1, min_width: 48, max_width: 4096, min_height: 16, max_height: 4096<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] 10 bit: supported: 0, min_width: 0, max_width: 0, min_height: 0, max_height: 0<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] 12 bit: supported: 0, min_width: 0, max_width: 0, min_height: 0, max_height: 0<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Invalid pkt_timebase, passing timestamps as-is.<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Format cuda chosen by get_format().<o:p></o:p></p>
<p class="MsoNormal">[h264_cuvid @ 0e389540] Formats: Original: cuda | HW: cuda | SW: nv12<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b>But when I want to use it for the seventh time, I have an error, is there a limitation ?<o:p></o:p></b></p>
<p class="MsoNormal">[AVHWDeviceContext @ 0e3ca9c0] Error creating a CUDA context<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">So I want to try d3d11va instead…<o:p></o:p></p>
<p class="MsoNormal">Just changing some part in my code<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">static enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">{ const enum AVPixelFormat *p;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  <o:p>
</o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  for (p = pix_fmts; *p != -1; p++)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   { if (*p == AV_PIX_FMT_RGB0) // is it a hw_pix_fmt for
</span>d3d11va<span style="font-size:10.0pt;font-family:"Courier New"">?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">      return *p;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">   }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  <o:p>
</o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  printf("Failed to get HW surface format\r\n");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  return AV_PIX_FMT_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">And
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">///////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">in the decode part (1 per decoding Thread)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">////////////////////////////////////////////////////////////////<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">pCodec = avcodec_find_decoder_by_name("h264 ");<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">if (pCodec != NULL)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">  { hwPixelFormat = AV_PIX_FMT_NONE;
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    hwDeviceType  = AV_HWDEVICE_TYPE_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    methods = 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    for (int i = 0;; i++)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     { const AVCodecHWConfig* hw_config = lpfnavcodec_get_hw_config(m_lpCodec, i);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">       if (!hw_config)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { pCodec = NULL;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">       if (hw_config->methods & AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX && hw_config->device_type == AV_HWDEVICE_TYPE_D3D11VA)
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { HwPixfmt = hw_config->pix_fmt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          pHWConfig = (AVCodecHWConfig*)hw_config;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">         
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          if (!(hw_config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL))
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           { // Second Options<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             methods      = hw_config->methods;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             HwPixfmt     = hw_config->pix_fmt;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             hwDeviceType = hw_config->device_type;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">             break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">           }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">          break;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    enum AVHWDeviceType iterateType = AV_HWDEVICE_TYPE_NONE;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">    while ((iterateType  = av_hwdevice_iterate_types (iterateType)) != AV_HWDEVICE_TYPE_NONE)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     { if (iterateType == AV_HWDEVICE_TYPE_DXVA2)<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        { HwDeviceType = iterateType;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">        }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New"">     }
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But in this case, I have ffmpeg error saying…<o:p></o:p></p>
<p class="MsoNormal">[h264 @ 0e4d7fc0] Format d3d11va_vld chosen by get_format().<o:p></o:p></p>
<p class="MsoNormal">[h264 @ 0e4d7fc0] <b>Format d3d11va_vld requires hwaccel initialisation</b>.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">How can I make the hwaccel initialisation ???<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">[h264 @ 0e4d7fc0] A hardware frames or device context is required for hardware accelerated decoding.<o:p></o:p></p>
<p class="MsoNormal">[h264 @ 0e4d7fc0] Failed setup for format d3d11va_vld: hwaccel initialisation returned error.<o:p></o:p></p>
<p class="MsoNormal">[h264 @ 0e4d7fc0] Format d3d11va_vld not usable, retrying get_format() without it.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks for your answers…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>