summaryrefslogtreecommitdiff
path: root/vp9/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/decoder')
-rw-r--r--vp9/decoder/vp9_decodframe.c43
1 files changed, 16 insertions, 27 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 3324186ef..b8e867a0e 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -31,6 +31,7 @@
#include "vp9/decoder/vp9_dboolhuff.h"
#include "vp9/common/vp9_seg_common.h"
+#include "vp9/common/vp9_tile_common.h"
#include "vp9_rtcd.h"
#include <assert.h>
@@ -1769,15 +1770,18 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
/* tile info */
{
- int log2_tile_cols;
const unsigned char *data_ptr = data + first_partition_length_in_bytes;
- int tile, mb_start, mb_end;
+ int tile, delta_log2_tiles;
- log2_tile_cols = vp9_read_bit(&header_bc);
- if (log2_tile_cols) {
- log2_tile_cols += vp9_read_bit(&header_bc);
+ vp9_get_tile_n_bits(pc, &pc->log2_tile_columns, &delta_log2_tiles);
+ while (delta_log2_tiles--) {
+ if (vp9_read_bit(&header_bc)) {
+ pc->log2_tile_columns++;
+ } else {
+ break;
+ }
}
- pc->tile_columns = 1 << log2_tile_cols;
+ pc->tile_columns = 1 << pc->log2_tile_columns;
vpx_memset(pc->above_context, 0,
sizeof(ENTROPY_CONTEXT_PLANES) * pc->mb_cols);
@@ -1793,39 +1797,25 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
data_ptr2[tile - 1] += 4;
data_ptr2[tile] = data_ptr2[tile - 1] + size;
}
- for (mb_end = pc->mb_cols, tile = pc->tile_columns - 1;
- tile >= 0; tile--) {
- // calculate end of tile column
- const int sb_cols = (pc->mb_cols + 3) >> 2;
- const int sb_start = (sb_cols * tile) >> log2_tile_cols;
- mb_start = ((sb_start << 2) > pc->mb_cols) ?
- pc->mb_cols : (sb_start << 2);
-
+ for (tile = pc->tile_columns - 1; tile >= 0; tile--) {
pc->cur_tile_idx = tile;
- pc->cur_tile_mb_col_start = mb_start;
- pc->cur_tile_mb_col_end = mb_end;
-
+ vp9_get_tile_offsets(pc, &pc->cur_tile_mb_col_start,
+ &pc->cur_tile_mb_col_end);
setup_token_decoder(pbi, data_ptr2[tile], &residual_bc);
/* Decode a row of superblocks */
for (mb_row = 0; mb_row < pc->mb_rows; mb_row += 4) {
decode_sb_row(pbi, pc, mb_row, xd, &residual_bc);
}
- mb_end = mb_start;
if (tile == pc->tile_columns - 1)
bc_bak = residual_bc;
}
residual_bc = bc_bak;
} else {
- for (mb_start = 0, tile = 0; tile < pc->tile_columns; tile++) {
- // calculate end of tile column
- const int sb_cols = (pc->mb_cols + 3) >> 2;
- const int sb_end = (sb_cols * (tile + 1)) >> log2_tile_cols;
- mb_end = ((sb_end << 2) > pc->mb_cols) ? pc->mb_cols : (sb_end << 2);
-
+ for (tile = 0; tile < pc->tile_columns; tile++) {
pc->cur_tile_idx = tile;
- pc->cur_tile_mb_col_start = mb_start;
- pc->cur_tile_mb_col_end = mb_end;
+ vp9_get_tile_offsets(pc, &pc->cur_tile_mb_col_start,
+ &pc->cur_tile_mb_col_end);
if (tile < pc->tile_columns - 1)
setup_token_decoder(pbi, data_ptr + 4, &residual_bc);
@@ -1836,7 +1826,6 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
for (mb_row = 0; mb_row < pc->mb_rows; mb_row += 4) {
decode_sb_row(pbi, pc, mb_row, xd, &residual_bc);
}
- mb_start = mb_end;
if (tile < pc->tile_columns - 1) {
int size = data_ptr[0] + (data_ptr[1] << 8) + (data_ptr[2] << 16) +
(data_ptr[3] << 24);