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