[ext-tile] Fix tile size derivation cherry-pick of 9662189fc1567a513220cc2ba22780a1f073eb3b from master Introduce new function av1_get_uniform_tile_size Handle both values of uniform_tile_spacing_flag = 0 Avoid using cm->tile_with and cm->tile_height in several places BUG=aomedia:2265 Change-Id: I3561ef671337c4bdab75e589d602e277ea7f3d3e
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c index 0ce82ff..54525f9 100644 --- a/av1/av1_dx_iface.c +++ b/av1/av1_dx_iface.c
@@ -683,8 +683,10 @@ const int num_planes = av1_num_planes(cm); if (pbi->ext_tile_debug && cm->single_tile_decoding && pbi->dec_tile_row >= 0) { + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); const int tile_row = AOMMIN(pbi->dec_tile_row, cm->tile_rows - 1); - const int mi_row = tile_row * cm->tile_height; + const int mi_row = tile_row * tile_height; const int ssy = ctx->img.y_chroma_shift; int plane; ctx->img.planes[0] += mi_row * MI_SIZE * ctx->img.stride[0]; @@ -694,14 +696,15 @@ mi_row * (MI_SIZE >> ssy) * ctx->img.stride[plane]; } } - ctx->img.d_h = - AOMMIN(cm->tile_height, cm->mi_rows - mi_row) * MI_SIZE; + ctx->img.d_h = AOMMIN(tile_height, cm->mi_rows - mi_row) * MI_SIZE; } if (pbi->ext_tile_debug && cm->single_tile_decoding && pbi->dec_tile_col >= 0) { + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); const int tile_col = AOMMIN(pbi->dec_tile_col, cm->tile_cols - 1); - const int mi_col = tile_col * cm->tile_width; + const int mi_col = tile_col * tile_width; const int ssx = ctx->img.x_chroma_shift; const int is_hbd = (ctx->img.fmt & AOM_IMG_FMT_HIGHBITDEPTH) ? 1 : 0; @@ -713,8 +716,7 @@ mi_col * (MI_SIZE >> ssx) * (1 + is_hbd); } } - ctx->img.d_w = - AOMMIN(cm->tile_width, cm->mi_cols - mi_col) * MI_SIZE; + ctx->img.d_w = AOMMIN(tile_width, cm->mi_cols - mi_col) * MI_SIZE; } ctx->img.fb_priv = frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv; @@ -1078,8 +1080,9 @@ FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1; const AV1_COMMON *const cm = &frame_worker_data->pbi->common; - *tile_size = - ((cm->tile_width * MI_SIZE) << 16) + cm->tile_height * MI_SIZE; + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); + *tile_size = ((tile_width * MI_SIZE) << 16) + tile_height * MI_SIZE; return AOM_CODEC_OK; } else { return AOM_CODEC_ERROR;
diff --git a/av1/common/tile_common.c b/av1/common/tile_common.c index 9a43ab2..1c70281 100644 --- a/av1/common/tile_common.c +++ b/av1/common/tile_common.c
@@ -189,3 +189,26 @@ return r; } + +void av1_get_uniform_tile_size(const AV1_COMMON *cm, int *w, int *h) { + if (cm->uniform_tile_spacing_flag) { + *w = cm->tile_width; + *h = cm->tile_height; + } else { + for (int i = 0; i < cm->tile_cols; ++i) { + const int tile_width_sb = + cm->tile_col_start_sb[i + 1] - cm->tile_col_start_sb[i]; + const int tile_w = tile_width_sb * cm->seq_params.mib_size; + assert(i == 0 || tile_w == *w); // ensure all tiles have same dimension + *w = tile_w; + } + + for (int i = 0; i < cm->tile_rows; ++i) { + const int tile_height_sb = + cm->tile_row_start_sb[i + 1] - cm->tile_row_start_sb[i]; + const int tile_h = tile_height_sb * cm->seq_params.mib_size; + assert(i == 0 || tile_h == *h); // ensure all tiles have same dimension + *h = tile_h; + } + } +}
diff --git a/av1/common/tile_common.h b/av1/common/tile_common.h index be037fb..60e4a64 100644 --- a/av1/common/tile_common.h +++ b/av1/common/tile_common.h
@@ -58,6 +58,7 @@ #define MAX_TILE_WIDTH (4096) // Max Tile width in pixels #define MAX_TILE_AREA (4096 * 2304) // Maximum tile area in pixels +void av1_get_uniform_tile_size(const struct AV1Common *cm, int *w, int *h); void av1_get_tile_limits(struct AV1Common *const cm); void av1_calculate_tile_cols(struct AV1Common *const cm); void av1_calculate_tile_rows(struct AV1Common *const cm);
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index fe9d054..16e561f 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -2382,9 +2382,10 @@ const int tile_col_size_bytes = pbi->tile_col_size_bytes; const int tile_size_bytes = pbi->tile_size_bytes; + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); const int tile_copy_mode = - ((AOMMAX(cm->tile_width, cm->tile_height) << MI_SIZE_LOG2) <= 256) ? 1 - : 0; + ((AOMMAX(tile_width, tile_height) << MI_SIZE_LOG2) <= 256) ? 1 : 0; // Read tile column sizes for all columns (we need the last tile buffer) for (int c = 0; c < tile_cols; ++c) { const int is_last = c == tile_cols - 1;
diff --git a/av1/decoder/obu.c b/av1/decoder/obu.c index baec66b..591ec48 100644 --- a/av1/decoder/obu.c +++ b/av1/decoder/obu.c
@@ -415,8 +415,10 @@ // image format 4:2:0, the output frame of U plane and V plane is 1/4 of the // output frame. AV1_COMMON *const cm = &pbi->common; - const int tile_width_in_pixels = cm->tile_width * MI_SIZE; - const int tile_height_in_pixels = cm->tile_height * MI_SIZE; + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); + const int tile_width_in_pixels = tile_width * MI_SIZE; + const int tile_height_in_pixels = tile_height * MI_SIZE; const int output_frame_width = (pbi->output_frame_width_in_tiles_minus_1 + 1) * tile_width_in_pixels; const int output_frame_height = @@ -466,8 +468,10 @@ static void copy_decoded_tile_to_tile_list_buffer(AV1Decoder *pbi, int tile_idx) { AV1_COMMON *const cm = &pbi->common; - const int tile_width_in_pixels = cm->tile_width * MI_SIZE; - const int tile_height_in_pixels = cm->tile_height * MI_SIZE; + int tile_width, tile_height; + av1_get_uniform_tile_size(cm, &tile_width, &tile_height); + const int tile_width_in_pixels = tile_width * MI_SIZE; + const int tile_height_in_pixels = tile_height * MI_SIZE; const int ssy = cm->subsampling_y; const int ssx = cm->subsampling_x; const int num_planes = av1_num_planes(cm);