aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/vaapi_encode.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2023-01-31 14:14:47 +0100
committerHaihao Xiang <haihao.xiang@intel.com>2023-02-02 10:42:39 +0800
commit7d49fef8b426041e22fde77771b435d9411241a0 (patch)
tree61dec26801bdfb562bd753996a204aec4a0bc1bf /libavcodec/vaapi_encode.c
parentf4b4e16641184b2414e5822c49fa5f6f9a57f2fb (diff)
downloadffmpeg-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.c22
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);