[FFmpeg-cvslog] avcodec/h2645_sei: Factor attaching film grain side-data to frame out

Andreas Rheinhardt git at videolan.org
Thu Dec 1 12:39:04 EET 2022


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sat Jul  2 19:14:43 2022 +0200| [7b450bafd72dee8aa1d8b77fe34407e70f9f93cc] | committer: Andreas Rheinhardt

avcodec/h2645_sei: Factor attaching film grain side-data to frame out

This unfortunately involved adding some parameters
to ff_h2645_sei_to_frame() that will be mostly unused.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7b450bafd72dee8aa1d8b77fe34407e70f9f93cc
---

 libavcodec/h2645_sei.c  | 67 ++++++++++++++++++++++++++++++++++++++++++++++++-
 libavcodec/h2645_sei.h  |  5 +++-
 libavcodec/h264_slice.c | 59 +++----------------------------------------
 libavcodec/hevcdec.c    | 60 +++----------------------------------------
 4 files changed, 77 insertions(+), 114 deletions(-)

diff --git a/libavcodec/h2645_sei.c b/libavcodec/h2645_sei.c
index 0e201a20a4..3ff89e4fdd 100644
--- a/libavcodec/h2645_sei.c
+++ b/libavcodec/h2645_sei.c
@@ -429,7 +429,9 @@ static int is_frame_packing_type_valid(SEIFpaType type, enum AVCodecID codec_id)
 
 int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
                           enum AVCodecID codec_id,
-                          AVCodecContext *avctx)
+                          AVCodecContext *avctx, const H2645VUI *vui,
+                          unsigned bit_depth_luma, unsigned bit_depth_chroma,
+                          int seed)
 {
     H2645SEIFramePacking *fp = &sei->frame_packing;
 
@@ -544,6 +546,69 @@ int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
         }
     }
 
+    if (sei->film_grain_characteristics.present) {
+        H2645SEIFilmGrainCharacteristics *fgc = &sei->film_grain_characteristics;
+        AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(frame);
+        AVFilmGrainH274Params *h274;
+
+        if (!fgp)
+            return AVERROR(ENOMEM);
+
+        fgp->type = AV_FILM_GRAIN_PARAMS_H274;
+        h274      = &fgp->codec.h274;
+
+        fgp->seed = seed;
+
+        h274->model_id = fgc->model_id;
+        if (fgc->separate_colour_description_present_flag) {
+            h274->bit_depth_luma   = fgc->bit_depth_luma;
+            h274->bit_depth_chroma = fgc->bit_depth_chroma;
+            h274->color_range      = fgc->full_range + 1;
+            h274->color_primaries  = fgc->color_primaries;
+            h274->color_trc        = fgc->transfer_characteristics;
+            h274->color_space      = fgc->matrix_coeffs;
+        } else {
+            h274->bit_depth_luma   = bit_depth_luma;
+            h274->bit_depth_chroma = bit_depth_chroma;
+            if (vui->video_signal_type_present_flag)
+                h274->color_range = vui->video_full_range_flag + 1;
+            else
+                h274->color_range = AVCOL_RANGE_UNSPECIFIED;
+            if (vui->colour_description_present_flag) {
+                h274->color_primaries = vui->colour_primaries;
+                h274->color_trc       = vui->transfer_characteristics;
+                h274->color_space     = vui->matrix_coeffs;
+            } else {
+                h274->color_primaries = AVCOL_PRI_UNSPECIFIED;
+                h274->color_trc       = AVCOL_TRC_UNSPECIFIED;
+                h274->color_space     = AVCOL_SPC_UNSPECIFIED;
+            }
+        }
+        h274->blending_mode_id  = fgc->blending_mode_id;
+        h274->log2_scale_factor = fgc->log2_scale_factor;
+
+        memcpy(&h274->component_model_present, &fgc->comp_model_present_flag,
+               sizeof(h274->component_model_present));
+        memcpy(&h274->num_intensity_intervals, &fgc->num_intensity_intervals,
+               sizeof(h274->num_intensity_intervals));
+        memcpy(&h274->num_model_values, &fgc->num_model_values,
+               sizeof(h274->num_model_values));
+        memcpy(&h274->intensity_interval_lower_bound, &fgc->intensity_interval_lower_bound,
+               sizeof(h274->intensity_interval_lower_bound));
+        memcpy(&h274->intensity_interval_upper_bound, &fgc->intensity_interval_upper_bound,
+               sizeof(h274->intensity_interval_upper_bound));
+        memcpy(&h274->comp_model_value, &fgc->comp_model_value,
+               sizeof(h274->comp_model_value));
+
+        if (IS_H264(codec_id))
+            fgc->present = !!fgc->repetition_period;
+        else
+            fgc->present = fgc->persistence_flag;
+
+        if (avctx)
+            avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
+    }
+
     return 0;
 }
 
