<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">>  Thanks! I read through the nvidia docs. It seems that I need to pass in the "hwaccel: cuvid" option in order to keep the raw frame in GPU memory. Do you have any idea how to do this in Libav (C)? I tried following <a href="https://stackoverflow.com/questions/5985273/using-ffmpeg-hwaccel-from-c?fbclid=IwAR0bI8NuMoc29Kw_tCwGQVogXAsG4liAqYSw6hftOZ2n8H5jn-JIV6RVdko" target="_blank">this Stackoverflow post,</a> but av_hwaccel_next() kept >   returning NULL for a pixel format of AV_PIX_FMT_YUV420P and a codec of "h264_nvenc." I also see that av_hwaccel_next is deprecated. Do you have any suggestions?  <br></div></div><div><br></div><div>You first need to create hardware device context, this example will get you started <a href="https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c">https://github.com/FFmpeg/FFmpeg/blob/master/doc/examples/hw_decode.c</a> . After this you need to create hardware frames context which you will use to pass frames inside of the GPU. For decoder get_hw_format should look something like this</div><div><br></div><div>enum AVPixelFormat get_hw_format(AVCodecContext* ctx, const enum AVPixelFormat* pix_fmts)<br>{<br>    const enum AVPixelFormat* p;<br>    for (p = pix_fmts; *p != -1; p++) {<br>     if (*p == this->hw_pix_fmt)<br>             break;<br>    }<br><br></div><div>       ctx->hw_frames_ctx = av_buffer_ref(this->hw_frames_ctx);  //This is the important line</div><div>    if (!p) return AV_PIX_FMT_NONE;<br>     return *p;<br>}<br></div><div><br></div><div>While opening the encoder you simply reference the same hw_frames_ctx</div><div><br></div><div>     enc_ctx->hw_frames_ctx = av_buffer_ref(hw_frames_ctx);<br></div><div><br></div><div>And that should be it.</div>-- <br><div dir="ltr" class="gmail_signature"><br>Regards<br>Strahinja Radman</div></div>