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_common_data.h"
     12 #include "vpx_dsp/vpx_dsp_common.h"
     13 
     14 // Log 2 conversion lookup tables for block width and height
     15 const uint8_t b_width_log2_lookup[BLOCK_SIZES] = { 0, 0, 1, 1, 1, 2, 2,
     16                                                    2, 3, 3, 3, 4, 4 };
     17 const uint8_t b_height_log2_lookup[BLOCK_SIZES] = { 0, 1, 0, 1, 2, 1, 2,
     18                                                     3, 2, 3, 4, 3, 4 };
     19 const uint8_t num_4x4_blocks_wide_lookup[BLOCK_SIZES] = { 1, 1, 2, 2, 2,  4, 4,
     20                                                           4, 8, 8, 8, 16, 16 };
     21 const uint8_t num_4x4_blocks_high_lookup[BLOCK_SIZES] = { 1, 2, 1, 2,  4, 2, 4,
     22                                                           8, 4, 8, 16, 8, 16 };
     23 // Log 2 conversion lookup tables for modeinfo width and height
     24 const uint8_t mi_width_log2_lookup[BLOCK_SIZES] = { 0, 0, 0, 0, 0, 1, 1,
     25                                                     1, 2, 2, 2, 3, 3 };
     26 const uint8_t num_8x8_blocks_wide_lookup[BLOCK_SIZES] = { 1, 1, 1, 1, 1, 2, 2,
     27                                                           2, 4, 4, 4, 8, 8 };
     28 const uint8_t num_8x8_blocks_high_lookup[BLOCK_SIZES] = { 1, 1, 1, 1, 2, 1, 2,
     29                                                           4, 2, 4, 8, 4, 8 };
     30 
     31 // VPXMIN(3, VPXMIN(b_width_log2(bsize), b_height_log2(bsize)))
     32 const uint8_t size_group_lookup[BLOCK_SIZES] = { 0, 0, 0, 1, 1, 1, 2,
     33                                                  2, 2, 3, 3, 3, 3 };
     34 
     35 const uint8_t num_pels_log2_lookup[BLOCK_SIZES] = { 4, 5, 5,  6,  7,  7, 8,
     36                                                     9, 9, 10, 11, 11, 12 };
     37 
     38 const PARTITION_TYPE partition_lookup[][BLOCK_SIZES] = {
     39   { // 4X4
     40     // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
     41     PARTITION_NONE, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     42     PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     43     PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     44     PARTITION_INVALID },
     45   { // 8X8
     46     // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
     47     PARTITION_SPLIT, PARTITION_VERT, PARTITION_HORZ, PARTITION_NONE,
     48     PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     49     PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     50     PARTITION_INVALID },
     51   { // 16X16
     52     // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
     53     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
     54     PARTITION_VERT, PARTITION_HORZ, PARTITION_NONE, PARTITION_INVALID,
     55     PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID, PARTITION_INVALID,
     56     PARTITION_INVALID },
     57   { // 32X32
     58     // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
     59     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
     60     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_VERT,
     61     PARTITION_HORZ, PARTITION_NONE, PARTITION_INVALID, PARTITION_INVALID,
     62     PARTITION_INVALID },
     63   { // 64X64
     64     // 4X4, 4X8,8X4,8X8,8X16,16X8,16X16,16X32,32X16,32X32,32X64,64X32,64X64
     65     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
     66     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_SPLIT,
     67     PARTITION_SPLIT, PARTITION_SPLIT, PARTITION_VERT, PARTITION_HORZ,
     68     PARTITION_NONE }
     69 };
     70 
     71 const BLOCK_SIZE subsize_lookup[PARTITION_TYPES][BLOCK_SIZES] = {
     72   { // PARTITION_NONE
     73     BLOCK_4X4, BLOCK_4X8, BLOCK_8X4, BLOCK_8X8, BLOCK_8X16, BLOCK_16X8,
     74     BLOCK_16X16, BLOCK_16X32, BLOCK_32X16, BLOCK_32X32, BLOCK_32X64,
     75     BLOCK_64X32, BLOCK_64X64 },
     76   { // PARTITION_HORZ
     77     BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, BLOCK_8X4, BLOCK_INVALID,
     78     BLOCK_INVALID, BLOCK_16X8, BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X16,
     79     BLOCK_INVALID, BLOCK_INVALID, BLOCK_64X32 },
     80   { // PARTITION_VERT
     81     BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X8, BLOCK_INVALID,
     82     BLOCK_INVALID, BLOCK_8X16, BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X32,
     83     BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X64 },
     84   { // PARTITION_SPLIT
     85     BLOCK_INVALID, BLOCK_INVALID, BLOCK_INVALID, BLOCK_4X4, BLOCK_INVALID,
     86     BLOCK_INVALID, BLOCK_8X8, BLOCK_INVALID, BLOCK_INVALID, BLOCK_16X16,
     87     BLOCK_INVALID, BLOCK_INVALID, BLOCK_32X32 }
     88 };
     89 
     90 const TX_SIZE max_txsize_lookup[BLOCK_SIZES] = {
     91   TX_4X4,   TX_4X4,   TX_4X4,   TX_8X8,   TX_8X8,   TX_8X8,  TX_16X16,
     92   TX_16X16, TX_16X16, TX_32X32, TX_32X32, TX_32X32, TX_32X32
     93 };
     94 
     95 const BLOCK_SIZE txsize_to_bsize[TX_SIZES] = {
     96   BLOCK_4X4,    // TX_4X4
     97   BLOCK_8X8,    // TX_8X8
     98   BLOCK_16X16,  // TX_16X16
     99   BLOCK_32X32,  // TX_32X32
    100 };
    101 
    102 const TX_SIZE tx_mode_to_biggest_tx_size[TX_MODES] = {
    103   TX_4X4,    // ONLY_4X4
    104   TX_8X8,    // ALLOW_8X8
    105   TX_16X16,  // ALLOW_16X16
    106   TX_32X32,  // ALLOW_32X32
    107   TX_32X32,  // TX_MODE_SELECT
    108 };
    109 
    110 const BLOCK_SIZE ss_size_lookup[BLOCK_SIZES][2][2] = {
    111   //  ss_x == 0    ss_x == 0        ss_x == 1      ss_x == 1
    112   //  ss_y == 0    ss_y == 1        ss_y == 0      ss_y == 1
    113   { { BLOCK_4X4, BLOCK_INVALID }, { BLOCK_INVALID, BLOCK_INVALID } },
    114   { { BLOCK_4X8, BLOCK_4X4 }, { BLOCK_INVALID, BLOCK_INVALID } },
    115   { { BLOCK_8X4, BLOCK_INVALID }, { BLOCK_4X4, BLOCK_INVALID } },
    116   { { BLOCK_8X8, BLOCK_8X4 }, { BLOCK_4X8, BLOCK_4X4 } },
    117   { { BLOCK_8X16, BLOCK_8X8 }, { BLOCK_INVALID, BLOCK_4X8 } },
    118   { { BLOCK_16X8, BLOCK_INVALID }, { BLOCK_8X8, BLOCK_8X4 } },
    119   { { BLOCK_16X16, BLOCK_16X8 }, { BLOCK_8X16, BLOCK_8X8 } },
    120   { { BLOCK_16X32, BLOCK_16X16 }, { BLOCK_INVALID, BLOCK_8X16 } },
    121   { { BLOCK_32X16, BLOCK_INVALID }, { BLOCK_16X16, BLOCK_16X8 } },
    122   { { BLOCK_32X32, BLOCK_32X16 }, { BLOCK_16X32, BLOCK_16X16 } },
    123   { { BLOCK_32X64, BLOCK_32X32 }, { BLOCK_INVALID, BLOCK_16X32 } },
    124   { { BLOCK_64X32, BLOCK_INVALID }, { BLOCK_32X32, BLOCK_32X16 } },
    125   { { BLOCK_64X64, BLOCK_64X32 }, { BLOCK_32X64, BLOCK_32X32 } },
    126 };
    127 
    128 const TX_SIZE uv_txsize_lookup[BLOCK_SIZES][TX_SIZES][2][2] = {
    129   //  ss_x == 0    ss_x == 0        ss_x == 1      ss_x == 1
    130   //  ss_y == 0    ss_y == 1        ss_y == 0      ss_y == 1
    131   {
    132       // BLOCK_4X4
    133       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    134       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    135       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    136       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    137   },
    138   {
    139       // BLOCK_4X8
    140       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    141       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    142       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    143       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    144   },
    145   {
    146       // BLOCK_8X4
    147       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    148       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    149       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    150       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    151   },
    152   {
    153       // BLOCK_8X8
    154       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    155       { { TX_8X8, TX_4X4 }, { TX_4X4, TX_4X4 } },
    156       { { TX_8X8, TX_4X4 }, { TX_4X4, TX_4X4 } },
    157       { { TX_8X8, TX_4X4 }, { TX_4X4, TX_4X4 } },
    158   },
    159   {
    160       // BLOCK_8X16
    161       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    162       { { TX_8X8, TX_8X8 }, { TX_4X4, TX_4X4 } },
    163       { { TX_8X8, TX_8X8 }, { TX_4X4, TX_4X4 } },
    164       { { TX_8X8, TX_8X8 }, { TX_4X4, TX_4X4 } },
    165   },
    166   {
    167       // BLOCK_16X8
    168       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    169       { { TX_8X8, TX_4X4 }, { TX_8X8, TX_4X4 } },
    170       { { TX_8X8, TX_4X4 }, { TX_8X8, TX_8X8 } },
    171       { { TX_8X8, TX_4X4 }, { TX_8X8, TX_8X8 } },
    172   },
    173   {
    174       // BLOCK_16X16
    175       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    176       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    177       { { TX_16X16, TX_8X8 }, { TX_8X8, TX_8X8 } },
    178       { { TX_16X16, TX_8X8 }, { TX_8X8, TX_8X8 } },
    179   },
    180   {
    181       // BLOCK_16X32
    182       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    183       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    184       { { TX_16X16, TX_16X16 }, { TX_8X8, TX_8X8 } },
    185       { { TX_16X16, TX_16X16 }, { TX_8X8, TX_8X8 } },
    186   },
    187   {
    188       // BLOCK_32X16
    189       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    190       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    191       { { TX_16X16, TX_8X8 }, { TX_16X16, TX_8X8 } },
    192       { { TX_16X16, TX_8X8 }, { TX_16X16, TX_8X8 } },
    193   },
    194   {
    195       // BLOCK_32X32
    196       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    197       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    198       { { TX_16X16, TX_16X16 }, { TX_16X16, TX_16X16 } },
    199       { { TX_32X32, TX_16X16 }, { TX_16X16, TX_16X16 } },
    200   },
    201   {
    202       // BLOCK_32X64
    203       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    204       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    205       { { TX_16X16, TX_16X16 }, { TX_16X16, TX_16X16 } },
    206       { { TX_32X32, TX_32X32 }, { TX_16X16, TX_16X16 } },
    207   },
    208   {
    209       // BLOCK_64X32
    210       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    211       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    212       { { TX_16X16, TX_16X16 }, { TX_16X16, TX_16X16 } },
    213       { { TX_32X32, TX_16X16 }, { TX_32X32, TX_16X16 } },
    214   },
    215   {
    216       // BLOCK_64X64
    217       { { TX_4X4, TX_4X4 }, { TX_4X4, TX_4X4 } },
    218       { { TX_8X8, TX_8X8 }, { TX_8X8, TX_8X8 } },
    219       { { TX_16X16, TX_16X16 }, { TX_16X16, TX_16X16 } },
    220       { { TX_32X32, TX_32X32 }, { TX_32X32, TX_32X32 } },
    221   },
    222 };
    223 
    224 // Generates 4 bit field in which each bit set to 1 represents
    225 // a blocksize partition  1111 means we split 64x64, 32x32, 16x16
    226 // and 8x8.  1000 means we just split the 64x64 to 32x32
    227 const struct {
    228   PARTITION_CONTEXT above;
    229   PARTITION_CONTEXT left;
    230 } partition_context_lookup[BLOCK_SIZES] = {
    231   { 15, 15 },  // 4X4   - {0b1111, 0b1111}
    232   { 15, 14 },  // 4X8   - {0b1111, 0b1110}
    233   { 14, 15 },  // 8X4   - {0b1110, 0b1111}
    234   { 14, 14 },  // 8X8   - {0b1110, 0b1110}
    235   { 14, 12 },  // 8X16  - {0b1110, 0b1100}
    236   { 12, 14 },  // 16X8  - {0b1100, 0b1110}
    237   { 12, 12 },  // 16X16 - {0b1100, 0b1100}
    238   { 12, 8 },   // 16X32 - {0b1100, 0b1000}
    239   { 8, 12 },   // 32X16 - {0b1000, 0b1100}
    240   { 8, 8 },    // 32X32 - {0b1000, 0b1000}
    241   { 8, 0 },    // 32X64 - {0b1000, 0b0000}
    242   { 0, 8 },    // 64X32 - {0b0000, 0b1000}
    243   { 0, 0 },    // 64X64 - {0b0000, 0b0000}
    244 };
    245 
    246 #if CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
    247 const uint8_t need_top_left[INTRA_MODES] = {
    248   0,  // DC_PRED
    249   0,  // V_PRED
    250   0,  // H_PRED
    251   0,  // D45_PRED
    252   1,  // D135_PRED
    253   1,  // D117_PRED
    254   1,  // D153_PRED
    255   0,  // D207_PRED
    256   0,  // D63_PRED
    257   1,  // TM_PRED
    258 };
    259 #endif  // CONFIG_BETTER_HW_COMPATIBILITY && CONFIG_VP9_HIGHBITDEPTH
    260