Home | History | Annotate | Download | only in encoder
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 /*!
     21 ******************************************************************************
     22 * \file hme_globals.h
     23 *
     24 * \brief
     25 *    Contains all the global declarations used by HME
     26 *
     27 * \date
     28 *    18/09/2012
     29 *
     30 * \author
     31 *    Ittiam
     32 *
     33 ******************************************************************************
     34 */
     35 
     36 #ifndef _HME_GLOBALS_H_
     37 
     38 /*****************************************************************************/
     39 /* File Includes                                                             */
     40 /*****************************************************************************/
     41 
     42 /*****************************************************************************/
     43 /* Globals                                                                   */
     44 /*****************************************************************************/
     45 
     46 /**
     47 ******************************************************************************
     48  *  @brief Converts an encode order to raster order x coord. Meant for 16x16
     49  *         CU within 64x64 or within 32x32
     50 ******************************************************************************
     51  */
     52 extern U08 gau1_encode_to_raster_x[16];
     53 
     54 /**
     55 ******************************************************************************
     56  *  @brief Converts an encode order to raster order y coord. Meant for 16x16
     57  *         CU within 64x64 or within 32x32
     58 ******************************************************************************
     59  */
     60 extern U08 gau1_encode_to_raster_y[16];
     61 
     62 /**
     63 ******************************************************************************
     64  *  @brief Given a CU id within the bigger CU (0..3), and the partition type
     65  *         currently within the small CU, we can figure out candidate
     66  *         partition types for bigger CU. E.g. IF CU id is 0, and is AMP of
     67  *         nLx2N, candidate partitions for bigger CU are nLx2N and 2Nx2N
     68 ******************************************************************************
     69  */
     70 extern PART_TYPE_T ge_part_type_to_merge_part[4][MAX_PART_TYPES][3];
     71 
     72 /**
     73 ******************************************************************************
     74  *  @brief A given partition type has 1,2 or 4 partitions, each corresponding
     75  *  to a unique partition id PART_ID_T enum type. So, this global converts
     76  *  partition type to a bitmask of corresponding partition ids.
     77 ******************************************************************************
     78  */
     79 extern S32 gai4_part_type_to_part_mask[MAX_PART_TYPES];
     80 
     81 /**
     82 ******************************************************************************
     83  *  @brief Reads out the index of function pointer to a sad_compute function
     84  *         of blk given a blk size enumeration
     85 ******************************************************************************
     86  */
     87 extern U08 gau1_blk_size_to_fp[NUM_BLK_SIZES];
     88 
     89 /**
     90 ******************************************************************************
     91  *  @brief Reads out the width of blk given a blk size enumeration
     92 ******************************************************************************
     93  */
     94 extern U08 gau1_blk_size_to_wd[NUM_BLK_SIZES];
     95 
     96 extern U08 gau1_blk_size_to_wd_shift[NUM_BLK_SIZES];
     97 
     98 /**
     99 ******************************************************************************
    100  *  @brief Reads out the height of blk given a blk size enumeration
    101 ******************************************************************************
    102  */
    103 extern U08 gau1_blk_size_to_ht[NUM_BLK_SIZES];
    104 
    105 /**
    106 ******************************************************************************
    107  *  @brief Given a minimum pt enum in a 3x3 grid, reads out the list of active
    108  *  search pts in next iteration as a bit-mask, eliminating need to search
    109  *  pts that have already been searched in this iteration.
    110 ******************************************************************************
    111  */
    112 extern S32 gai4_opt_grid_mask[NUM_GRID_PTS];
    113 
    114 /**
    115 ******************************************************************************
    116  *  @brief Given a minimum pt enum in a 3x3 grid, reads out the x offset of
    117  *  the min pt relative to center assuming step size of 1
    118 ******************************************************************************
    119  */
    120 extern S08 gai1_grid_id_to_x[NUM_GRID_PTS];
    121 
    122 /**
    123 ******************************************************************************
    124  *  @brief Given a minimum pt enum in a 3x3 grid, reads out the y offset of
    125  *  the min pt relative to center assuming step size of 1
    126 ******************************************************************************
    127 */
    128 extern S08 gai1_grid_id_to_y[NUM_GRID_PTS];
    129 
    130 /**
    131 ******************************************************************************
    132  *  @brief Lookup of the blk size enum, given a specific partition and cu size
    133 ******************************************************************************
    134 */
    135 extern BLK_SIZE_T ge_part_id_to_blk_size[NUM_CU_SIZES][TOT_NUM_PARTS];
    136 
    137 /**
    138 ******************************************************************************
    139  *  @brief For a given partition split, find number of partitions
    140 ******************************************************************************
    141 */
    142 extern U08 gau1_num_parts_in_part_type[MAX_PART_TYPES];
    143 
    144 /**
    145 ******************************************************************************
    146  *  @brief For a given partition split, returns the enumerations of specific
    147  *  partitions in raster order. E.g. for PART_2NxN, part id 0 is
    148  *  PART_ID_2NxN_T and part id 1 is PART_ID_2NxN_B
    149 ******************************************************************************
    150 */
    151 extern PART_ID_T ge_part_type_to_part_id[MAX_PART_TYPES][MAX_NUM_PARTS];
    152 
    153 /**
    154 ******************************************************************************
    155  *  @brief For a given partition id, returs the rectangular position and size
    156  *  of partition within cu relative ot cu start.
    157 ******************************************************************************
    158 */
    159 extern part_attr_t gas_part_attr_in_cu[TOT_NUM_PARTS];
    160 
    161 /**
    162 ******************************************************************************
    163  *  @brief Gives the CU type enumeration given a  blk size.
    164 ******************************************************************************
    165 */
    166 extern CU_SIZE_T ge_blk_size_to_cu_size[NUM_BLK_SIZES];
    167 
    168 /**
    169 ******************************************************************************
    170 
    171  *  @brief Given a minimum pt enum in a diamond grid, reads out the list
    172  *  of active search pts in next iteration as a bit-mask, eliminating need
    173  *  to search pts that have already been searched in this iteration.
    174 ******************************************************************************
    175  */
    176 extern S32 gai4_opt_grid_mask_diamond[5];
    177 
    178 /**
    179 ******************************************************************************
    180  *  @brief Given a minimum pt enum in a 9 point grid, reads out the list
    181  *  of active search pts in next iteration as a bit-mask, eliminating need
    182  *  to search pts that have already been searched in this iteration.
    183 ******************************************************************************
    184  */
    185 
    186 extern S32 gai4_opt_grid_mask_conventional[9];
    187 
    188 /**
    189 ******************************************************************************
    190  *  @brief Given a raster coord x, y, this aray returns the CU id in encoding
    191  *         order. Indexed as [y][x]
    192 ******************************************************************************
    193  */
    194 extern U08 gau1_cu_id_raster_to_enc[4][4];
    195 /**
    196 ******************************************************************************
    197  *  @brief Given a CU size, this array returns blk size enum
    198 ******************************************************************************
    199  */
    200 extern BLK_SIZE_T ge_cu_size_to_blk_size[NUM_CU_SIZES];
    201 
    202 /**
    203 ******************************************************************************
    204  *  @brief Given a part type, returns whether the part type is vertically
    205  *          oriented.
    206 ******************************************************************************
    207  */
    208 extern U08 gau1_is_vert_part[MAX_PART_TYPES];
    209 
    210 /**
    211 ******************************************************************************
    212  *  @brief Given a partition, returns the number of best results to consider
    213  *          for full pell refinement.
    214 ******************************************************************************
    215  */
    216 extern U08 gau1_num_best_results_PQ[TOT_NUM_PARTS];
    217 extern U08 gau1_num_best_results_HQ[TOT_NUM_PARTS];
    218 extern U08 gau1_num_best_results_MS[TOT_NUM_PARTS];
    219 extern U08 gau1_num_best_results_HS[TOT_NUM_PARTS];
    220 extern U08 gau1_num_best_results_XS[TOT_NUM_PARTS];
    221 extern U08 gau1_num_best_results_XS25[TOT_NUM_PARTS];
    222 
    223 /**
    224 ******************************************************************************
    225  *  @brief gau1_cu_tr_valid[y][x] returns the validity of a top rt candt for
    226  *         CU with raster id x, y within CTB. Valid for 16x16 CUs and above
    227 ******************************************************************************
    228  */
    229 extern U08 gau1_cu_tr_valid[4][4];
    230 /**
    231 ******************************************************************************
    232  *  @brief gau1_cu_tr_valid[y][x] returns the validity of a bot lt candt for
    233  *         CU with raster id x, y within CTB. Valid for 16x16 CUs and above
    234 ******************************************************************************
    235  */
    236 extern U08 gau1_cu_bl_valid[4][4];
    237 
    238 /**
    239 ******************************************************************************
    240  *  @brief Returns the validity of top rt candt for a given part id, will not
    241  *          be valid if tr of a part pts to a non causal neighbour like 16x8B
    242 ******************************************************************************
    243  */
    244 extern U08 gau1_partid_tr_valid[TOT_NUM_PARTS];
    245 /**
    246 ******************************************************************************
    247  *  @brief Returns the validity of bottom left cant for given part id, will
    248  *  not be valid, if bl of a part pts to a non causal neighbour like 8x16R
    249 ******************************************************************************
    250  */
    251 extern U08 gau1_partid_bl_valid[TOT_NUM_PARTS];
    252 
    253 /**
    254 ******************************************************************************
    255  *  @brief The number of partition id in the CU, e.g. PART_ID_16x8_B is 2nd
    256 ******************************************************************************
    257  */
    258 extern U08 gau1_part_id_to_part_num[TOT_NUM_PARTS];
    259 
    260 /**
    261 ******************************************************************************
    262  *  @brief Returns partition type for a given partition id, e.g.
    263  *  PART_ID_16x8_B returns PRT_TYPE_16x8
    264 ******************************************************************************
    265  */
    266 extern PART_TYPE_T ge_part_id_to_part_type[TOT_NUM_PARTS];
    267 
    268 /**
    269 ******************************************************************************
    270  *  @brief given raster id x, y of 8x8 blk in 64x64 CTB, return the enc order
    271 ******************************************************************************
    272  */
    273 extern U08 gau1_8x8_cu_id_raster_to_enc[8][8];
    274 
    275 /**
    276 ******************************************************************************
    277  *  @brief Return the bits for a given partition id which gets added to the
    278  *  cost. Although the bits are for a given partition type, we add off the
    279  *  bits per partition while computing mv cost. For example, if the bits for
    280  *  2NxN part type is 3, we add 1.5 bits for 2NxN_T and 1.5 for 2NxN_B.
    281  *  Hence this is stored in Q1 format
    282 ******************************************************************************
    283 */
    284 extern U08 gau1_bits_for_part_id_q1[TOT_NUM_PARTS];
    285 
    286 /**
    287 ******************************************************************************
    288  *  @brief Returns 1 if there are qpel points to the top and bottom of the
    289  *         current point
    290 ******************************************************************************
    291 */
    292 extern S32 gai4_2pt_qpel_interpol_possible_vert[4][4];
    293 
    294 /**
    295 ******************************************************************************
    296  *  @brief Returns 1 if there are qpel points to the left and right of the
    297  *         current point
    298 ******************************************************************************
    299 */
    300 extern S32 gai4_2pt_qpel_interpol_possible_horz[4][4];
    301 
    302 /**
    303 ******************************************************************************
    304  *  @brief For a given partition split, num bits to encode the partition type
    305  *         and split cu,tu bits; assuming one bin equal to one bit for now
    306 ******************************************************************************
    307 */
    308 extern U08 gau1_num_bits_for_part_type[MAX_PART_TYPES];
    309 
    310 /**
    311 ******************************************************************************
    312  * @brief Used exclusively in the Intrinsics version of the function
    313  *       'hme_combine_4x4_sads_and_compute_cost_high_speed' instead
    314  *       of calling get_range()
    315 ******************************************************************************
    316  */
    317 extern S16 gi2_mvy_range[MAX_MVY_SUPPORTED_IN_COARSE_LAYER + 1][8];
    318 
    319 /**
    320 ******************************************************************************
    321  * @brief Used exclusively in the Intrinsics version of the function
    322  *       'hme_combine_4x4_sads_and_compute_cost_high_speed' instead
    323  *       of calling get_range()
    324 ******************************************************************************
    325  */
    326 extern S16 gi2_mvx_range[MAX_MVX_SUPPORTED_IN_COARSE_LAYER * 2 + 1][8];
    327 
    328 extern S32 gai4_select_qpel_function_vert[4][16];
    329 
    330 extern S32 gai4_select_qpel_function_horz[4][16];
    331 
    332 extern S32 gai4_partition_area[TOT_NUM_PARTS];
    333 
    334 extern const U08 gau1_search_cand_priority_in_l1_and_l2_me[2][NUM_SEARCH_CAND_TYPES];
    335 
    336 /* 12 cases are -  */
    337 /* case  0 - P picture, num_refs=1, 4x4 in L1ME = 0 */
    338 /* case  1 - P picture, num_refs=1, 4x4 in L1ME = 1 */
    339 /* case  2 - P picture, num_refs=2, 4x4 in L1ME = 0 */
    340 /* case  3 - P picture, num_refs=2, 4x4 in L1ME = 1 */
    341 /* case  4 - P picture, num_refs=3, 4x4 in L1ME = 0 */
    342 /* case  5 - P picture, num_refs=3, 4x4 in L1ME = 1 */
    343 /* case  6 - P picture, num_refs=3, 4x4 in L1ME = 0 */
    344 /* case  7 - P picture, num_refs=3, 4x4 in L1ME = 1 */
    345 /* case  8 - B picture, num_refs=1, 4x4 in L1ME = 0 */
    346 /* case  9 - B picture, num_refs=1, 4x4 in L1ME = 1 */
    347 /* case 10 - B picture, num_refs=2, 4x4 in L1ME = 0 */
    348 /* case 11 - B picture, num_refs=2, 4x4 in L1ME = 1 */
    349 extern const U08 gau1_search_cand_priority_in_l0_me[12][NUM_SEARCH_CAND_TYPES];
    350 
    351 extern const SEARCH_CANDIDATE_TYPE_T
    352     gae_search_cand_priority_to_search_cand_type_map_in_l0_me[12][NUM_SEARCH_CAND_TYPES];
    353 
    354 extern const U08 gau1_max_num_search_cands_in_l0_me[12];
    355 
    356 extern const SEARCH_CAND_LOCATIONS_T gae_search_cand_type_to_location_map[NUM_SEARCH_CAND_TYPES];
    357 
    358 extern const S08 gai1_search_cand_type_to_result_id_map[NUM_SEARCH_CAND_TYPES];
    359 
    360 extern const U08 gau1_search_cand_type_to_spatiality_map[NUM_SEARCH_CAND_TYPES];
    361 
    362 extern const S32 gai4_search_cand_location_to_x_offset_map[NUM_SEARCH_CAND_LOCATIONS];
    363 
    364 extern const S32 gai4_search_cand_location_to_y_offset_map[NUM_SEARCH_CAND_LOCATIONS];
    365 
    366 /**
    367 ******************************************************************************
    368  * @brief Used exclusively in the Intrinsics version of the function
    369  *       'hme_combine_4x4_sads_and_compute_cost_high_quality' instead
    370  *       of calling get_range()
    371 ******************************************************************************
    372  */
    373 extern S16 gi2_mvx_range_high_quality[MAX_MVX_SUPPORTED_IN_COARSE_LAYER * 2 + 1][8];
    374 
    375 extern const S16 gai2_mvx_range_mapping[8193][8];
    376 
    377 extern const S16 gai2_mvy_range_mapping[4097][8];
    378 
    379 extern const S16 gai2_set_best_cost_max[8][8];
    380 
    381 extern const S08 gai1_mv_adjust[8][2];
    382 
    383 extern const S08 gai1_mv_offsets_from_center_in_rect_grid[NUM_POINTS_IN_RECTANGULAR_GRID][2];
    384 
    385 #endif /* #ifndef _HME_GLOBALS_H_*/
    386