1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 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 23 * ih264_trans_data.c 24 * 25 * @brief 26 * Contains definition of global variables for H264 encoder 27 * 28 * @author 29 * Ittiam 30 * 31 * @remarks 32 * 33 ******************************************************************************* 34 */ 35 36 #include "ih264_typedefs.h" 37 #include "ih264_trans_data.h" 38 39 /*****************************************************************************/ 40 /* Extern global definitions */ 41 /*****************************************************************************/ 42 43 /* 44 * Since we don't have a division operation in neon 45 * we will multiply by LCM of 16,6,10 and scale accordingly 46 * so care that to get the actual transform you need to divide by LCM 47 * LCM = 240 48 */ 49 50 const UWORD16 g_scal_coff_h264_4x4[16] ={ 51 15,40,40,40, 52 40,24,40,24, 53 15,40,40,15, 54 40,24,40,24}; 55 56 57 58 const UWORD16 g_scal_coff_h264_8x8[16]= 59 { 60 16, 15, 20, 15, 61 15, 14, 19, 14, 62 20, 19, 25, 19, 63 15, 14, 19, 14 64 }; 65 /* 66 * The scaling is by an 8x8 matrix, but due its 4x4 symmetry we can use 67 * a 4x4 matrix for scaling 68 * now since divide is to be avoided, we will compute 1/ values and scale it up 69 * to preserve information since our data is max 10 bit +1 sign bit we can shift a maximum of 21 bits up 70 * hence multiply the matrix as such 71 {16.000 15.059 20.227 15.059 72 15.059 14.173 19.051 14.173 73 20.227 19.051 25.600 19.051 74 15.059 14.173 19.051 14.173}; 75 {512, 544, 405, 544, 76 544, 578, 430, 578, 77 405, 430, 320, 430, 78 544, 578, 430, 578};*/ 79 80 81 /** 82 ****************************************************************************** 83 * @brief Scale Table for quantizing 4x4 subblock. To quantize a given 4x4 DCT 84 * transformed block, the coefficient at index location (i,j) is scaled by one of 85 * the constants in this table and right shift the result by (QP_BITS_h264_4x4 + 86 * floor(qp/6)), here qp is the quantization parameter used to quantize the mb. 87 * 88 * input : qp%6, index location (i,j) 89 * output : scale constant. 90 * 91 * @remarks 16 constants for each index position of the subblock and 6 for each 92 * qp%6 in the range 0-5 inclusive. 93 ****************************************************************************** 94 */ 95 const UWORD16 gu2_quant_scale_matrix_4x4[96] = 96 { 97 13107, 8066, 13107, 8066, 98 8066, 5243, 8066, 5243, 99 13107, 8066, 13107, 8066, 100 8066, 5243, 8066, 5243, 101 102 11916, 7490, 11916, 7490, 103 7490, 4660, 7490, 4660, 104 11916, 7490, 11916, 7490, 105 7490, 4660, 7490, 4660, 106 107 10082, 6554, 10082, 6554, 108 6554, 4194, 6554, 4194, 109 10082, 6554, 10082, 6554, 110 6554, 4194, 6554, 4194, 111 112 9362, 5825, 9362, 5825, 113 5825, 3647, 5825, 3647, 114 9362, 5825, 9362, 5825, 115 5825, 3647, 5825, 3647, 116 117 8192, 5243, 8192, 5243, 118 5243, 3355, 5243, 3355, 119 8192, 5243, 8192, 5243, 120 5243, 3355, 5243, 3355, 121 122 7282, 4559, 7282, 4559, 123 4559, 2893, 4559, 2893, 124 7282, 4559, 7282, 4559, 125 4559, 2893, 4559, 2893, 126 127 }; 128 129 /** 130 ****************************************************************************** 131 * @brief Round Factor for quantizing subblock. While quantizing a given 4x4 DCT 132 * transformed block, the coefficient at index location (i,j) is scaled by one of 133 * the constants in the table gu2_forward_quant_scalar_4x4 and then right shift 134 * the result by (QP_BITS_h264_4x4 + floor(qp/6)). 135 * Before right shifting a round factor is added. 136 * The round factor can be any value [a * (1 << (QP_BITS_h264_4x4 + floor(qp/6)))] 137 * for 'a' lies in the range 0-0.5. 138 * Here qp is the quantization parameter used to quantize the mb. 139 * 140 * input : qp/6 141 * output : round factor. 142 * 143 * @remarks The round factor is constructed by setting a = 1/3 144 * 145 * round factor constructed by setting a = 1/3 146 { 147 10922, 21845, 43690, 87381, 148 174762, 349525, 699050, 1398101, 149 2796202, 150 } 151 * 152 * round factor constructed by setting a = 0.49 153 *{ 154 16056, 32112, 64225, 155 128450, 256901, 513802, 156 1027604, 2055208, 4110417, 157 }; 158 159 * round factor constructed by setting a = 0.5 160 16384, 32768, 65536, 161 131072, 262144, 524288, 162 1048576, 2097152, 4194304, 163 164 ****************************************************************************** 165 */ 166 const UWORD32 gu4_forward_quant_round_factor_4x4[9] = 167 { 168 10922, 21845, 43690, 87381, 169 174762, 349525, 699050, 1398101, 170 2796202, 171 }; 172 173 174 175 /** 176 ****************************************************************************** 177 * @brief Threshold Table. Quantizing the given DCT coefficient is done only if 178 * it exceeds the threshold value presented in this table. 179 * 180 * input : qp/6, qp%6, index location (i,j) 181 * output : Threshold constant. 182 * 183 * @remarks 16 constants for each index position of the subblock and 6 for each 184 * qp%6 in the range 0-5 inclusive and 9 for each qp/6 in the range 0-51. 185 ****************************************************************************** 186 */ 187 const UWORD16 gu2_forward_quant_threshold_4x4[96] = 188 { 189 426, 693, 426, 693, 190 693, 1066, 693, 1066, 191 426, 693, 426, 693, 192 693, 1066, 693, 1066, 193 194 469, 746, 469, 746, 195 746, 1200, 746, 1200, 196 469, 746, 469, 746, 197 746, 1200, 746, 1200, 198 199 554, 853, 554, 853, 200 853, 1333, 853, 1333, 201 554, 853, 554, 853, 202 853, 1333, 853, 1333, 203 204 597, 960, 597, 960, 205 960, 1533, 960, 1533, 206 597, 960, 597, 960, 207 960, 1533, 960, 1533, 208 209 682, 1066, 682, 1066, 210 1066, 1666, 1066, 1666, 211 682, 1066, 682, 1066, 212 1066, 1666, 1066, 1666, 213 214 767, 1226, 767, 1226, 215 1226, 1933, 1226, 1933, 216 767, 1226, 767, 1226, 217 1226, 1933, 1226, 1933, 218 }; 219 220 /** 221 ****************************************************************************** 222 * @brief Scale Table for quantizing 8x8 subblock. To quantize a given 8x8 DCT 223 * transformed block, the coefficient at index location (i,j) is scaled by one of 224 * the constants in this table and right shift the result by (QP_BITS_h264_8x8 + 225 * floor(qp/6)), here qp is the quantization parameter used to quantize the mb. 226 * 227 * input : qp%6, index location (i,j) 228 * output : scale constant. 229 * 230 * @remarks 64 constants for each index position of the subblock and 6 for each 231 * qp%6 in the range 0-5 inclusive. 232 ****************************************************************************** 233 */ 234 const UWORD16 gu2_quant_scale_matrix_8x8 [384] = 235 { 236 13107, 12222, 16777, 12222, 13107, 12222, 16777, 12222, 237 12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428, 238 16777, 15481, 20972, 15481, 16777, 15481, 20972, 15481, 239 12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428, 240 13107, 12222, 16777, 12222, 13107, 12222, 16777, 12222, 241 12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428, 242 16777, 15481, 20972, 15481, 16777, 15481, 20972, 15481, 243 12222, 11428, 15481, 11428, 12222, 11428, 15481, 11428, 244 245 11916, 11058, 14980, 11058, 11916, 11058, 14980, 11058, 246 11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826, 247 14980, 14290, 19174, 14290, 14980, 14290, 19174, 14290, 248 11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826, 249 11916, 11058, 14980, 11058, 11916, 11058, 14980, 11058, 250 11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826, 251 14980, 14290, 19174, 14290, 14980, 14290, 19174, 14290, 252 11058, 10826, 14290, 10826, 11058, 10826, 14290, 10826, 253 254 10082, 9675, 12710, 9675, 10082, 9675, 12710, 9675, 255 9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943, 256 12710, 11985, 15978, 11985, 12710, 11985, 15978, 11985, 257 9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943, 258 10082, 9675, 12710, 9675, 10082, 9675, 12710, 9675, 259 9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943, 260 12710, 11985, 15978, 11985, 12710, 11985, 15978, 11985, 261 9675, 8943, 11985, 8943, 9675, 8943, 11985, 8943, 262 263 9362, 8931, 11984, 8931, 9362, 8931, 11984, 8931, 264 8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228, 265 11984, 11259, 14913, 11259, 11984, 11259, 14913, 11259, 266 8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228, 267 9362, 8931, 11984, 8931, 9362, 8931, 11984, 8931, 268 8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228, 269 11984, 11259, 14913, 11259, 11984, 11259, 14913, 11259, 270 8931, 8228, 11259, 8228, 8931, 8228, 11259, 8228, 271 272 8192, 7740, 10486, 7740, 8192, 7740, 10486, 7740, 273 7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346, 274 10486, 9777, 13159, 9777, 10486, 9777, 13159, 9777, 275 7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346, 276 8192, 7740, 10486, 7740, 8192, 7740, 10486, 7740, 277 7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346, 278 10486, 9777, 13159, 9777, 10486, 9777, 13159, 9777, 279 7740, 7346, 9777, 7346, 7740, 7346, 9777, 7346, 280 281 7282, 6830, 9118, 6830, 7282, 6830, 9118, 6830, 282 6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428, 283 9118, 8640, 11570, 8640, 9118, 8640, 11570, 8640, 284 6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428, 285 7282, 6830, 9118, 6830, 7282, 6830, 9118, 6830, 286 6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428, 287 9118, 8640, 11570, 8640, 9118, 8640, 11570, 8640, 288 6830, 6428, 8640, 6428, 6830, 6428, 8640, 6428, 289 290 }; 291 292 293 /** 294 ****************************************************************************** 295 * @brief Specification of QPc as a function of qPi 296 * 297 * input : qp luma 298 * output : qp chroma. 299 * 300 * @remarks Refer Table 8-15 of h264 specification. 301 ****************************************************************************** 302 */ 303 const UWORD8 gu1_qpc_fqpi[52] = 304 { 305 0, 1, 2, 3, 4, 5, 6, 7, 306 8, 9, 10, 11, 12, 13, 14, 15, 307 16, 17, 18, 19, 20, 21, 22, 23, 308 24, 25, 26, 27, 28, 29, 29, 30, 309 31, 32, 32, 33, 34, 34, 35, 35, 310 36, 36, 37, 37, 37, 38, 38, 38, 311 39, 39, 39, 39, 312 }; 313