[NORMATIVE-SYNTAX] Fix max tile width/area calculation
As per the linked bug report, the maximum #pixels in each tile
was previously being computed in a way which depended on the
superblock size. This patch fixes this by making max_tile_width_sb
and max_tile_area_sb depend on the superblock size.
One potential source of confusion comes from the fact that we
already have a variable called max_tile_width_sb elsewhere in
the code, which tracks the width of the widest tile in the current
frame. To avoid confusion, this is renamed to widest_tile_sb,
so that max_* always means a limit in this context.
BUG=aomedia:1508
Change-Id: I94ebbc46e54cb5b1e8eda5f8ab3f0a3cd61698e8
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index 63e3425..e3d6988 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -476,12 +476,12 @@
int boundary_info_alloc_size;
#if CONFIG_MAX_TILE
+ int max_tile_width_sb;
int min_log2_tile_cols;
int max_log2_tile_cols;
int max_log2_tile_rows;
int min_log2_tile_rows;
int min_log2_tiles;
- int max_tile_width_sb;
int max_tile_height_sb;
int uniform_tile_spacing_flag;
int log2_tile_cols; // only valid for uniform tiles
diff --git a/av1/common/tile_common.c b/av1/common/tile_common.c
index 75ee555..7c7b042 100644
--- a/av1/common/tile_common.c
+++ b/av1/common/tile_common.c
@@ -61,10 +61,14 @@
int sb_cols = mi_cols >> cm->seq_params.mib_size_log2;
int sb_rows = mi_rows >> cm->seq_params.mib_size_log2;
- cm->min_log2_tile_cols = tile_log2(MAX_TILE_WIDTH_SB, sb_cols);
+ int sb_size_log2 = cm->seq_params.mib_size_log2 + MI_SIZE_LOG2;
+ cm->max_tile_width_sb = MAX_TILE_WIDTH >> sb_size_log2;
+ int max_tile_area_sb = MAX_TILE_AREA >> (2 * sb_size_log2);
+
+ cm->min_log2_tile_cols = tile_log2(cm->max_tile_width_sb, sb_cols);
cm->max_log2_tile_cols = tile_log2(1, AOMMIN(sb_cols, MAX_TILE_COLS));
cm->max_log2_tile_rows = tile_log2(1, AOMMIN(sb_rows, MAX_TILE_ROWS));
- cm->min_log2_tiles = tile_log2(MAX_TILE_AREA_SB, sb_cols * sb_rows);
+ cm->min_log2_tiles = tile_log2(max_tile_area_sb, sb_cols * sb_rows);
cm->min_log2_tiles = AOMMAX(cm->min_log2_tiles, cm->min_log2_tile_cols);
// TODO(dominic.symes@arm.com):
// Add in levelMinLog2Tiles as a lower limit when levels are defined
@@ -92,16 +96,16 @@
cm->max_tile_height_sb = sb_rows >> cm->min_log2_tile_rows;
} else {
int max_tile_area_sb = (sb_rows * sb_cols);
- int max_tile_width_sb = 1;
+ int widest_tile_sb = 1;
cm->log2_tile_cols = tile_log2(1, cm->tile_cols);
for (i = 0; i < cm->tile_cols; i++) {
int size_sb = cm->tile_col_start_sb[i + 1] - cm->tile_col_start_sb[i];
- max_tile_width_sb = AOMMAX(max_tile_width_sb, size_sb);
+ widest_tile_sb = AOMMAX(widest_tile_sb, size_sb);
}
if (cm->min_log2_tiles) {
max_tile_area_sb >>= (cm->min_log2_tiles + 1);
}
- cm->max_tile_height_sb = AOMMAX(max_tile_area_sb / max_tile_width_sb, 1);
+ cm->max_tile_height_sb = AOMMAX(max_tile_area_sb / widest_tile_sb, 1);
}
}
diff --git a/av1/common/tile_common.h b/av1/common/tile_common.h
index 64cc2ab..fe1550d 100644
--- a/av1/common/tile_common.h
+++ b/av1/common/tile_common.h
@@ -67,10 +67,8 @@
// Define tile maximum width and area
// There is no maximum height since height is limited by area and width limits
// The minimum tile width or height is fixed at one superblock
-#define MAX_TILE_WIDTH (4096) // Max Tile width in pixels
-#define MAX_TILE_WIDTH_SB (MAX_TILE_WIDTH >> MAX_SB_SIZE_LOG2)
+#define MAX_TILE_WIDTH (4096) // Max Tile width in pixels
#define MAX_TILE_AREA (4096 * 2304) // Maximum tile area in pixels
-#define MAX_TILE_AREA_SB (MAX_TILE_AREA >> (2 * MAX_SB_SIZE_LOG2))
void av1_get_tile_limits(struct AV1Common *const cm);
void av1_calculate_tile_cols(struct AV1Common *const cm);
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index a8a4593..2ed9035 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -1482,7 +1482,7 @@
int start_sb;
for (i = 0, start_sb = 0; width_sb > 0 && i < MAX_TILE_COLS; i++) {
const int size_sb =
- 1 + rb_read_uniform(rb, AOMMIN(width_sb, MAX_TILE_WIDTH_SB));
+ 1 + rb_read_uniform(rb, AOMMIN(width_sb, cm->max_tile_width_sb));
cm->tile_col_start_sb[i] = start_sb;
start_sb += size_sb;
width_sb -= size_sb;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index d0a2e9d..1bf5b35 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2303,7 +2303,8 @@
// columns
for (i = 0; i < cm->tile_cols; i++) {
size_sb = cm->tile_col_start_sb[i + 1] - cm->tile_col_start_sb[i];
- wb_write_uniform(wb, AOMMIN(width_sb, MAX_TILE_WIDTH_SB), size_sb - 1);
+ wb_write_uniform(wb, AOMMIN(width_sb, cm->max_tile_width_sb),
+ size_sb - 1);
width_sb -= size_sb;
}
assert(width_sb == 0);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 0881479..0bc4cc9 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -846,7 +846,7 @@
cm->tile_col_start_sb[i] = start_sb;
size_sb = cpi->oxcf.tile_widths[j++];
if (j >= cpi->oxcf.tile_width_count) j = 0;
- start_sb += AOMMIN(size_sb, MAX_TILE_WIDTH_SB);
+ start_sb += AOMMIN(size_sb, cm->max_tile_width_sb);
}
cm->tile_cols = i;
cm->tile_col_start_sb[i] = sb_cols;