diff mbox series

[FFmpeg-devel,3/5] avcodec/av1dec: infer and store film grain param values in AV1Frame

Message ID 20201125205445.10859-3-jamrial@gmail.com
State Accepted
Commit eee7ba8dba3546ce953f65b98f6ef59188ec935c
Headers show
Series [FFmpeg-devel,1/5] Revert "avcodec/nvdec_av1: fix setting film grain parameters for frames with update_grain == 0" | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished

Commit Message

James Almer Nov. 25, 2020, 8:54 p.m. UTC
They are not always coded in the bistream for each frame. In some cases, the
values need to be taken from a reference frame.

See section 6.8.20 from the AV1 spec.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/av1dec.c | 25 +++++++++++++++++++++++++
 libavcodec/av1dec.h |  2 ++
 2 files changed, 27 insertions(+)
diff mbox series

Patch

diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c
index ce051d4e6d..1589b8f0c0 100644
--- a/libavcodec/av1dec.c
+++ b/libavcodec/av1dec.c
@@ -247,6 +247,26 @@  static void coded_lossless_param(AV1DecContext *s)
     }
 }
 
+static void load_grain_params(AV1DecContext *s)
+{
+    const AV1RawFrameHeader *header = s->raw_frame_header;
+    const AV1RawFilmGrainParams *film_grain = &header->film_grain, *src;
+    AV1RawFilmGrainParams *dst = &s->cur_frame.film_grain;
+
+    if (!film_grain->apply_grain)
+        return;
+
+    if (film_grain->update_grain) {
+        memcpy(dst, film_grain, sizeof(*dst));
+        return;
+    }
+
+    src = &s->ref[film_grain->film_grain_params_ref_idx].film_grain;
+
+    memcpy(dst, src, sizeof(*dst));
+    dst->grain_seed = film_grain->grain_seed;
+}
+
 static int init_tile_data(AV1DecContext *s)
 
 {
@@ -447,6 +467,7 @@  static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f)
     f->spatial_id = f->temporal_id = 0;
     memset(f->skip_mode_frame_idx, 0,
            2 * sizeof(uint8_t));
+    memset(&f->film_grain, 0, sizeof(f->film_grain));
     f->coded_lossless = 0;
 }
 
@@ -482,6 +503,9 @@  static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s
     memcpy(dst->skip_mode_frame_idx,
            src->skip_mode_frame_idx,
            2 * sizeof(uint8_t));
+    memcpy(&dst->film_grain,
+           &src->film_grain,
+           sizeof(dst->film_grain));
     dst->coded_lossless = src->coded_lossless;
 
     return 0;
@@ -762,6 +786,7 @@  static int get_current_frame(AVCodecContext *avctx)
     global_motion_params(s);
     skip_mode_params(s);
     coded_lossless_param(s);
+    load_grain_params(s);
 
     return ret;
 }
diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h
index 4b218f64bb..7e3b0c7291 100644
--- a/libavcodec/av1dec.h
+++ b/libavcodec/av1dec.h
@@ -47,6 +47,8 @@  typedef struct AV1Frame {
 
     uint8_t skip_mode_frame_idx[2];
 
+    AV1RawFilmGrainParams film_grain;
+
     uint8_t coded_lossless;
 } AV1Frame;