[FFmpeg-devel] [PATCH] avcodec/cbs_av1: avoid reset some members of loop filter

Fei Wang fei.w.wang at intel.com
Fri Dec 13 11:08:23 EET 2019


According to spec 6.8.10, loop_filter_ref_deltas & loop_filter_mode_deltas
should be keep same as its previous value if it is not presented in current
syntax.

Signed-off-by: Fei Wang <fei.w.wang at intel.com>
---
 libavcodec/cbs_av1.h                 |  3 +++
 libavcodec/cbs_av1_syntax_template.c | 24 +++++++++++++++++++++++-
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index 643e76793f..7267baaceb 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -444,6 +444,9 @@ typedef struct CodedBitstreamAV1Context {
     AV1ReferenceFrameState *ref;
     AV1ReferenceFrameState read_ref[AV1_NUM_REF_FRAMES];
     AV1ReferenceFrameState write_ref[AV1_NUM_REF_FRAMES];
+
+    int8_t pre_loop_filter_ref_deltas[AV1_TOTAL_REFS_PER_FRAME];
+    int8_t pre_loop_filter_mode_deltas[2];
 } CodedBitstreamAV1Context;
 
 
diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c
index f53955c52e..c9ac1dc600 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -819,6 +819,13 @@ static int FUNC(loop_filter_params)(CodedBitstreamContext *ctx, RWContext *rw,
     CodedBitstreamAV1Context *priv = ctx->priv_data;
     int i, err;
 
+    memcpy(current->loop_filter_ref_deltas,
+            priv->pre_loop_filter_ref_deltas,
+            AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
+    memcpy(current->loop_filter_mode_deltas,
+            priv->pre_loop_filter_mode_deltas,
+            2 * sizeof(int8_t));
+
     if (priv->coded_lossless || current->allow_intrabc) {
         infer(loop_filter_level[0], 0);
         infer(loop_filter_level[1], 0);
@@ -832,7 +839,15 @@ static int FUNC(loop_filter_params)(CodedBitstreamContext *ctx, RWContext *rw,
         infer(loop_filter_ref_deltas[AV1_REF_FRAME_ALTREF2], -1);
         for (i = 0; i < 2; i++)
             infer(loop_filter_mode_deltas[i], 0);
-        return 0;
+
+        memcpy(priv->pre_loop_filter_ref_deltas,
+                current->loop_filter_ref_deltas,
+                AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
+        memcpy(priv->pre_loop_filter_mode_deltas,
+                current->loop_filter_mode_deltas,
+                2 * sizeof(int8_t));
+
+	return 0;
     }
 
     fb(6, loop_filter_level[0]);
@@ -865,6 +880,13 @@ static int FUNC(loop_filter_params)(CodedBitstreamContext *ctx, RWContext *rw,
         }
     }
 
+    memcpy(priv->pre_loop_filter_ref_deltas,
+            current->loop_filter_ref_deltas,
+            AV1_TOTAL_REFS_PER_FRAME * sizeof(int8_t));
+    memcpy(priv->pre_loop_filter_mode_deltas,
+            current->loop_filter_mode_deltas,
+            2 * sizeof(int8_t));
+
     return 0;
 }
 
-- 
2.17.1



More information about the ffmpeg-devel mailing list