[FFmpeg-devel] [PATCH 1/5] Partially revert "avcodec/h2645: allocate film grain metadata dynamically"

James Almer jamrial at gmail.com
Fri Oct 25 05:26:09 EEST 2024


AVFilmGrainAFGS1Params, the offending struct, is using sizeof(AVFilmGrainParams)
when it should not. This change also forgot to make the necessary changes to the
frame threading sync code.

Both of these will be fixed by the following commit.

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavcodec/h2645_sei.c    | 17 +++++------------
 libavcodec/h2645_sei.h    |  2 +-
 libavcodec/hevc/hevcdec.c |  4 ++--
 3 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 33551f5406..a481dbca2c 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -245,12 +245,7 @@ static int decode_registered_user_data(H2645SEI *h, GetByteContext *gb,
 
         provider_oriented_code = bytestream2_get_byteu(gb);
         if (provider_oriented_code == aom_grain_provider_oriented_code) {
-            if (!h->aom_film_grain) {
-                h->aom_film_grain = av_mallocz(sizeof(*h->aom_film_grain));
-                if (!h->aom_film_grain)
-                    return AVERROR(ENOMEM);
-            }
-            return ff_aom_parse_film_grain_sets(h->aom_film_grain,
+            return ff_aom_parse_film_grain_sets(&h->aom_film_grain,
                                                 gb->buffer,
                                                 bytestream2_get_bytes_left(gb));
         }
@@ -894,11 +889,9 @@ FF_ENABLE_DEPRECATION_WARNINGS
     }
 
 #if CONFIG_HEVC_SEI
-    if (sei->aom_film_grain) {
-        ret = ff_aom_attach_film_grain_sets(sei->aom_film_grain, frame);
-        if (ret < 0)
-            return ret;
-    }
+    ret = ff_aom_attach_film_grain_sets(&sei->aom_film_grain, frame);
+    if (ret < 0)
+        return ret;
 #endif
 
     return 0;
@@ -925,7 +918,7 @@ void ff_h2645_sei_reset(H2645SEI *s)
     s->ambient_viewing_environment.present = 0;
     s->mastering_display.present = 0;
     s->content_light.present = 0;
+    s->aom_film_grain.enable = 0;
 
     av_freep(&s->film_grain_characteristics);
-    av_freep(&s->aom_film_grain);
 }
diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h
index 8bcdc2bc5f..f001427e16 100644
--- a/libavcodec/h2645_sei.h
+++ b/libavcodec/h2645_sei.h
@@ -138,10 +138,10 @@ typedef struct H2645SEI {
     H2645SEIAmbientViewingEnvironment ambient_viewing_environment;
     H2645SEIMasteringDisplay mastering_display;
     H2645SEIContentLight content_light;
+    AVFilmGrainAFGS1Params aom_film_grain;
 
     // Dynamic allocations due to large size.
     H2645SEIFilmGrainCharacteristics* film_grain_characteristics;
-    AVFilmGrainAFGS1Params* aom_film_grain;
 } H2645SEI;
 
 enum {
diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index 1ea8df0fa0..900895598f 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -413,7 +413,7 @@ static int export_stream_params_from_sei(HEVCContext *s)
     }
 
     if ((s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present) ||
-        (s->sei.common.aom_film_grain && s->sei.common.aom_film_grain->enable))
+        s->sei.common.aom_film_grain.enable)
         avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
 
     return 0;
@@ -3268,7 +3268,7 @@ static int hevc_frame_start(HEVCContext *s, HEVCLayerContext *l,
         s->cur_frame->f->flags &= ~AV_FRAME_FLAG_KEY;
 
     s->cur_frame->needs_fg = ((s->sei.common.film_grain_characteristics && s->sei.common.film_grain_characteristics->present) ||
-                              (s->sei.common.aom_film_grain && s->sei.common.aom_film_grain->enable)) &&
+                              s->sei.common.aom_film_grain.enable) &&
         !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
         !s->avctx->hwaccel;
 
-- 
2.47.0



More information about the ffmpeg-devel mailing list