]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/cbs_av1: add a range check to tg_end
authorJames Almer <jamrial@gmail.com>
Tue, 27 Oct 2020 21:25:06 +0000 (18:25 -0300)
committerJames Almer <jamrial@gmail.com>
Wed, 11 Nov 2020 13:23:01 +0000 (10:23 -0300)
Section 6.10.1 of the AV1 spec states:

It is a requirement of bitstream conformance that the value of tg_start is
equal to the value of TileNum at the point that tile_group_obu is invoked.
It is a requirement of bitstream conformance that the value of tg_end is
greater than or equal to tg_start.

Signed-off-by: James Almer <jamrial@gmail.com>
libavcodec/cbs_av1.c
libavcodec/cbs_av1.h
libavcodec/cbs_av1_syntax_template.c

index 8aa7b09fa729d38556f000daf26a022c00a8ed2c..9badfe31e4965ea4998e2d4447301c2829a8beb8 100644 (file)
@@ -1205,6 +1205,7 @@ static void cbs_av1_flush(CodedBitstreamContext *ctx)
     memset(priv->ref, 0, sizeof(priv->ref));
     priv->operating_point_idc = 0;
     priv->seen_frame_header = 0;
+    priv->tile_num = 0;
 }
 
 static void cbs_av1_close(CodedBitstreamContext *ctx)
index a2d78e736f0ac677eeb011457b5311af9a991d9c..386774750a026c580be7074f1651ea615d7778f4 100644 (file)
@@ -446,6 +446,7 @@ typedef struct CodedBitstreamAV1Context {
     int all_lossless;
     int tile_cols;
     int tile_rows;
+    int tile_num;
 
     AV1ReferenceFrameState ref[AV1_NUM_REF_FRAMES];
 } CodedBitstreamAV1Context;
index 884dbec76046a3cf78338b6511e869bc3d41fbe8..bef53e145beee265632168321b58fb4fee4d1d5c 100644 (file)
@@ -1725,6 +1725,8 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
 
         CHECK(FUNC(uncompressed_header)(ctx, rw, current));
 
+        priv->tile_num = 0;
+
         if (current->show_existing_frame) {
             priv->seen_frame_header = 0;
         } else {
@@ -1790,10 +1792,12 @@ static int FUNC(tile_group_obu)(CodedBitstreamContext *ctx, RWContext *rw,
     } else {
         tile_bits = cbs_av1_tile_log2(1, priv->tile_cols) +
                     cbs_av1_tile_log2(1, priv->tile_rows);
-        fb(tile_bits, tg_start);
-        fb(tile_bits, tg_end);
+        fc(tile_bits, tg_start, priv->tile_num, num_tiles - 1);
+        fc(tile_bits, tg_end, current->tg_start, num_tiles - 1);
     }
 
+    priv->tile_num = current->tg_end + 1;
+
     CHECK(FUNC(byte_alignment)(ctx, rw));
 
     // Reset header for next frame.