[FFmpeg-devel] [PATCH 2/3] avcodec/h264_picture: add ff_h264_replace_picture()
James Almer
jamrial at gmail.com
Mon Aug 9 01:56:11 EEST 2021
Will remove unnecessary allocations when both src and dst picture contain
references to the same buffers.
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/h264_picture.c | 45 +++++++++++++++++++++++++++++++++++++++
libavcodec/h264dec.h | 1 +
2 files changed, 46 insertions(+)
diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c
index 89aef37edd..1073d9e7e0 100644
--- a/libavcodec/h264_picture.c
+++ b/libavcodec/h264_picture.c
@@ -142,6 +142,51 @@ fail:
return ret;
}
+int ff_h264_replace_picture(H264Context *h, H264Picture *dst, H264Picture *src)
+{
+ int ret, i;
+
+ if (!src->f || !src->f->buf[0]) {
+ ff_h264_unref_picture(h, dst);
+ return 0;
+ }
+
+ av_assert0(src->tf.f == src->f);
+
+ dst->tf.f = dst->f;
+ ff_thread_release_buffer(h->avctx, &dst->tf);
+ ret = ff_thread_ref_frame(&dst->tf, &src->tf);
+ if (ret < 0)
+ goto fail;
+
+ ret = av_buffer_replace(&dst->qscale_table_buf, src->qscale_table_buf);
+ ret |= av_buffer_replace(&dst->mb_type_buf, src->mb_type_buf);
+ ret |= av_buffer_replace(&dst->pps_buf, src->pps_buf);
+ if (ret < 0)
+ goto fail;
+
+ for (i = 0; i < 2; i++) {
+ ret = av_buffer_replace(&dst->motion_val_buf[i], src->motion_val_buf[i]);
+ ret |= av_buffer_replace(&dst->ref_index_buf[i], src->ref_index_buf[i]);
+ if (ret < 0)
+ goto fail;
+ }
+
+ if (src->hwaccel_picture_private) {
+ ret = av_buffer_replace(&dst->hwaccel_priv_buf, src->hwaccel_priv_buf);
+ if (ret < 0)
+ goto fail;
+ dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data;
+ }
+
+ h264_copy_picture_params(dst, src);
+
+ return 0;
+fail:
+ ff_h264_unref_picture(h, dst);
+ return ret;
+}
+
void ff_h264_set_erpic(ERPicture *dst, H264Picture *src)
{
#if CONFIG_ERROR_RESILIENCE
diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h
index 8954b74795..655b8f0b9a 100644
--- a/libavcodec/h264dec.h
+++ b/libavcodec/h264dec.h
@@ -833,6 +833,7 @@ static inline int find_start_code(const uint8_t *buf, int buf_size,
int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup);
int ff_h264_ref_picture(H264Context *h, H264Picture *dst, H264Picture *src);
+int ff_h264_replace_picture(H264Context *h, H264Picture *dst, H264Picture *src);
void ff_h264_unref_picture(H264Context *h, H264Picture *pic);
int ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl);
--
2.32.0
More information about the ffmpeg-devel
mailing list