diff --git a/libavcodec/h2645_sei.h b/libavcodec/h2645_sei.h
index eb00107abb..f3ee9af524 100644
--- a/libavcodec/h2645_sei.h
+++ b/libavcodec/h2645_sei.h
@@ -28,6 +28,7 @@
 #include "bytestream.h"
 #include "codec_id.h"
 #include "get_bits.h"
+#include "h2645_vui.h"
 #include "sei.h"
 
 typedef struct H2645SEIA53Caption {
@@ -136,6 +137,8 @@ void ff_h2645_sei_reset(H2645SEI *s);
 
 int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
                           enum AVCodecID codec_id,
-                          AVCodecContext *avctx);
+                          AVCodecContext *avctx, const H2645VUI *vui,
+                          unsigned bit_depth_luma, unsigned bit_depth_chroma,
+                          int seed);
 
 #endif /* AVCODEC_H2645_SEI_H */
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 0bacbb723f..420758ba0a 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1226,65 +1226,12 @@ static int h264_export_frame_props(H264Context *h)
         }
     }
 
-    ret = ff_h2645_sei_to_frame(out, &h->sei.common, AV_CODEC_ID_H264, h->avctx);
+    ret = ff_h2645_sei_to_frame(out, &h->sei.common, AV_CODEC_ID_H264, h->avctx,
+                                &sps->vui, sps->bit_depth_luma, sps->bit_depth_chroma,
+                                cur->poc + (h->poc_offset << 5));
     if (ret < 0)
         return ret;
 
-    if (h->sei.common.film_grain_characteristics.present) {
-        H2645SEIFilmGrainCharacteristics *fgc = &h->sei.common.film_grain_characteristics;
-        AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(out);
-        if (!fgp)
-            return AVERROR(ENOMEM);
-
-        fgp->type = AV_FILM_GRAIN_PARAMS_H274;
-        fgp->seed = cur->poc + (h->poc_offset << 5);
-
-        fgp->codec.h274.model_id = fgc->model_id;
-        if (fgc->separate_colour_description_present_flag) {
-            fgp->codec.h274.bit_depth_luma = fgc->bit_depth_luma;
-            fgp->codec.h274.bit_depth_chroma = fgc->bit_depth_chroma;
-            fgp->codec.h274.color_range = fgc->full_range + 1;
-            fgp->codec.h274.color_primaries = fgc->color_primaries;
-            fgp->codec.h274.color_trc = fgc->transfer_characteristics;
-            fgp->codec.h274.color_space = fgc->matrix_coeffs;
-        } else {
-            fgp->codec.h274.bit_depth_luma = sps->bit_depth_luma;
-            fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma;
-            if (sps->vui.video_signal_type_present_flag)
-                fgp->codec.h274.color_range = sps->vui.video_full_range_flag + 1;
-            else
-                fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED;
-            if (sps->vui.colour_description_present_flag) {
-                fgp->codec.h274.color_primaries = sps->vui.colour_primaries;
-                fgp->codec.h274.color_trc       = sps->vui.transfer_characteristics;
-                fgp->codec.h274.color_space     = sps->vui.matrix_coeffs;
-            } else {
-                fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED;
-                fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED;
-                fgp->codec.h274.color_space = AVCOL_SPC_UNSPECIFIED;
-            }
-        }
-        fgp->codec.h274.blending_mode_id = fgc->blending_mode_id;
-        fgp->codec.h274.log2_scale_factor = fgc->log2_scale_factor;
-
-        memcpy(&fgp->codec.h274.component_model_present, &fgc->comp_model_present_flag,
-               sizeof(fgp->codec.h274.component_model_present));
-        memcpy(&fgp->codec.h274.num_intensity_intervals, &fgc->num_intensity_intervals,
-               sizeof(fgp->codec.h274.num_intensity_intervals));
-        memcpy(&fgp->codec.h274.num_model_values, &fgc->num_model_values,
-               sizeof(fgp->codec.h274.num_model_values));
-        memcpy(&fgp->codec.h274.intensity_interval_lower_bound, &fgc->intensity_interval_lower_bound,
-               sizeof(fgp->codec.h274.intensity_interval_lower_bound));
-        memcpy(&fgp->codec.h274.intensity_interval_upper_bound, &fgc->intensity_interval_upper_bound,
-               sizeof(fgp->codec.h274.intensity_interval_upper_bound));
-        memcpy(&fgp->codec.h274.comp_model_value, &fgc->comp_model_value,
-               sizeof(fgp->codec.h274.comp_model_value));
-
-        fgc->present = !!fgc->repetition_period;
-
-        h->avctx->properties |= FF_CODEC_PROPERTY_FILM_GRAIN;
-    }
-
     if (h->sei.picture_timing.timecode_cnt > 0) {
         uint32_t *tc_sd;
         char tcbuf[AV_TIMECODE_STR_SIZE];
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 5631f6ed49..567e8d81d4 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -2794,7 +2794,10 @@ static int set_side_data(HEVCContext *s)
                metadata->MaxCLL, metadata->MaxFALL);
     }
 
