[FFmpeg-cvslog] cbs_av1: Copy loop filter and segment parameters of repeat frame from its mapped frame

Fei Wang git at videolan.org
Tue Sep 3 09:08:34 EEST 2024


ffmpeg | branch: master | Fei Wang <fei.w.wang at intel.com> | Mon Aug 26 16:34:10 2024 +0800| [ae9cf903e8232113e629825f8fffb22921fc6624] | committer: Fei Wang

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 at intel.com>

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

 libavcodec/cbs_av1.h                 |  5 +++++
 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));
+            }
         }
     }
 



More information about the ffmpeg-cvslog mailing list