Will remove unnecessary allocations when both src and dst picture contain references to the same buffers.
Signed-off-by: James Almer <jamr...@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 _______________________________________________ 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".