1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_tile_common.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_onyxc_int.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/vpx_dsp_common.h"
14*fb1b10abSAndroid Build Coastguard Worker
15*fb1b10abSAndroid Build Coastguard Worker #define MIN_TILE_WIDTH_B64 4
16*fb1b10abSAndroid Build Coastguard Worker #define MAX_TILE_WIDTH_B64 64
17*fb1b10abSAndroid Build Coastguard Worker
get_tile_offset(int idx,int mis,int log2)18*fb1b10abSAndroid Build Coastguard Worker static int get_tile_offset(int idx, int mis, int log2) {
19*fb1b10abSAndroid Build Coastguard Worker const int sb_cols = mi_cols_aligned_to_sb(mis) >> MI_BLOCK_SIZE_LOG2;
20*fb1b10abSAndroid Build Coastguard Worker const int offset = ((idx * sb_cols) >> log2) << MI_BLOCK_SIZE_LOG2;
21*fb1b10abSAndroid Build Coastguard Worker return VPXMIN(offset, mis);
22*fb1b10abSAndroid Build Coastguard Worker }
23*fb1b10abSAndroid Build Coastguard Worker
vp9_tile_set_row(TileInfo * tile,const VP9_COMMON * cm,int row)24*fb1b10abSAndroid Build Coastguard Worker void vp9_tile_set_row(TileInfo *tile, const VP9_COMMON *cm, int row) {
25*fb1b10abSAndroid Build Coastguard Worker tile->mi_row_start = get_tile_offset(row, cm->mi_rows, cm->log2_tile_rows);
26*fb1b10abSAndroid Build Coastguard Worker tile->mi_row_end = get_tile_offset(row + 1, cm->mi_rows, cm->log2_tile_rows);
27*fb1b10abSAndroid Build Coastguard Worker }
28*fb1b10abSAndroid Build Coastguard Worker
vp9_tile_set_col(TileInfo * tile,const VP9_COMMON * cm,int col)29*fb1b10abSAndroid Build Coastguard Worker void vp9_tile_set_col(TileInfo *tile, const VP9_COMMON *cm, int col) {
30*fb1b10abSAndroid Build Coastguard Worker tile->mi_col_start = get_tile_offset(col, cm->mi_cols, cm->log2_tile_cols);
31*fb1b10abSAndroid Build Coastguard Worker tile->mi_col_end = get_tile_offset(col + 1, cm->mi_cols, cm->log2_tile_cols);
32*fb1b10abSAndroid Build Coastguard Worker }
33*fb1b10abSAndroid Build Coastguard Worker
vp9_tile_init(TileInfo * tile,const VP9_COMMON * cm,int row,int col)34*fb1b10abSAndroid Build Coastguard Worker void vp9_tile_init(TileInfo *tile, const VP9_COMMON *cm, int row, int col) {
35*fb1b10abSAndroid Build Coastguard Worker vp9_tile_set_row(tile, cm, row);
36*fb1b10abSAndroid Build Coastguard Worker vp9_tile_set_col(tile, cm, col);
37*fb1b10abSAndroid Build Coastguard Worker }
38*fb1b10abSAndroid Build Coastguard Worker
get_min_log2_tile_cols(const int sb64_cols)39*fb1b10abSAndroid Build Coastguard Worker static int get_min_log2_tile_cols(const int sb64_cols) {
40*fb1b10abSAndroid Build Coastguard Worker int min_log2 = 0;
41*fb1b10abSAndroid Build Coastguard Worker while ((MAX_TILE_WIDTH_B64 << min_log2) < sb64_cols) ++min_log2;
42*fb1b10abSAndroid Build Coastguard Worker return min_log2;
43*fb1b10abSAndroid Build Coastguard Worker }
44*fb1b10abSAndroid Build Coastguard Worker
get_max_log2_tile_cols(const int sb64_cols)45*fb1b10abSAndroid Build Coastguard Worker static int get_max_log2_tile_cols(const int sb64_cols) {
46*fb1b10abSAndroid Build Coastguard Worker int max_log2 = 1;
47*fb1b10abSAndroid Build Coastguard Worker while ((sb64_cols >> max_log2) >= MIN_TILE_WIDTH_B64) ++max_log2;
48*fb1b10abSAndroid Build Coastguard Worker return max_log2 - 1;
49*fb1b10abSAndroid Build Coastguard Worker }
50*fb1b10abSAndroid Build Coastguard Worker
vp9_get_tile_n_bits(int mi_cols,int * min_log2_tile_cols,int * max_log2_tile_cols)51*fb1b10abSAndroid Build Coastguard Worker void vp9_get_tile_n_bits(int mi_cols, int *min_log2_tile_cols,
52*fb1b10abSAndroid Build Coastguard Worker int *max_log2_tile_cols) {
53*fb1b10abSAndroid Build Coastguard Worker const int sb64_cols = mi_cols_aligned_to_sb(mi_cols) >> MI_BLOCK_SIZE_LOG2;
54*fb1b10abSAndroid Build Coastguard Worker *min_log2_tile_cols = get_min_log2_tile_cols(sb64_cols);
55*fb1b10abSAndroid Build Coastguard Worker *max_log2_tile_cols = get_max_log2_tile_cols(sb64_cols);
56*fb1b10abSAndroid Build Coastguard Worker assert(*min_log2_tile_cols <= *max_log2_tile_cols);
57*fb1b10abSAndroid Build Coastguard Worker }
58