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
50const 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
58const 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
7215.059   14.173   19.051   14.173
7320.227   19.051   25.600   19.051
7415.059   14.173   19.051   14.173};
75{512,   544,    405,    544,
76544,    578,    430,    578,
77405,    430,    320,    430,
78544,    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 */
95const 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 */
166const 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 */
187const 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 */
234const 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 */
303const 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