-    ret = ff_h2645_sei_to_frame(out, &s->sei.common, AV_CODEC_ID_HEVC, NULL);
+    ret = ff_h2645_sei_to_frame(out, &s->sei.common, AV_CODEC_ID_HEVC, NULL,
+                                &s->ps.sps->vui.common,
+                                s->ps.sps->bit_depth, s->ps.sps->bit_depth_chroma,
+                                s->ref->poc /* no poc_offset in HEVC */);
     if (ret < 0)
         return ret;
 
@@ -2824,61 +2827,6 @@ static int set_side_data(HEVCContext *s)
         s->sei.timecode.num_clock_ts = 0;
     }
 
-    if (s->sei.common.film_grain_characteristics.present) {
-        H2645SEIFilmGrainCharacteristics *fgc = &s->sei.common.film_grain_characteristics;
-        AVFilmGrainParams *fgp = av_film_grain_params_create_side_data(out);
-        if (!fgp)
-            return AVERROR(ENOMEM);
-
-        fgp->type = AV_FILM_GRAIN_PARAMS_H274;
-        fgp->seed = s->ref->poc; /* no poc_offset in HEVC */
-
-        fgp->codec.h274.model_id = fgc->model_id;
-        if (fgc->separate_colour_description_present_flag) {
-            fgp->codec.h274.bit_depth_luma = fgc->bit_depth_luma;
-            fgp->codec.h274.bit_depth_chroma = fgc->bit_depth_chroma;
-            fgp->codec.h274.color_range = fgc->full_range + 1;
-            fgp->codec.h274.color_primaries = fgc->color_primaries;
-            fgp->codec.h274.color_trc = fgc->transfer_characteristics;
-            fgp->codec.h274.color_space = fgc->matrix_coeffs;
-        } else {
-            const HEVCSPS *sps = s->ps.sps;
-            const VUI *vui = &sps->vui;
-            fgp->codec.h274.bit_depth_luma = sps->bit_depth;
-            fgp->codec.h274.bit_depth_chroma = sps->bit_depth_chroma;
-            if (vui->common.video_signal_type_present_flag)
-                fgp->codec.h274.color_range = vui->common.video_full_range_flag + 1;
-            else
-                fgp->codec.h274.color_range = AVCOL_RANGE_UNSPECIFIED;
-            if (vui->common.colour_description_present_flag) {
-                fgp->codec.h274.color_primaries = vui->common.colour_primaries;
-                fgp->codec.h274.color_trc       = vui->common.transfer_characteristics;
-                fgp->codec.h274.color_space     = vui->common.matrix_coeffs;
-            } else {
-                fgp->codec.h274.color_primaries = AVCOL_PRI_UNSPECIFIED;
-                fgp->codec.h274.color_trc = AVCOL_TRC_UNSPECIFIED;
-                fgp->codec.h274.color_space = AVCOL_SPC_UNSPECIFIED;
-            }
-        }
-        fgp->codec.h274.blending_mode_id = fgc->blending_mode_id;
-        fgp->codec.h274.log2_scale_factor = fgc->log2_scale_factor;
-
-        memcpy(&fgp->codec.h274.component_model_present, &fgc->comp_model_present_flag,
-               sizeof(fgp->codec.h274.component_model_present));
-        memcpy(&fgp->codec.h274.num_intensity_intervals, &fgc->num_intensity_intervals,
-               sizeof(fgp->codec.h274.num_intensity_intervals));
-        memcpy(&fgp->codec.h274.num_model_values, &fgc->num_model_values,
-               sizeof(fgp->codec.h274.num_model_values));
-        memcpy(&fgp->codec.h274.intensity_interval_lower_bound, &fgc->intensity_interval_lower_bound,
-               sizeof(fgp->codec.h274.intensity_interval_lower_bound));
-        memcpy(&fgp->codec.h274.intensity_interval_upper_bound, &fgc->intensity_interval_upper_bound,
-               sizeof(fgp->codec.h274.intensity_interval_upper_bound));
-        memcpy(&fgp->codec.h274.comp_model_value, &fgc->comp_model_value,
-               sizeof(fgp->codec.h274.comp_model_value));
-
-        fgc->present = fgc->persistence_flag;
-    }
-
     if (s->sei.common.dynamic_hdr_plus.info) {
         AVBufferRef *info_ref = av_buffer_ref(s->sei.common.dynamic_hdr_plus.info);
         if (!info_ref)



More information about the ffmpeg-cvslog mailing list