1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include "./vp8_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker
13*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
14*fb1b10abSAndroid Build Coastguard Worker * Notes:
15*fb1b10abSAndroid Build Coastguard Worker *
16*fb1b10abSAndroid Build Coastguard Worker * This implementation makes use of 16 bit fixed point verio of two multiply
17*fb1b10abSAndroid Build Coastguard Worker * constants:
18*fb1b10abSAndroid Build Coastguard Worker * 1. sqrt(2) * cos (pi/8)
19*fb1b10abSAndroid Build Coastguard Worker * 2. sqrt(2) * sin (pi/8)
20*fb1b10abSAndroid Build Coastguard Worker * Becuase the first constant is bigger than 1, to maintain the same 16 bit
21*fb1b10abSAndroid Build Coastguard Worker * fixed point precision as the second one, we use a trick of
22*fb1b10abSAndroid Build Coastguard Worker * x * a = x + x*(a-1)
23*fb1b10abSAndroid Build Coastguard Worker * so
24*fb1b10abSAndroid Build Coastguard Worker * x * sqrt(2) * cos (pi/8) = x + x * (sqrt(2) *cos(pi/8)-1).
25*fb1b10abSAndroid Build Coastguard Worker **************************************************************************/
26*fb1b10abSAndroid Build Coastguard Worker static const int cospi8sqrt2minus1 = 20091;
27*fb1b10abSAndroid Build Coastguard Worker static const int sinpi8sqrt2 = 35468;
28*fb1b10abSAndroid Build Coastguard Worker
vp8_short_idct4x4llm_c(short * input,unsigned char * pred_ptr,int pred_stride,unsigned char * dst_ptr,int dst_stride)29*fb1b10abSAndroid Build Coastguard Worker void vp8_short_idct4x4llm_c(short *input, unsigned char *pred_ptr,
30*fb1b10abSAndroid Build Coastguard Worker int pred_stride, unsigned char *dst_ptr,
31*fb1b10abSAndroid Build Coastguard Worker int dst_stride) {
32*fb1b10abSAndroid Build Coastguard Worker int i;
33*fb1b10abSAndroid Build Coastguard Worker int r, c;
34*fb1b10abSAndroid Build Coastguard Worker int a1, b1, c1, d1;
35*fb1b10abSAndroid Build Coastguard Worker short output[16];
36*fb1b10abSAndroid Build Coastguard Worker short *ip = input;
37*fb1b10abSAndroid Build Coastguard Worker short *op = output;
38*fb1b10abSAndroid Build Coastguard Worker int temp1, temp2;
39*fb1b10abSAndroid Build Coastguard Worker int shortpitch = 4;
40*fb1b10abSAndroid Build Coastguard Worker
41*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
42*fb1b10abSAndroid Build Coastguard Worker a1 = ip[0] + ip[8];
43*fb1b10abSAndroid Build Coastguard Worker b1 = ip[0] - ip[8];
44*fb1b10abSAndroid Build Coastguard Worker
45*fb1b10abSAndroid Build Coastguard Worker temp1 = (ip[4] * sinpi8sqrt2) >> 16;
46*fb1b10abSAndroid Build Coastguard Worker temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16);
47*fb1b10abSAndroid Build Coastguard Worker c1 = temp1 - temp2;
48*fb1b10abSAndroid Build Coastguard Worker
49*fb1b10abSAndroid Build Coastguard Worker temp1 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16);
50*fb1b10abSAndroid Build Coastguard Worker temp2 = (ip[12] * sinpi8sqrt2) >> 16;
51*fb1b10abSAndroid Build Coastguard Worker d1 = temp1 + temp2;
52*fb1b10abSAndroid Build Coastguard Worker
53*fb1b10abSAndroid Build Coastguard Worker op[shortpitch * 0] = a1 + d1;
54*fb1b10abSAndroid Build Coastguard Worker op[shortpitch * 3] = a1 - d1;
55*fb1b10abSAndroid Build Coastguard Worker
56*fb1b10abSAndroid Build Coastguard Worker op[shortpitch * 1] = b1 + c1;
57*fb1b10abSAndroid Build Coastguard Worker op[shortpitch * 2] = b1 - c1;
58*fb1b10abSAndroid Build Coastguard Worker
59*fb1b10abSAndroid Build Coastguard Worker ip++;
60*fb1b10abSAndroid Build Coastguard Worker op++;
61*fb1b10abSAndroid Build Coastguard Worker }
62*fb1b10abSAndroid Build Coastguard Worker
63*fb1b10abSAndroid Build Coastguard Worker ip = output;
64*fb1b10abSAndroid Build Coastguard Worker op = output;
65*fb1b10abSAndroid Build Coastguard Worker
66*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
67*fb1b10abSAndroid Build Coastguard Worker a1 = ip[0] + ip[2];
68*fb1b10abSAndroid Build Coastguard Worker b1 = ip[0] - ip[2];
69*fb1b10abSAndroid Build Coastguard Worker
70*fb1b10abSAndroid Build Coastguard Worker temp1 = (ip[1] * sinpi8sqrt2) >> 16;
71*fb1b10abSAndroid Build Coastguard Worker temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16);
72*fb1b10abSAndroid Build Coastguard Worker c1 = temp1 - temp2;
73*fb1b10abSAndroid Build Coastguard Worker
74*fb1b10abSAndroid Build Coastguard Worker temp1 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16);
75*fb1b10abSAndroid Build Coastguard Worker temp2 = (ip[3] * sinpi8sqrt2) >> 16;
76*fb1b10abSAndroid Build Coastguard Worker d1 = temp1 + temp2;
77*fb1b10abSAndroid Build Coastguard Worker
78*fb1b10abSAndroid Build Coastguard Worker op[0] = (a1 + d1 + 4) >> 3;
79*fb1b10abSAndroid Build Coastguard Worker op[3] = (a1 - d1 + 4) >> 3;
80*fb1b10abSAndroid Build Coastguard Worker
81*fb1b10abSAndroid Build Coastguard Worker op[1] = (b1 + c1 + 4) >> 3;
82*fb1b10abSAndroid Build Coastguard Worker op[2] = (b1 - c1 + 4) >> 3;
83*fb1b10abSAndroid Build Coastguard Worker
84*fb1b10abSAndroid Build Coastguard Worker ip += shortpitch;
85*fb1b10abSAndroid Build Coastguard Worker op += shortpitch;
86*fb1b10abSAndroid Build Coastguard Worker }
87*fb1b10abSAndroid Build Coastguard Worker
88*fb1b10abSAndroid Build Coastguard Worker ip = output;
89*fb1b10abSAndroid Build Coastguard Worker for (r = 0; r < 4; ++r) {
90*fb1b10abSAndroid Build Coastguard Worker for (c = 0; c < 4; ++c) {
91*fb1b10abSAndroid Build Coastguard Worker int a = ip[c] + pred_ptr[c];
92*fb1b10abSAndroid Build Coastguard Worker
93*fb1b10abSAndroid Build Coastguard Worker if (a < 0) a = 0;
94*fb1b10abSAndroid Build Coastguard Worker
95*fb1b10abSAndroid Build Coastguard Worker if (a > 255) a = 255;
96*fb1b10abSAndroid Build Coastguard Worker
97*fb1b10abSAndroid Build Coastguard Worker dst_ptr[c] = (unsigned char)a;
98*fb1b10abSAndroid Build Coastguard Worker }
99*fb1b10abSAndroid Build Coastguard Worker ip += 4;
100*fb1b10abSAndroid Build Coastguard Worker dst_ptr += dst_stride;
101*fb1b10abSAndroid Build Coastguard Worker pred_ptr += pred_stride;
102*fb1b10abSAndroid Build Coastguard Worker }
103*fb1b10abSAndroid Build Coastguard Worker }
104*fb1b10abSAndroid Build Coastguard Worker
vp8_dc_only_idct_add_c(short input_dc,unsigned char * pred_ptr,int pred_stride,unsigned char * dst_ptr,int dst_stride)105*fb1b10abSAndroid Build Coastguard Worker void vp8_dc_only_idct_add_c(short input_dc, unsigned char *pred_ptr,
106*fb1b10abSAndroid Build Coastguard Worker int pred_stride, unsigned char *dst_ptr,
107*fb1b10abSAndroid Build Coastguard Worker int dst_stride) {
108*fb1b10abSAndroid Build Coastguard Worker int a1 = ((input_dc + 4) >> 3);
109*fb1b10abSAndroid Build Coastguard Worker int r, c;
110*fb1b10abSAndroid Build Coastguard Worker
111*fb1b10abSAndroid Build Coastguard Worker for (r = 0; r < 4; ++r) {
112*fb1b10abSAndroid Build Coastguard Worker for (c = 0; c < 4; ++c) {
113*fb1b10abSAndroid Build Coastguard Worker int a = a1 + pred_ptr[c];
114*fb1b10abSAndroid Build Coastguard Worker
115*fb1b10abSAndroid Build Coastguard Worker if (a < 0) a = 0;
116*fb1b10abSAndroid Build Coastguard Worker
117*fb1b10abSAndroid Build Coastguard Worker if (a > 255) a = 255;
118*fb1b10abSAndroid Build Coastguard Worker
119*fb1b10abSAndroid Build Coastguard Worker dst_ptr[c] = (unsigned char)a;
120*fb1b10abSAndroid Build Coastguard Worker }
121*fb1b10abSAndroid Build Coastguard Worker
122*fb1b10abSAndroid Build Coastguard Worker dst_ptr += dst_stride;
123*fb1b10abSAndroid Build Coastguard Worker pred_ptr += pred_stride;
124*fb1b10abSAndroid Build Coastguard Worker }
125*fb1b10abSAndroid Build Coastguard Worker }
126*fb1b10abSAndroid Build Coastguard Worker
vp8_short_inv_walsh4x4_c(short * input,short * mb_dqcoeff)127*fb1b10abSAndroid Build Coastguard Worker void vp8_short_inv_walsh4x4_c(short *input, short *mb_dqcoeff) {
128*fb1b10abSAndroid Build Coastguard Worker short output[16];
129*fb1b10abSAndroid Build Coastguard Worker int i;
130*fb1b10abSAndroid Build Coastguard Worker int a1, b1, c1, d1;
131*fb1b10abSAndroid Build Coastguard Worker int a2, b2, c2, d2;
132*fb1b10abSAndroid Build Coastguard Worker short *ip = input;
133*fb1b10abSAndroid Build Coastguard Worker short *op = output;
134*fb1b10abSAndroid Build Coastguard Worker
135*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
136*fb1b10abSAndroid Build Coastguard Worker a1 = ip[0] + ip[12];
137*fb1b10abSAndroid Build Coastguard Worker b1 = ip[4] + ip[8];
138*fb1b10abSAndroid Build Coastguard Worker c1 = ip[4] - ip[8];
139*fb1b10abSAndroid Build Coastguard Worker d1 = ip[0] - ip[12];
140*fb1b10abSAndroid Build Coastguard Worker
141*fb1b10abSAndroid Build Coastguard Worker op[0] = a1 + b1;
142*fb1b10abSAndroid Build Coastguard Worker op[4] = c1 + d1;
143*fb1b10abSAndroid Build Coastguard Worker op[8] = a1 - b1;
144*fb1b10abSAndroid Build Coastguard Worker op[12] = d1 - c1;
145*fb1b10abSAndroid Build Coastguard Worker ip++;
146*fb1b10abSAndroid Build Coastguard Worker op++;
147*fb1b10abSAndroid Build Coastguard Worker }
148*fb1b10abSAndroid Build Coastguard Worker
149*fb1b10abSAndroid Build Coastguard Worker ip = output;
150*fb1b10abSAndroid Build Coastguard Worker op = output;
151*fb1b10abSAndroid Build Coastguard Worker
152*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 4; ++i) {
153*fb1b10abSAndroid Build Coastguard Worker a1 = ip[0] + ip[3];
154*fb1b10abSAndroid Build Coastguard Worker b1 = ip[1] + ip[2];
155*fb1b10abSAndroid Build Coastguard Worker c1 = ip[1] - ip[2];
156*fb1b10abSAndroid Build Coastguard Worker d1 = ip[0] - ip[3];
157*fb1b10abSAndroid Build Coastguard Worker
158*fb1b10abSAndroid Build Coastguard Worker a2 = a1 + b1;
159*fb1b10abSAndroid Build Coastguard Worker b2 = c1 + d1;
160*fb1b10abSAndroid Build Coastguard Worker c2 = a1 - b1;
161*fb1b10abSAndroid Build Coastguard Worker d2 = d1 - c1;
162*fb1b10abSAndroid Build Coastguard Worker
163*fb1b10abSAndroid Build Coastguard Worker op[0] = (a2 + 3) >> 3;
164*fb1b10abSAndroid Build Coastguard Worker op[1] = (b2 + 3) >> 3;
165*fb1b10abSAndroid Build Coastguard Worker op[2] = (c2 + 3) >> 3;
166*fb1b10abSAndroid Build Coastguard Worker op[3] = (d2 + 3) >> 3;
167*fb1b10abSAndroid Build Coastguard Worker
168*fb1b10abSAndroid Build Coastguard Worker ip += 4;
169*fb1b10abSAndroid Build Coastguard Worker op += 4;
170*fb1b10abSAndroid Build Coastguard Worker }
171*fb1b10abSAndroid Build Coastguard Worker
172*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
173*fb1b10abSAndroid Build Coastguard Worker mb_dqcoeff[i * 16] = output[i];
174*fb1b10abSAndroid Build Coastguard Worker }
175*fb1b10abSAndroid Build Coastguard Worker }
176*fb1b10abSAndroid Build Coastguard Worker
vp8_short_inv_walsh4x4_1_c(short * input,short * mb_dqcoeff)177*fb1b10abSAndroid Build Coastguard Worker void vp8_short_inv_walsh4x4_1_c(short *input, short *mb_dqcoeff) {
178*fb1b10abSAndroid Build Coastguard Worker int i;
179*fb1b10abSAndroid Build Coastguard Worker int a1;
180*fb1b10abSAndroid Build Coastguard Worker
181*fb1b10abSAndroid Build Coastguard Worker a1 = ((input[0] + 3) >> 3);
182*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < 16; ++i) {
183*fb1b10abSAndroid Build Coastguard Worker mb_dqcoeff[i * 16] = a1;
184*fb1b10abSAndroid Build Coastguard Worker }
185*fb1b10abSAndroid Build Coastguard Worker }
186