1*abb65b4bSAndroid Build Coastguard Worker /*
2*abb65b4bSAndroid Build Coastguard Worker * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3*abb65b4bSAndroid Build Coastguard Worker * All Rights Reserved.
4*abb65b4bSAndroid Build Coastguard Worker *
5*abb65b4bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*abb65b4bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*abb65b4bSAndroid Build Coastguard Worker *
8*abb65b4bSAndroid Build Coastguard Worker * - Redistributions of source code must retain the above copyright notice,
9*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer.
10*abb65b4bSAndroid Build Coastguard Worker *
11*abb65b4bSAndroid Build Coastguard Worker * - Redistributions in binary form must reproduce the above copyright notice,
12*abb65b4bSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation
13*abb65b4bSAndroid Build Coastguard Worker * and/or other materials provided with the distribution.
14*abb65b4bSAndroid Build Coastguard Worker *
15*abb65b4bSAndroid Build Coastguard Worker * - Neither the name of the copyright owner, nor the names of its contributors
16*abb65b4bSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software
17*abb65b4bSAndroid Build Coastguard Worker * without specific prior written permission.
18*abb65b4bSAndroid Build Coastguard Worker *
19*abb65b4bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*abb65b4bSAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*abb65b4bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*abb65b4bSAndroid Build Coastguard Worker * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*abb65b4bSAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*abb65b4bSAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*abb65b4bSAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*abb65b4bSAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*abb65b4bSAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*abb65b4bSAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*abb65b4bSAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
30*abb65b4bSAndroid Build Coastguard Worker */
31*abb65b4bSAndroid Build Coastguard Worker
32*abb65b4bSAndroid Build Coastguard Worker #include "oapv_tq.h"
33*abb65b4bSAndroid Build Coastguard Worker #include <math.h>
34*abb65b4bSAndroid Build Coastguard Worker
35*abb65b4bSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
36*abb65b4bSAndroid Build Coastguard Worker // start of encoder code
37*abb65b4bSAndroid Build Coastguard Worker #if ENABLE_ENCODER
38*abb65b4bSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
39*abb65b4bSAndroid Build Coastguard Worker
40*abb65b4bSAndroid Build Coastguard Worker const int oapv_quant_scale[6] = { 26214, 23302, 20560, 18396, 16384, 14769 };
41*abb65b4bSAndroid Build Coastguard Worker
oapv_tx_part(s16 * src,s16 * dst,int shift,int line)42*abb65b4bSAndroid Build Coastguard Worker static void oapv_tx_part(s16 *src, s16 *dst, int shift, int line)
43*abb65b4bSAndroid Build Coastguard Worker {
44*abb65b4bSAndroid Build Coastguard Worker int j, k;
45*abb65b4bSAndroid Build Coastguard Worker int E[4], O[4];
46*abb65b4bSAndroid Build Coastguard Worker int EE[2], EO[2];
47*abb65b4bSAndroid Build Coastguard Worker int add = 1 << (shift - 1);
48*abb65b4bSAndroid Build Coastguard Worker
49*abb65b4bSAndroid Build Coastguard Worker for(j = 0; j < line; j++) {
50*abb65b4bSAndroid Build Coastguard Worker /* E and O*/
51*abb65b4bSAndroid Build Coastguard Worker for(k = 0; k < 4; k++) {
52*abb65b4bSAndroid Build Coastguard Worker E[k] = src[j * 8 + k] + src[j * 8 + 7 - k];
53*abb65b4bSAndroid Build Coastguard Worker O[k] = src[j * 8 + k] - src[j * 8 + 7 - k];
54*abb65b4bSAndroid Build Coastguard Worker }
55*abb65b4bSAndroid Build Coastguard Worker /* EE and EO */
56*abb65b4bSAndroid Build Coastguard Worker EE[0] = E[0] + E[3];
57*abb65b4bSAndroid Build Coastguard Worker EO[0] = E[0] - E[3];
58*abb65b4bSAndroid Build Coastguard Worker EE[1] = E[1] + E[2];
59*abb65b4bSAndroid Build Coastguard Worker EO[1] = E[1] - E[2];
60*abb65b4bSAndroid Build Coastguard Worker
61*abb65b4bSAndroid Build Coastguard Worker dst[0 * line + j] = (oapv_tbl_tm8[0][0] * EE[0] + oapv_tbl_tm8[0][1] * EE[1] + add) >> shift;
62*abb65b4bSAndroid Build Coastguard Worker dst[4 * line + j] = (oapv_tbl_tm8[4][0] * EE[0] + oapv_tbl_tm8[4][1] * EE[1] + add) >> shift;
63*abb65b4bSAndroid Build Coastguard Worker dst[2 * line + j] = (oapv_tbl_tm8[2][0] * EO[0] + oapv_tbl_tm8[2][1] * EO[1] + add) >> shift;
64*abb65b4bSAndroid Build Coastguard Worker dst[6 * line + j] = (oapv_tbl_tm8[6][0] * EO[0] + oapv_tbl_tm8[6][1] * EO[1] + add) >> shift;
65*abb65b4bSAndroid Build Coastguard Worker
66*abb65b4bSAndroid Build Coastguard Worker dst[1 * line + j] = (oapv_tbl_tm8[1][0] * O[0] + oapv_tbl_tm8[1][1] * O[1] + oapv_tbl_tm8[1][2] * O[2] + oapv_tbl_tm8[1][3] * O[3] + add) >> shift;
67*abb65b4bSAndroid Build Coastguard Worker dst[3 * line + j] = (oapv_tbl_tm8[3][0] * O[0] + oapv_tbl_tm8[3][1] * O[1] + oapv_tbl_tm8[3][2] * O[2] + oapv_tbl_tm8[3][3] * O[3] + add) >> shift;
68*abb65b4bSAndroid Build Coastguard Worker dst[5 * line + j] = (oapv_tbl_tm8[5][0] * O[0] + oapv_tbl_tm8[5][1] * O[1] + oapv_tbl_tm8[5][2] * O[2] + oapv_tbl_tm8[5][3] * O[3] + add) >> shift;
69*abb65b4bSAndroid Build Coastguard Worker dst[7 * line + j] = (oapv_tbl_tm8[7][0] * O[0] + oapv_tbl_tm8[7][1] * O[1] + oapv_tbl_tm8[7][2] * O[2] + oapv_tbl_tm8[7][3] * O[3] + add) >> shift;
70*abb65b4bSAndroid Build Coastguard Worker }
71*abb65b4bSAndroid Build Coastguard Worker }
72*abb65b4bSAndroid Build Coastguard Worker
73*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_tx_t oapv_tbl_fn_tx[2] = {
74*abb65b4bSAndroid Build Coastguard Worker oapv_tx_part,
75*abb65b4bSAndroid Build Coastguard Worker NULL
76*abb65b4bSAndroid Build Coastguard Worker };
77*abb65b4bSAndroid Build Coastguard Worker
get_transform_shift(int log2_size,int type,int bit_depth)78*abb65b4bSAndroid Build Coastguard Worker static __inline int get_transform_shift(int log2_size, int type, int bit_depth)
79*abb65b4bSAndroid Build Coastguard Worker {
80*abb65b4bSAndroid Build Coastguard Worker if(type == 0) {
81*abb65b4bSAndroid Build Coastguard Worker return ((log2_size)-1 + bit_depth - 8);
82*abb65b4bSAndroid Build Coastguard Worker }
83*abb65b4bSAndroid Build Coastguard Worker else {
84*abb65b4bSAndroid Build Coastguard Worker return ((log2_size) + 6);
85*abb65b4bSAndroid Build Coastguard Worker }
86*abb65b4bSAndroid Build Coastguard Worker }
87*abb65b4bSAndroid Build Coastguard Worker
oapv_trans(oapve_ctx_t * ctx,s16 * coef,int log2_w,int log2_h,int bit_depth)88*abb65b4bSAndroid Build Coastguard Worker void oapv_trans(oapve_ctx_t *ctx, s16 *coef, int log2_w, int log2_h, int bit_depth)
89*abb65b4bSAndroid Build Coastguard Worker {
90*abb65b4bSAndroid Build Coastguard Worker int shift1 = get_transform_shift(log2_w, 0, bit_depth);
91*abb65b4bSAndroid Build Coastguard Worker int shift2 = get_transform_shift(log2_h, 1, bit_depth);
92*abb65b4bSAndroid Build Coastguard Worker
93*abb65b4bSAndroid Build Coastguard Worker ALIGNED_16(s16 tb[OAPV_BLK_D]);
94*abb65b4bSAndroid Build Coastguard Worker (ctx->fn_txb)[0](coef, tb, shift1, 1 << log2_h);
95*abb65b4bSAndroid Build Coastguard Worker (ctx->fn_txb)[0](tb, coef, shift2, 1 << log2_w);
96*abb65b4bSAndroid Build Coastguard Worker }
97*abb65b4bSAndroid Build Coastguard Worker
oapv_quant(s16 * coef,u8 qp,int q_matrix[OAPV_BLK_D],int log2_w,int log2_h,int bit_depth,int deadzone_offset)98*abb65b4bSAndroid Build Coastguard Worker static int oapv_quant(s16 *coef, u8 qp, int q_matrix[OAPV_BLK_D], int log2_w, int log2_h, int bit_depth, int deadzone_offset)
99*abb65b4bSAndroid Build Coastguard Worker {
100*abb65b4bSAndroid Build Coastguard Worker s64 lev;
101*abb65b4bSAndroid Build Coastguard Worker s32 offset;
102*abb65b4bSAndroid Build Coastguard Worker int sign;
103*abb65b4bSAndroid Build Coastguard Worker int i;
104*abb65b4bSAndroid Build Coastguard Worker int shift;
105*abb65b4bSAndroid Build Coastguard Worker int tr_shift;
106*abb65b4bSAndroid Build Coastguard Worker int log2_size = (log2_w + log2_h) >> 1;
107*abb65b4bSAndroid Build Coastguard Worker
108*abb65b4bSAndroid Build Coastguard Worker tr_shift = MAX_TX_DYNAMIC_RANGE - bit_depth - log2_size;
109*abb65b4bSAndroid Build Coastguard Worker shift = QUANT_SHIFT + tr_shift + (qp / 6);
110*abb65b4bSAndroid Build Coastguard Worker offset = deadzone_offset << (shift - 9);
111*abb65b4bSAndroid Build Coastguard Worker int pixels = (1 << (log2_w + log2_h));
112*abb65b4bSAndroid Build Coastguard Worker
113*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < pixels; i++) {
114*abb65b4bSAndroid Build Coastguard Worker sign = oapv_get_sign(coef[i]);
115*abb65b4bSAndroid Build Coastguard Worker lev = (s64)oapv_abs(coef[i]) * (q_matrix[i]);
116*abb65b4bSAndroid Build Coastguard Worker lev = (lev + offset) >> shift;
117*abb65b4bSAndroid Build Coastguard Worker lev = oapv_set_sign(lev, sign);
118*abb65b4bSAndroid Build Coastguard Worker coef[i] = (s16)(oapv_clip3(-32768, 32767, lev));
119*abb65b4bSAndroid Build Coastguard Worker }
120*abb65b4bSAndroid Build Coastguard Worker return OAPV_OK;
121*abb65b4bSAndroid Build Coastguard Worker }
122*abb65b4bSAndroid Build Coastguard Worker
123*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_quant_t oapv_tbl_fn_quant[2] = {
124*abb65b4bSAndroid Build Coastguard Worker oapv_quant,
125*abb65b4bSAndroid Build Coastguard Worker NULL
126*abb65b4bSAndroid Build Coastguard Worker };
127*abb65b4bSAndroid Build Coastguard Worker
128*abb65b4bSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
129*abb65b4bSAndroid Build Coastguard Worker // end of encoder code
130*abb65b4bSAndroid Build Coastguard Worker #endif // ENABLE_ENCODER
131*abb65b4bSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
132*abb65b4bSAndroid Build Coastguard Worker
oapv_itx_get_wo_sft(s16 * src,s16 * dst,s32 * dst32,int shift,int line)133*abb65b4bSAndroid Build Coastguard Worker void oapv_itx_get_wo_sft(s16 *src, s16 *dst, s32 *dst32, int shift, int line)
134*abb65b4bSAndroid Build Coastguard Worker {
135*abb65b4bSAndroid Build Coastguard Worker int j, k;
136*abb65b4bSAndroid Build Coastguard Worker s32 E[4], O[4];
137*abb65b4bSAndroid Build Coastguard Worker s32 EE[2], EO[2];
138*abb65b4bSAndroid Build Coastguard Worker int add = 1 << (shift - 1);
139*abb65b4bSAndroid Build Coastguard Worker
140*abb65b4bSAndroid Build Coastguard Worker for(j = 0; j < line; j++) {
141*abb65b4bSAndroid Build Coastguard Worker /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
142*abb65b4bSAndroid Build Coastguard Worker for(k = 0; k < 4; k++) {
143*abb65b4bSAndroid Build Coastguard Worker O[k] = oapv_tbl_tm8[1][k] * src[1 * line + j] + oapv_tbl_tm8[3][k] * src[3 * line + j] + oapv_tbl_tm8[5][k] * src[5 * line + j] + oapv_tbl_tm8[7][k] * src[7 * line + j];
144*abb65b4bSAndroid Build Coastguard Worker }
145*abb65b4bSAndroid Build Coastguard Worker
146*abb65b4bSAndroid Build Coastguard Worker EO[0] = oapv_tbl_tm8[2][0] * src[2 * line + j] + oapv_tbl_tm8[6][0] * src[6 * line + j];
147*abb65b4bSAndroid Build Coastguard Worker EO[1] = oapv_tbl_tm8[2][1] * src[2 * line + j] + oapv_tbl_tm8[6][1] * src[6 * line + j];
148*abb65b4bSAndroid Build Coastguard Worker EE[0] = oapv_tbl_tm8[0][0] * src[0 * line + j] + oapv_tbl_tm8[4][0] * src[4 * line + j];
149*abb65b4bSAndroid Build Coastguard Worker EE[1] = oapv_tbl_tm8[0][1] * src[0 * line + j] + oapv_tbl_tm8[4][1] * src[4 * line + j];
150*abb65b4bSAndroid Build Coastguard Worker
151*abb65b4bSAndroid Build Coastguard Worker /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
152*abb65b4bSAndroid Build Coastguard Worker E[0] = EE[0] + EO[0];
153*abb65b4bSAndroid Build Coastguard Worker E[3] = EE[0] - EO[0];
154*abb65b4bSAndroid Build Coastguard Worker E[1] = EE[1] + EO[1];
155*abb65b4bSAndroid Build Coastguard Worker E[2] = EE[1] - EO[1];
156*abb65b4bSAndroid Build Coastguard Worker
157*abb65b4bSAndroid Build Coastguard Worker for(k = 0; k < 4; k++) {
158*abb65b4bSAndroid Build Coastguard Worker dst32[j * 8 + k] = E[k] + O[k];
159*abb65b4bSAndroid Build Coastguard Worker dst32[j * 8 + k + 4] = E[3 - k] - O[3 - k];
160*abb65b4bSAndroid Build Coastguard Worker
161*abb65b4bSAndroid Build Coastguard Worker dst[j * 8 + k] = ((dst32[j * 8 + k] + add) >> shift);
162*abb65b4bSAndroid Build Coastguard Worker dst[j * 8 + k + 4] = ((dst32[j * 8 + k + 4] + add) >> shift);
163*abb65b4bSAndroid Build Coastguard Worker }
164*abb65b4bSAndroid Build Coastguard Worker }
165*abb65b4bSAndroid Build Coastguard Worker }
166*abb65b4bSAndroid Build Coastguard Worker
oapv_itx_part(s16 * src,s16 * dst,int shift,int line)167*abb65b4bSAndroid Build Coastguard Worker static void oapv_itx_part(s16 *src, s16 *dst, int shift, int line)
168*abb65b4bSAndroid Build Coastguard Worker {
169*abb65b4bSAndroid Build Coastguard Worker int j, k;
170*abb65b4bSAndroid Build Coastguard Worker int E[4], O[4];
171*abb65b4bSAndroid Build Coastguard Worker int EE[2], EO[2];
172*abb65b4bSAndroid Build Coastguard Worker int add = 1 << (shift - 1);
173*abb65b4bSAndroid Build Coastguard Worker
174*abb65b4bSAndroid Build Coastguard Worker for(j = 0; j < line; j++) {
175*abb65b4bSAndroid Build Coastguard Worker /* Utilizing symmetry properties to the maximum to minimize the number of multiplications */
176*abb65b4bSAndroid Build Coastguard Worker for(k = 0; k < 4; k++) {
177*abb65b4bSAndroid Build Coastguard Worker O[k] = oapv_tbl_tm8[1][k] * src[1 * line + j] + oapv_tbl_tm8[3][k] * src[3 * line + j] + oapv_tbl_tm8[5][k] * src[5 * line + j] + oapv_tbl_tm8[7][k] * src[7 * line + j];
178*abb65b4bSAndroid Build Coastguard Worker }
179*abb65b4bSAndroid Build Coastguard Worker
180*abb65b4bSAndroid Build Coastguard Worker EO[0] = oapv_tbl_tm8[2][0] * src[2 * line + j] + oapv_tbl_tm8[6][0] * src[6 * line + j];
181*abb65b4bSAndroid Build Coastguard Worker EO[1] = oapv_tbl_tm8[2][1] * src[2 * line + j] + oapv_tbl_tm8[6][1] * src[6 * line + j];
182*abb65b4bSAndroid Build Coastguard Worker EE[0] = oapv_tbl_tm8[0][0] * src[0 * line + j] + oapv_tbl_tm8[4][0] * src[4 * line + j];
183*abb65b4bSAndroid Build Coastguard Worker EE[1] = oapv_tbl_tm8[0][1] * src[0 * line + j] + oapv_tbl_tm8[4][1] * src[4 * line + j];
184*abb65b4bSAndroid Build Coastguard Worker
185*abb65b4bSAndroid Build Coastguard Worker /* Combining even and odd terms at each hierarchy levels to calculate the final spatial domain vector */
186*abb65b4bSAndroid Build Coastguard Worker E[0] = EE[0] + EO[0];
187*abb65b4bSAndroid Build Coastguard Worker E[3] = EE[0] - EO[0];
188*abb65b4bSAndroid Build Coastguard Worker E[1] = EE[1] + EO[1];
189*abb65b4bSAndroid Build Coastguard Worker E[2] = EE[1] - EO[1];
190*abb65b4bSAndroid Build Coastguard Worker
191*abb65b4bSAndroid Build Coastguard Worker for(k = 0; k < 4; k++) {
192*abb65b4bSAndroid Build Coastguard Worker dst[j * 8 + k] = ((E[k] + O[k] + add) >> shift);
193*abb65b4bSAndroid Build Coastguard Worker dst[j * 8 + k + 4] = ((E[3 - k] - O[3 - k] + add) >> shift);
194*abb65b4bSAndroid Build Coastguard Worker }
195*abb65b4bSAndroid Build Coastguard Worker }
196*abb65b4bSAndroid Build Coastguard Worker }
197*abb65b4bSAndroid Build Coastguard Worker
198*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_part_t oapv_tbl_fn_itx_part[2] = {
199*abb65b4bSAndroid Build Coastguard Worker oapv_itx_part,
200*abb65b4bSAndroid Build Coastguard Worker NULL
201*abb65b4bSAndroid Build Coastguard Worker };
202*abb65b4bSAndroid Build Coastguard Worker
oapv_itx(s16 * src,int shift1,int shift2,int line)203*abb65b4bSAndroid Build Coastguard Worker static void oapv_itx(s16 *src, int shift1, int shift2, int line)
204*abb65b4bSAndroid Build Coastguard Worker {
205*abb65b4bSAndroid Build Coastguard Worker ALIGNED_16(s16 dst[OAPV_BLK_D]);
206*abb65b4bSAndroid Build Coastguard Worker oapv_itx_part(src, dst, shift1, line);
207*abb65b4bSAndroid Build Coastguard Worker oapv_itx_part(dst, src, shift2, line);
208*abb65b4bSAndroid Build Coastguard Worker }
209*abb65b4bSAndroid Build Coastguard Worker
210*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_t oapv_tbl_fn_itx[2] = {
211*abb65b4bSAndroid Build Coastguard Worker oapv_itx,
212*abb65b4bSAndroid Build Coastguard Worker NULL
213*abb65b4bSAndroid Build Coastguard Worker };
214*abb65b4bSAndroid Build Coastguard Worker
oapv_dquant(s16 * coef,s16 q_matrix[OAPV_BLK_D],int log2_w,int log2_h,s8 shift)215*abb65b4bSAndroid Build Coastguard Worker static void oapv_dquant(s16 *coef, s16 q_matrix[OAPV_BLK_D], int log2_w, int log2_h, s8 shift)
216*abb65b4bSAndroid Build Coastguard Worker {
217*abb65b4bSAndroid Build Coastguard Worker int i;
218*abb65b4bSAndroid Build Coastguard Worker int lev;
219*abb65b4bSAndroid Build Coastguard Worker int pixels = (1 << (log2_w + log2_h));
220*abb65b4bSAndroid Build Coastguard Worker
221*abb65b4bSAndroid Build Coastguard Worker if(shift > 0) {
222*abb65b4bSAndroid Build Coastguard Worker s32 offset = (1 << (shift - 1));
223*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < pixels; i++) {
224*abb65b4bSAndroid Build Coastguard Worker lev = (coef[i] * q_matrix[i] + offset) >> shift;
225*abb65b4bSAndroid Build Coastguard Worker coef[i] = (s16)oapv_clip3(-32768, 32767, lev);
226*abb65b4bSAndroid Build Coastguard Worker }
227*abb65b4bSAndroid Build Coastguard Worker }
228*abb65b4bSAndroid Build Coastguard Worker else {
229*abb65b4bSAndroid Build Coastguard Worker int left_shift = -shift;
230*abb65b4bSAndroid Build Coastguard Worker for(i = 0; i < pixels; i++) {
231*abb65b4bSAndroid Build Coastguard Worker lev = (coef[i] * q_matrix[i]) << left_shift;
232*abb65b4bSAndroid Build Coastguard Worker coef[i] = (s16)oapv_clip3(-32768, 32767, lev);
233*abb65b4bSAndroid Build Coastguard Worker }
234*abb65b4bSAndroid Build Coastguard Worker }
235*abb65b4bSAndroid Build Coastguard Worker }
236*abb65b4bSAndroid Build Coastguard Worker
237*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_dquant_t oapv_tbl_fn_dquant[2] = {
238*abb65b4bSAndroid Build Coastguard Worker oapv_dquant,
239*abb65b4bSAndroid Build Coastguard Worker NULL
240*abb65b4bSAndroid Build Coastguard Worker };
241*abb65b4bSAndroid Build Coastguard Worker
oapv_adjust_itrans(int * src,int * dst,int itrans_diff_idx,int diff_step,int shift)242*abb65b4bSAndroid Build Coastguard Worker void oapv_adjust_itrans(int *src, int *dst, int itrans_diff_idx, int diff_step, int shift)
243*abb65b4bSAndroid Build Coastguard Worker {
244*abb65b4bSAndroid Build Coastguard Worker int offset = 1 << (shift - 1);
245*abb65b4bSAndroid Build Coastguard Worker for(int k = 0; k < 64; k++) {
246*abb65b4bSAndroid Build Coastguard Worker dst[k] = src[k] + ((oapv_itrans_diff[itrans_diff_idx][k] * diff_step + offset) >> shift);
247*abb65b4bSAndroid Build Coastguard Worker }
248*abb65b4bSAndroid Build Coastguard Worker }
249*abb65b4bSAndroid Build Coastguard Worker
250*abb65b4bSAndroid Build Coastguard Worker const oapv_fn_itx_adj_t oapv_tbl_fn_itx_adj[2] = {
251*abb65b4bSAndroid Build Coastguard Worker oapv_adjust_itrans,
252*abb65b4bSAndroid Build Coastguard Worker NULL,
253*abb65b4bSAndroid Build Coastguard Worker };
254