<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=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (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:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:"Cascadia Mono";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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="EN-US" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">I think I have found the same memory leak and it’s even more basic.  The following code will leak memory when using
<span style="font-size:9.5pt;font-family:"Cascadia Mono";color:darkslategray">AV_HWDEVICE_TYPE_QSV</span> , but not when using
<span style="font-size:9.5pt;font-family:"Cascadia Mono";color:darkslategray">AV_HWDEVICE_TYPE_CUDA</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">  
</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:blue">while</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black"> (</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:blue">true</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">   {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">     
</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:#2B91AF">AVBufferRef</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">* hw_device_ctx;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">      av_hwdevice_ctx_create(&hw_device_ctx,
</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:darkslategray">AV_HWDEVICE_TYPE_QSV</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">,
</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:#6F008A">NULL</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">,
</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:#6F008A">NULL</span><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">, 0);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">      av_buffer_unref(&hw_device_ctx);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.5pt;font-family:"Cascadia Mono";color:black">   }</span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Mark Samuelson<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> Libav-user <libav-user-bounces@ffmpeg.org> <b>On Behalf Of
</b>karim abd<br>
<b>Sent:</b> Saturday, June 10, 2023 7:30 AM<br>
<b>To:</b> libav-user@ffmpeg.org<br>
<b>Subject:</b> [Libav-user] Memory doesn't decrease after freeing a derived device context of type AV_HWDEVICE_TYPE_QSV<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" align="left" width="100%" style="width:100.0%">
<tbody>
<tr>
<td style="background:#A6A6A6;padding:5.25pt 1.5pt 5.25pt 1.5pt"></td>
<td width="100%" style="width:100.0%;background:#EAEAEA;padding:5.25pt 3.75pt 5.25pt 11.25pt">
<div>
<p class="MsoNormal" style="mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly">
<span style="font-size:9.0pt;font-family:"Segoe UI",sans-serif;color:#212121">You don't often get email from
<a href="mailto:karimabdalsalam@hotmail.com">karimabdalsalam@hotmail.com</a>. <a href="https://aka.ms/LearnAboutSenderIdentification">
Learn why this is important</a><o:p></o:p></span></p>
</div>
</td>
<td width="75" style="width:56.25pt;background:#EAEAEA;padding:5.25pt 3.75pt 5.25pt 3.75pt;align:left">
</td>
</tr>
</tbody>
</table>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hi<o:p></o:p></p>
<p class="MsoNormal">I was able to encode ID3D11Texture2D successfully using a derived device context of type  V_HWDEVICE_TYPE_QSV and its hardware frames context but when I try to free them<o:p></o:p></p>
<p class="MsoNormal">the memory does not decrease. I am not very sure if I missed something to free or it is a bug. Here is a small code to reproduce the problem.<o:p></o:p></p>
<p class="MsoNormal">I am using windows 10, visual studio 2022 and ffmpeg 6.0.<o:p></o:p></p>
<p class="MsoNormal">thx in advance<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#include <iostream><o:p></o:p></p>
<p class="MsoNormal">#include <d3d11.h><o:p></o:p></p>
<p class="MsoNormal">extern "C"<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">#include <libavutil/opt.h><o:p></o:p></p>
<p class="MsoNormal">#include <libavcodec/avcodec.h><o:p></o:p></p>
<p class="MsoNormal">#include <libavutil/hwcontext_d3d11va.h><o:p></o:p></p>
<p class="MsoNormal">#include <libavutil/hwcontext_qsv.h><o:p></o:p></p>
<p class="MsoNormal">#include <libavutil/hwcontext.h><o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main()<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">                while (true)<o:p></o:p></p>
<p class="MsoNormal">                {<o:p></o:p></p>
<p class="MsoNormal">                                AVFrame* frame = av_frame_alloc();<o:p></o:p></p>
<p class="MsoNormal">                                const AVCodec* codec = avcodec_find_encoder_by_name("h264_qsv");<o:p></o:p></p>
<p class="MsoNormal">                                AVCodecContext* encoderContext = avcodec_alloc_context3(codec);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                encoderContext->width = 1920;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->height = 1080;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->time_base.den = 120;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->time_base.num = 1;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->framerate.den = 1;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->framerate.num = 120;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->max_b_frames = 0;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->thread_count = 1;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->gop_size = 10;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->sw_pix_fmt = AV_PIX_FMT_NV12;<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->pix_fmt = AV_PIX_FMT_QSV;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext->priv_data, "profile", "baseline", 0);<o:p></o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext->priv_data, "preset", "veryfast", 0);<o:p></o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext->priv_data, "async_depth", "1", 0);<o:p></o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "b", "15M", 0);<o:p></o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "maxrate", "15M", 0);<o:p></o:p></p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "bufsize", "15M", 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVBufferRef* hardwareDeviceContext;<o:p></o:p></p>
<p class="MsoNormal">                                int err = av_hwdevice_ctx_create(&(hardwareDeviceContext), AV_HWDEVICE_TYPE_D3D11VA, "hw", nullptr,<o:p></o:p></p>
<p class="MsoNormal">                                                0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVHWDeviceContext* deviceContext = (AVHWDeviceContext*)hardwareDeviceContext->data;<o:p></o:p></p>
<p class="MsoNormal">                                AVD3D11VADeviceContext* ctx = (AVD3D11VADeviceContext*)deviceContext->hwctx;<o:p></o:p></p>
<p class="MsoNormal">                                //ctx->device = getD3DDevice();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVBufferRef* hardwareFrameContext;<o:p></o:p></p>
<p class="MsoNormal">                                hardwareFrameContext = av_hwframe_ctx_alloc(hardwareDeviceContext);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVHWFramesContext* frames_ctx = (AVHWFramesContext*)(hardwareFrameContext->data);<o:p></o:p></p>
<p class="MsoNormal">                                frames_ctx->format = AV_PIX_FMT_D3D11;<o:p></o:p></p>
<p class="MsoNormal">                                frames_ctx->sw_format = AV_PIX_FMT_NV12;<o:p></o:p></p>
<p class="MsoNormal">                                frames_ctx->width = encoderContext->width;<o:p></o:p></p>
<p class="MsoNormal">                                frames_ctx->height = encoderContext->height;<o:p></o:p></p>
<p class="MsoNormal">                                frames_ctx->initial_pool_size = 1;<o:p></o:p></p>
<p class="MsoNormal">                                err = av_hwframe_ctx_init(hardwareFrameContext);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                err = av_hwdevice_ctx_create_derived(&encoderContext->hw_device_ctx, AV_HWDEVICE_TYPE_QSV, hardwareDeviceContext, 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                err = av_hwframe_ctx_create_derived(&encoderContext->hw_frames_ctx, AV_PIX_FMT_QSV, encoderContext->hw_device_ctx, hardwareFrameContext, 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                err = avcodec_open2(encoderContext, codec, 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_hwframe_get_buffer(encoderContext->hw_frames_ctx, frame, 0);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&hardwareDeviceContext);<o:p></o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&hardwareFrameContext);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                hardwareDeviceContext = nullptr;<o:p></o:p></p>
<p class="MsoNormal">                                hardwareFrameContext = nullptr;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&encoderContext->hw_device_ctx);<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->hw_device_ctx = nullptr;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&encoderContext->hw_frames_ctx);<o:p></o:p></p>
<p class="MsoNormal">                                encoderContext->hw_frames_ctx = nullptr;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_frame_unref(frame);<o:p></o:p></p>
<p class="MsoNormal">                                av_frame_free(&frame);<o:p></o:p></p>
<p class="MsoNormal">                                frame = nullptr;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                avcodec_close(encoderContext);<o:p></o:p></p>
<p class="MsoNormal">                                avcodec_free_context(&encoderContext);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                encoderContext = nullptr;<o:p></o:p></p>
<p class="MsoNormal">                }<o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal">                <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                return 0;<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
</div>
</div>
</body>
</html>