<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>