<html 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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="en-001" link="blue" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Hi</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</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.</p>
<p class="MsoNormal">I am using windows 10, visual studio 2022 and ffmpeg 6.0.</p>
<p class="MsoNormal">thx in advance</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></p>
<p class="MsoNormal">#include <d3d11.h></p>
<p class="MsoNormal">extern "C"</p>
<p class="MsoNormal">{</p>
<p class="MsoNormal">#include <libavutil/opt.h></p>
<p class="MsoNormal">#include <libavcodec/avcodec.h></p>
<p class="MsoNormal">#include <libavutil/hwcontext_d3d11va.h></p>
<p class="MsoNormal">#include <libavutil/hwcontext_qsv.h></p>
<p class="MsoNormal">#include <libavutil/hwcontext.h></p>
<p class="MsoNormal">}</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main()</p>
<p class="MsoNormal">{</p>
<p class="MsoNormal">                while (true)</p>
<p class="MsoNormal">                {</p>
<p class="MsoNormal">                                AVFrame* frame = av_frame_alloc();</p>
<p class="MsoNormal">                                const AVCodec* codec = avcodec_find_encoder_by_name("h264_qsv");</p>
<p class="MsoNormal">                                AVCodecContext* encoderContext = avcodec_alloc_context3(codec);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                encoderContext->width = 1920;</p>
<p class="MsoNormal">                                encoderContext->height = 1080;</p>
<p class="MsoNormal">                                encoderContext->time_base.den = 120;</p>
<p class="MsoNormal">                                encoderContext->time_base.num = 1;</p>
<p class="MsoNormal">                                encoderContext->framerate.den = 1;</p>
<p class="MsoNormal">                                encoderContext->framerate.num = 120;</p>
<p class="MsoNormal">                                encoderContext->max_b_frames = 0;</p>
<p class="MsoNormal">                                encoderContext->thread_count = 1;</p>
<p class="MsoNormal">                                encoderContext->gop_size = 10;</p>
<p class="MsoNormal">                                encoderContext->sw_pix_fmt = AV_PIX_FMT_NV12;</p>
<p class="MsoNormal">                                encoderContext->pix_fmt = AV_PIX_FMT_QSV;</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);</p>
<p class="MsoNormal">                                av_opt_set(encoderContext->priv_data, "preset", "veryfast", 0);</p>
<p class="MsoNormal">                                av_opt_set(encoderContext->priv_data, "async_depth", "1", 0);</p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "b", "15M", 0);</p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "maxrate", "15M", 0);</p>
<p class="MsoNormal">                                av_opt_set(encoderContext, "bufsize", "15M", 0);</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;</p>
<p class="MsoNormal">                                int err = av_hwdevice_ctx_create(&(hardwareDeviceContext), AV_HWDEVICE_TYPE_D3D11VA, "hw", nullptr,</p>
<p class="MsoNormal">                                                0);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVHWDeviceContext* deviceContext = (AVHWDeviceContext*)hardwareDeviceContext->data;</p>
<p class="MsoNormal">                                AVD3D11VADeviceContext* ctx = (AVD3D11VADeviceContext*)deviceContext->hwctx;</p>
<p class="MsoNormal">                                //ctx->device = getD3DDevice();</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVBufferRef* hardwareFrameContext;</p>
<p class="MsoNormal">                                hardwareFrameContext = av_hwframe_ctx_alloc(hardwareDeviceContext);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                AVHWFramesContext* frames_ctx = (AVHWFramesContext*)(hardwareFrameContext->data);</p>
<p class="MsoNormal">                                frames_ctx->format = AV_PIX_FMT_D3D11;</p>
<p class="MsoNormal">                                frames_ctx->sw_format = AV_PIX_FMT_NV12;</p>
<p class="MsoNormal">                                frames_ctx->width = encoderContext->width;</p>
<p class="MsoNormal">                                frames_ctx->height = encoderContext->height;</p>
<p class="MsoNormal">                                frames_ctx->initial_pool_size = 1;</p>
<p class="MsoNormal">                                err = av_hwframe_ctx_init(hardwareFrameContext);</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);</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);</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);</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);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&hardwareDeviceContext);</p>
<p class="MsoNormal">                                av_buffer_unref(&hardwareFrameContext);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                hardwareDeviceContext = nullptr;</p>
<p class="MsoNormal">                                hardwareFrameContext = nullptr;</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&encoderContext->hw_device_ctx);</p>
<p class="MsoNormal">                                encoderContext->hw_device_ctx = nullptr;</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_buffer_unref(&encoderContext->hw_frames_ctx);</p>
<p class="MsoNormal">                                encoderContext->hw_frames_ctx = nullptr;</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                av_frame_unref(frame);</p>
<p class="MsoNormal">                                av_frame_free(&frame);</p>
<p class="MsoNormal">                                frame = nullptr;</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                avcodec_close(encoderContext);</p>
<p class="MsoNormal">                                avcodec_free_context(&encoderContext);</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                                encoderContext = nullptr;</p>
<p class="MsoNormal">                }</p>
<p class="MsoNormal">                </p>
<p class="MsoNormal">                </p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">                return 0;</p>
<p class="MsoNormal">}</p>
</div>
</body>
</html>