diff options
author | Fei Wang <fei.w.wang@intel.com> | 2024-08-26 16:34:10 +0800 |
---|---|---|
committer | Fei Wang <fei.w.wang@intel.com> | 2024-09-03 14:03:40 +0800 |
commit | ae9cf903e8232113e629825f8fffb22921fc6624 (patch) | |
tree | 0c38a74638e1f61e3e04d0403029d953975721ee | |
parent | a87a96105e9150dba07e3a660e41f78557f3356c (diff) | |
download | ffmpeg-ae9cf903e8232113e629825f8fffb22921fc6624.tar.gz |
cbs_av1: Copy loop filter and segment parameters of repeat frame from its mapped frame
Implement load/save loop filter and segment parameters defined in
section 7.20 and 7.21 in spec for show_existing_frame frames.
Fixes ticket #11151.
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
-rw-r--r-- | libavcodec/cbs_av1.h | 5 | ||||
-rw-r--r-- | libavcodec/cbs_av1_syntax_template.c | 36 |
2 files changed, 33 insertions, 8 deletions
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h index a027013bc7..8586f2bf4a 100644 --- a/libavcodec/cbs_av1.h +++ b/libavcodec/cbs_av1.h @@ -477,6 +477,11 @@ typedef struct CodedBitstreamAV1Context { // Writing will fail with an error if an OBU larger than can be // represented by the fixed size is encountered. int fixed_obu_size_length; + + int8_t loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME]; + int8_t loop_filter_mode_deltas[2]; + uint8_t feature_enabled[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; + int16_t feature_value[AV1_MAX_SEGMENTS][AV1_SEG_LVL_MAX]; } CodedBitstreamAV1Context; diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c index 3f4b13a177..a4a912482c 100644 --- a/libavcodec/cbs_av1_syntax_template.c +++ b/libavcodec/cbs_av1_syntax_template.c @@ -1374,6 +1374,15 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, priv->render_height = ref->render_height; priv->bit_depth = ref->bit_depth; priv->order_hint = ref->order_hint; + + memcpy(priv->loop_filter_ref_deltas, ref->loop_filter_ref_deltas, + sizeof(ref->loop_filter_ref_deltas)); + memcpy(priv->loop_filter_mode_deltas, ref->loop_filter_mode_deltas, + sizeof(ref->loop_filter_mode_deltas)); + memcpy(priv->feature_enabled, ref->feature_enabled, + sizeof(ref->feature_enabled)); + memcpy(priv->feature_value, ref->feature_value, + sizeof(ref->feature_value)); } else infer(refresh_frame_flags, 0); @@ -1691,14 +1700,25 @@ update_refs: priv->order_hints[j + AV1_REF_FRAME_LAST]; } - memcpy(priv->ref[i].loop_filter_ref_deltas, current->loop_filter_ref_deltas, - sizeof(current->loop_filter_ref_deltas)); - memcpy(priv->ref[i].loop_filter_mode_deltas, current->loop_filter_mode_deltas, - sizeof(current->loop_filter_mode_deltas)); - memcpy(priv->ref[i].feature_enabled, current->feature_enabled, - sizeof(current->feature_enabled)); - memcpy(priv->ref[i].feature_value, current->feature_value, - sizeof(current->feature_value)); + if (current->show_existing_frame) { + memcpy(priv->ref[i].loop_filter_ref_deltas, priv->loop_filter_ref_deltas, + sizeof(priv->loop_filter_ref_deltas)); + memcpy(priv->ref[i].loop_filter_mode_deltas, priv->loop_filter_mode_deltas, + sizeof(priv->loop_filter_mode_deltas)); + memcpy(priv->ref[i].feature_enabled, priv->feature_enabled, + sizeof(priv->feature_enabled)); + memcpy(priv->ref[i].feature_value, priv->feature_value, + sizeof(priv->feature_value)); + } else { + memcpy(priv->ref[i].loop_filter_ref_deltas, current->loop_filter_ref_deltas, + sizeof(current->loop_filter_ref_deltas)); + memcpy(priv->ref[i].loop_filter_mode_deltas, current->loop_filter_mode_deltas, + sizeof(current->loop_filter_mode_deltas)); + memcpy(priv->ref[i].feature_enabled, current->feature_enabled, + sizeof(current->feature_enabled)); + memcpy(priv->ref[i].feature_value, current->feature_value, + sizeof(current->feature_value)); + } } } |