[FFmpeg-devel] [PATCH 4/5] avcodec/h264dec: use the RefStruct API for h264db
James Almer
jamrial at gmail.com
Fri Oct 25 05:26:12 EEST 2024
And ensure the buffer is synced between threads.
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/h264_picture.c | 2 +-
libavcodec/h264_slice.c | 2 ++
libavcodec/h264dec.c | 2 +-
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/libavcodec/h264_picture.c b/libavcodec/h264_picture.c
index 371a794ec2..d07c3a0af8 100644
--- a/libavcodec/h264_picture.c
+++ b/libavcodec/h264_picture.c
@@ -215,7 +215,7 @@ int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
err = AVERROR_INVALIDDATA;
if (sd) { // a decoding error may have happened before the side data could be allocated
if (!h->h274db) {
- h->h274db = av_mallocz(sizeof(*h->h274db));
+ h->h274db = ff_refstruct_allocz(sizeof(*h->h274db));
if (!h->h274db)
return AVERROR(ENOMEM);
}
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 84595b1a8b..b88545a075 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -445,6 +445,8 @@ int ff_h264_update_thread_context(AVCodecContext *dst,
h->sei.common.mastering_display = h1->sei.common.mastering_display;
h->sei.common.content_light = h1->sei.common.content_light;
+ ff_refstruct_replace(&h->h274db, h1->h274db);
+
if (!h->cur_pic_ptr)
return 0;
diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c
index af0913ca2c..805732057a 100644
--- a/libavcodec/h264dec.c
+++ b/libavcodec/h264dec.c
@@ -156,7 +156,7 @@ void ff_h264_free_tables(H264Context *h)
av_freep(&h->mb2b_xy);
av_freep(&h->mb2br_xy);
- av_freep(&h->h274db);
+ ff_refstruct_unref(&h->h274db);
ff_refstruct_pool_uninit(&h->qscale_table_pool);
ff_refstruct_pool_uninit(&h->mb_type_pool);
--
2.47.0
More information about the ffmpeg-devel
mailing list