diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-01-31 14:14:47 +0100 |
---|---|---|
committer | Haihao Xiang <haihao.xiang@intel.com> | 2023-02-02 10:42:39 +0800 |
commit | 7d49fef8b426041e22fde77771b435d9411241a0 (patch) | |
tree | 61dec26801bdfb562bd753996a204aec4a0bc1bf /libavcodec/vaapi_encode.c | |
parent | f4b4e16641184b2414e5822c49fa5f6f9a57f2fb (diff) | |
download | ffmpeg-7d49fef8b426041e22fde77771b435d9411241a0.tar.gz |
lavc/vaapi_encode: fix propagating durations and opaques
input_image is freed by the time the output packet is constructed, so we
need to store copies in VAAPIEncodePicture.
Diffstat (limited to 'libavcodec/vaapi_encode.c')
-rw-r--r-- | libavcodec/vaapi_encode.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 6787b90e8d..bfca315a7a 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -695,7 +695,7 @@ static int vaapi_encode_output(AVCodecContext *avctx, pkt->flags |= AV_PKT_FLAG_KEY; pkt->pts = pic->pts; - pkt->duration = pic->input_image->duration; + pkt->duration = pic->duration; vas = vaUnmapBuffer(ctx->hwctx->display, pic->output_buffer); if (vas != VA_STATUS_SUCCESS) { @@ -706,10 +706,11 @@ static int vaapi_encode_output(AVCodecContext *avctx, } // for no-delay encoders this is handled in generic codec - if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY) { - err = ff_encode_reordered_opaque(avctx, pkt, pic->input_image); - if (err < 0) - goto fail; + if (avctx->codec->capabilities & AV_CODEC_CAP_DELAY && + avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) { + pkt->opaque = pic->opaque; + pkt->opaque_ref = pic->opaque_ref; + pic->opaque_ref = NULL; } av_buffer_unref(&pic->output_buffer_ref); @@ -785,6 +786,8 @@ static int vaapi_encode_free(AVCodecContext *avctx, av_frame_free(&pic->input_image); av_frame_free(&pic->recon_image); + av_buffer_unref(&pic->opaque_ref); + av_freep(&pic->param_buffers); av_freep(&pic->slices); // Output buffer should already be destroyed. @@ -1152,6 +1155,15 @@ static int vaapi_encode_send_frame(AVCodecContext *avctx, AVFrame *frame) pic->input_surface = (VASurfaceID)(uintptr_t)frame->data[3]; pic->pts = frame->pts; + pic->duration = frame->duration; + + if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) { + err = av_buffer_replace(&pic->opaque_ref, frame->opaque_ref); + if (err < 0) + goto fail; + + pic->opaque = frame->opaque; + } av_frame_move_ref(pic->input_image, frame); |