Hello, This patch makes nvenc copy incoming hwaccel frames instead of ref count increase. It fixes the bug which may happen when on-GPU transcoding is done and encoder is set to use B frames.
How to reproduce the bug: ./ffmpeg \ -hwaccel cuda -hwaccel_output_format cuda \ -i input.mkv \ -c:v h264_nvenc -preset p4 -tune hq -bf 3 \ -y output.mkv Expected output: [h264 @ 0x55b14da4b4c0] No decoder surfaces left [h264 @ 0x55b14da682c0] No decoder surfaces left [h264 @ 0x55b14da850c0] No decoder surfaces left [h264 @ 0x55b14daa1ec0] No decoder surfaces left Error while decoding stream #0:0: Invalid data found when processing input [h264 @ 0x55b14da2e6c0] No decoder surfaces left Error while decoding stream #0:0: Invalid data found when processing input Last message repeated 1 times Although fix adds extra CUDA DtoD memcopy, our internal testing results didn't show any noticeable difference in transcoding performance.
From c95adcf7d5f5dd787eaa80fa4643e7868f85848e Mon Sep 17 00:00:00 2001 From: Roman Arzumanyan <rarzuman...@nvidia.com> Date: Tue, 14 Sep 2021 14:03:24 +0300 Subject: [PATCH] nvenc: copy incoming HW frame instead of referencing --- libavcodec/nvenc.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 815b9429b3..9b4c968179 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -1849,7 +1849,7 @@ static int nvenc_upload_frame(AVCodecContext *avctx, const AVFrame *frame, return reg_idx; } - res = av_frame_ref(nvenc_frame->in_ref, frame); + res = av_hwframe_transfer_data(nvenc_frame->in_ref, frame, 0); if (res < 0) return res; @@ -1858,7 +1858,6 @@ static int nvenc_upload_frame(AVCodecContext *avctx, const AVFrame *frame, ctx->registered_frames[reg_idx].in_map.registeredResource = ctx->registered_frames[reg_idx].regptr; nv_status = p_nvenc->nvEncMapInputResource(ctx->nvencoder, &ctx->registered_frames[reg_idx].in_map); if (nv_status != NV_ENC_SUCCESS) { - av_frame_unref(nvenc_frame->in_ref); return nvenc_print_error(avctx, nv_status, "Error mapping an input resource"); } } @@ -2029,8 +2028,6 @@ static int process_output_surface(AVCodecContext *avctx, AVPacket *pkt, NvencSur goto error; } - av_frame_unref(tmpoutsurf->in_ref); - tmpoutsurf->input_surface = NULL; } -- 2.25.1
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".