Frames with primary_ref_frame == AV1_PRIMARY_REF_NONE can also have values for loop_filter_ref_deltas and loop_filter_mode_deltas coded in the bitstream that must overwrite the initial values if present.
Signed-off-by: James Almer <jamr...@gmail.com> --- libavcodec/av1dec.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 6d00754fcb..67ae02a1f8 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -26,8 +26,25 @@ #include "internal.h" #include "profiles.h" -static void setup_past_independence(AV1Frame *f) +static void loop_filter_delta_update(AV1DecContext *s) { + for (int i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) { + if (s->raw_frame_header->update_ref_delta[i]) + s->cur_frame.loop_filter_ref_deltas[i] = + s->raw_frame_header->loop_filter_ref_deltas[i]; + } + + for (int i = 0; i < 2; i++) { + if (s->raw_frame_header->update_mode_delta[i]) + s->cur_frame.loop_filter_mode_deltas[i] = + s->raw_frame_header->loop_filter_mode_deltas[i]; + } +} + +static void setup_past_independence_and_update(AV1DecContext *s) +{ + AV1Frame *f = &s->cur_frame; + f->loop_filter_delta_enabled = 1; f->loop_filter_ref_deltas[AV1_REF_FRAME_INTRA] = 1; @@ -41,6 +58,12 @@ static void setup_past_independence(AV1Frame *f) f->loop_filter_mode_deltas[0] = 0; f->loop_filter_mode_deltas[1] = 0; + + f->loop_filter_delta_enabled = + s->raw_frame_header->loop_filter_delta_enabled; + + if (s->raw_frame_header->loop_filter_delta_update) + loop_filter_delta_update(s); } static void load_previous_and_update(AV1DecContext *s) @@ -56,22 +79,11 @@ static void load_previous_and_update(AV1DecContext *s) s->ref[prev_frame].loop_filter_mode_deltas, 2 * sizeof(int8_t)); - if (s->raw_frame_header->loop_filter_delta_update) { - for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) { - if (s->raw_frame_header->update_ref_delta[i]) - s->cur_frame.loop_filter_ref_deltas[i] = - s->raw_frame_header->loop_filter_ref_deltas[i]; - } - - for (int i = 0; i < 2; i++) { - if (s->raw_frame_header->update_mode_delta[i]) - s->cur_frame.loop_filter_mode_deltas[i] = - s->raw_frame_header->loop_filter_mode_deltas[i]; - } - } - s->cur_frame.loop_filter_delta_enabled = s->raw_frame_header->loop_filter_delta_enabled; + + if (s->raw_frame_header->loop_filter_delta_update) + loop_filter_delta_update(s); } static uint32_t inverse_recenter(int r, uint32_t v) @@ -643,7 +655,7 @@ static int get_current_frame(AVCodecContext *avctx) } if (s->raw_frame_header->primary_ref_frame == AV1_PRIMARY_REF_NONE) - setup_past_independence(&s->cur_frame); + setup_past_independence_and_update(s); else load_previous_and_update(s); -- 2.28.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".