From eee7ba8dba3546ce953f65b98f6ef59188ec935c Mon Sep 17 00:00:00 2001 From: James Almer Date: Wed, 25 Nov 2020 17:02:56 -0300 Subject: avcodec/av1dec: infer and store film grain param values in AV1Frame 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 --- libavcodec/av1dec.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'libavcodec/av1dec.c') 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; } -- cgit v1.2.3