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 "./vpx_scale_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/vpx_scale.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
14*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
15*fb1b10abSAndroid Build Coastguard Worker * Imports
16*fb1b10abSAndroid Build Coastguard Worker ****************************************************************************/
17*fb1b10abSAndroid Build Coastguard Worker
18*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
19*fb1b10abSAndroid Build Coastguard Worker *
20*fb1b10abSAndroid Build Coastguard Worker *
21*fb1b10abSAndroid Build Coastguard Worker * INPUTS : const unsigned char *source : Pointer to source data.
22*fb1b10abSAndroid Build Coastguard Worker * unsigned int source_width : Stride of source.
23*fb1b10abSAndroid Build Coastguard Worker * unsigned char *dest : Pointer to destination data.
24*fb1b10abSAndroid Build Coastguard Worker * unsigned int dest_width : Stride of dest (UNUSED).
25*fb1b10abSAndroid Build Coastguard Worker *
26*fb1b10abSAndroid Build Coastguard Worker * OUTPUTS : None.
27*fb1b10abSAndroid Build Coastguard Worker *
28*fb1b10abSAndroid Build Coastguard Worker * RETURNS : void
29*fb1b10abSAndroid Build Coastguard Worker *
30*fb1b10abSAndroid Build Coastguard Worker * FUNCTION : Copies horizontal line of pixels from source to
31*fb1b10abSAndroid Build Coastguard Worker * destination scaling up by 4 to 5.
32*fb1b10abSAndroid Build Coastguard Worker *
33*fb1b10abSAndroid Build Coastguard Worker * SPECIAL NOTES : None.
34*fb1b10abSAndroid Build Coastguard Worker *
35*fb1b10abSAndroid Build Coastguard Worker ****************************************************************************/
vp8_horizontal_line_5_4_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)36*fb1b10abSAndroid Build Coastguard Worker void vp8_horizontal_line_5_4_scale_c(const unsigned char *source,
37*fb1b10abSAndroid Build Coastguard Worker unsigned int source_width,
38*fb1b10abSAndroid Build Coastguard Worker unsigned char *dest,
39*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
40*fb1b10abSAndroid Build Coastguard Worker unsigned i;
41*fb1b10abSAndroid Build Coastguard Worker unsigned int a, b, c, d, e;
42*fb1b10abSAndroid Build Coastguard Worker unsigned char *des = dest;
43*fb1b10abSAndroid Build Coastguard Worker const unsigned char *src = source;
44*fb1b10abSAndroid Build Coastguard Worker
45*fb1b10abSAndroid Build Coastguard Worker (void)dest_width;
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < source_width; i += 5) {
48*fb1b10abSAndroid Build Coastguard Worker a = src[0];
49*fb1b10abSAndroid Build Coastguard Worker b = src[1];
50*fb1b10abSAndroid Build Coastguard Worker c = src[2];
51*fb1b10abSAndroid Build Coastguard Worker d = src[3];
52*fb1b10abSAndroid Build Coastguard Worker e = src[4];
53*fb1b10abSAndroid Build Coastguard Worker
54*fb1b10abSAndroid Build Coastguard Worker des[0] = (unsigned char)a;
55*fb1b10abSAndroid Build Coastguard Worker des[1] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
56*fb1b10abSAndroid Build Coastguard Worker des[2] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
57*fb1b10abSAndroid Build Coastguard Worker des[3] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
58*fb1b10abSAndroid Build Coastguard Worker
59*fb1b10abSAndroid Build Coastguard Worker src += 5;
60*fb1b10abSAndroid Build Coastguard Worker des += 4;
61*fb1b10abSAndroid Build Coastguard Worker }
62*fb1b10abSAndroid Build Coastguard Worker }
63*fb1b10abSAndroid Build Coastguard Worker
vp8_vertical_band_5_4_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)64*fb1b10abSAndroid Build Coastguard Worker void vp8_vertical_band_5_4_scale_c(unsigned char *source,
65*fb1b10abSAndroid Build Coastguard Worker unsigned int src_pitch, unsigned char *dest,
66*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_pitch,
67*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
68*fb1b10abSAndroid Build Coastguard Worker unsigned int i;
69*fb1b10abSAndroid Build Coastguard Worker unsigned int a, b, c, d, e;
70*fb1b10abSAndroid Build Coastguard Worker unsigned char *des = dest;
71*fb1b10abSAndroid Build Coastguard Worker unsigned char *src = source;
72*fb1b10abSAndroid Build Coastguard Worker
73*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < dest_width; i++) {
74*fb1b10abSAndroid Build Coastguard Worker a = src[0 * src_pitch];
75*fb1b10abSAndroid Build Coastguard Worker b = src[1 * src_pitch];
76*fb1b10abSAndroid Build Coastguard Worker c = src[2 * src_pitch];
77*fb1b10abSAndroid Build Coastguard Worker d = src[3 * src_pitch];
78*fb1b10abSAndroid Build Coastguard Worker e = src[4 * src_pitch];
79*fb1b10abSAndroid Build Coastguard Worker
80*fb1b10abSAndroid Build Coastguard Worker des[0 * dest_pitch] = (unsigned char)a;
81*fb1b10abSAndroid Build Coastguard Worker des[1 * dest_pitch] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
82*fb1b10abSAndroid Build Coastguard Worker des[2 * dest_pitch] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
83*fb1b10abSAndroid Build Coastguard Worker des[3 * dest_pitch] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
84*fb1b10abSAndroid Build Coastguard Worker
85*fb1b10abSAndroid Build Coastguard Worker src++;
86*fb1b10abSAndroid Build Coastguard Worker des++;
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker }
89*fb1b10abSAndroid Build Coastguard Worker
90*fb1b10abSAndroid Build Coastguard Worker /*7***************************************************************************
91*fb1b10abSAndroid Build Coastguard Worker *
92*fb1b10abSAndroid Build Coastguard Worker * ROUTINE : vp8_horizontal_line_3_5_scale_c
93*fb1b10abSAndroid Build Coastguard Worker *
94*fb1b10abSAndroid Build Coastguard Worker * INPUTS : const unsigned char *source : Pointer to source data.
95*fb1b10abSAndroid Build Coastguard Worker * unsigned int source_width : Stride of source.
96*fb1b10abSAndroid Build Coastguard Worker * unsigned char *dest : Pointer to destination data.
97*fb1b10abSAndroid Build Coastguard Worker * unsigned int dest_width : Stride of dest (UNUSED).
98*fb1b10abSAndroid Build Coastguard Worker *
99*fb1b10abSAndroid Build Coastguard Worker * OUTPUTS : None.
100*fb1b10abSAndroid Build Coastguard Worker *
101*fb1b10abSAndroid Build Coastguard Worker * RETURNS : void
102*fb1b10abSAndroid Build Coastguard Worker *
103*fb1b10abSAndroid Build Coastguard Worker * FUNCTION : Copies horizontal line of pixels from source to
104*fb1b10abSAndroid Build Coastguard Worker * destination scaling up by 3 to 5.
105*fb1b10abSAndroid Build Coastguard Worker *
106*fb1b10abSAndroid Build Coastguard Worker * SPECIAL NOTES : None.
107*fb1b10abSAndroid Build Coastguard Worker *
108*fb1b10abSAndroid Build Coastguard Worker *
109*fb1b10abSAndroid Build Coastguard Worker ****************************************************************************/
vp8_horizontal_line_5_3_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)110*fb1b10abSAndroid Build Coastguard Worker void vp8_horizontal_line_5_3_scale_c(const unsigned char *source,
111*fb1b10abSAndroid Build Coastguard Worker unsigned int source_width,
112*fb1b10abSAndroid Build Coastguard Worker unsigned char *dest,
113*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
114*fb1b10abSAndroid Build Coastguard Worker unsigned int i;
115*fb1b10abSAndroid Build Coastguard Worker unsigned int a, b, c, d, e;
116*fb1b10abSAndroid Build Coastguard Worker unsigned char *des = dest;
117*fb1b10abSAndroid Build Coastguard Worker const unsigned char *src = source;
118*fb1b10abSAndroid Build Coastguard Worker
119*fb1b10abSAndroid Build Coastguard Worker (void)dest_width;
120*fb1b10abSAndroid Build Coastguard Worker
121*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < source_width; i += 5) {
122*fb1b10abSAndroid Build Coastguard Worker a = src[0];
123*fb1b10abSAndroid Build Coastguard Worker b = src[1];
124*fb1b10abSAndroid Build Coastguard Worker c = src[2];
125*fb1b10abSAndroid Build Coastguard Worker d = src[3];
126*fb1b10abSAndroid Build Coastguard Worker e = src[4];
127*fb1b10abSAndroid Build Coastguard Worker
128*fb1b10abSAndroid Build Coastguard Worker des[0] = (unsigned char)a;
129*fb1b10abSAndroid Build Coastguard Worker des[1] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
130*fb1b10abSAndroid Build Coastguard Worker des[2] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
131*fb1b10abSAndroid Build Coastguard Worker
132*fb1b10abSAndroid Build Coastguard Worker src += 5;
133*fb1b10abSAndroid Build Coastguard Worker des += 3;
134*fb1b10abSAndroid Build Coastguard Worker }
135*fb1b10abSAndroid Build Coastguard Worker }
136*fb1b10abSAndroid Build Coastguard Worker
vp8_vertical_band_5_3_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)137*fb1b10abSAndroid Build Coastguard Worker void vp8_vertical_band_5_3_scale_c(unsigned char *source,
138*fb1b10abSAndroid Build Coastguard Worker unsigned int src_pitch, unsigned char *dest,
139*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_pitch,
140*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
141*fb1b10abSAndroid Build Coastguard Worker unsigned int i;
142*fb1b10abSAndroid Build Coastguard Worker unsigned int a, b, c, d, e;
143*fb1b10abSAndroid Build Coastguard Worker unsigned char *des = dest;
144*fb1b10abSAndroid Build Coastguard Worker unsigned char *src = source;
145*fb1b10abSAndroid Build Coastguard Worker
146*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < dest_width; i++) {
147*fb1b10abSAndroid Build Coastguard Worker a = src[0 * src_pitch];
148*fb1b10abSAndroid Build Coastguard Worker b = src[1 * src_pitch];
149*fb1b10abSAndroid Build Coastguard Worker c = src[2 * src_pitch];
150*fb1b10abSAndroid Build Coastguard Worker d = src[3 * src_pitch];
151*fb1b10abSAndroid Build Coastguard Worker e = src[4 * src_pitch];
152*fb1b10abSAndroid Build Coastguard Worker
153*fb1b10abSAndroid Build Coastguard Worker des[0 * dest_pitch] = (unsigned char)a;
154*fb1b10abSAndroid Build Coastguard Worker des[1 * dest_pitch] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
155*fb1b10abSAndroid Build Coastguard Worker des[2 * dest_pitch] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
156*fb1b10abSAndroid Build Coastguard Worker
157*fb1b10abSAndroid Build Coastguard Worker src++;
158*fb1b10abSAndroid Build Coastguard Worker des++;
159*fb1b10abSAndroid Build Coastguard Worker }
160*fb1b10abSAndroid Build Coastguard Worker }
161*fb1b10abSAndroid Build Coastguard Worker
162*fb1b10abSAndroid Build Coastguard Worker /****************************************************************************
163*fb1b10abSAndroid Build Coastguard Worker *
164*fb1b10abSAndroid Build Coastguard Worker * ROUTINE : vp8_horizontal_line_1_2_scale_c
165*fb1b10abSAndroid Build Coastguard Worker *
166*fb1b10abSAndroid Build Coastguard Worker * INPUTS : const unsigned char *source : Pointer to source data.
167*fb1b10abSAndroid Build Coastguard Worker * unsigned int source_width : Stride of source.
168*fb1b10abSAndroid Build Coastguard Worker * unsigned char *dest : Pointer to destination data.
169*fb1b10abSAndroid Build Coastguard Worker * unsigned int dest_width : Stride of dest (UNUSED).
170*fb1b10abSAndroid Build Coastguard Worker *
171*fb1b10abSAndroid Build Coastguard Worker * OUTPUTS : None.
172*fb1b10abSAndroid Build Coastguard Worker *
173*fb1b10abSAndroid Build Coastguard Worker * RETURNS : void
174*fb1b10abSAndroid Build Coastguard Worker *
175*fb1b10abSAndroid Build Coastguard Worker * FUNCTION : Copies horizontal line of pixels from source to
176*fb1b10abSAndroid Build Coastguard Worker * destination scaling up by 1 to 2.
177*fb1b10abSAndroid Build Coastguard Worker *
178*fb1b10abSAndroid Build Coastguard Worker * SPECIAL NOTES : None.
179*fb1b10abSAndroid Build Coastguard Worker *
180*fb1b10abSAndroid Build Coastguard Worker ****************************************************************************/
vp8_horizontal_line_2_1_scale_c(const unsigned char * source,unsigned int source_width,unsigned char * dest,unsigned int dest_width)181*fb1b10abSAndroid Build Coastguard Worker void vp8_horizontal_line_2_1_scale_c(const unsigned char *source,
182*fb1b10abSAndroid Build Coastguard Worker unsigned int source_width,
183*fb1b10abSAndroid Build Coastguard Worker unsigned char *dest,
184*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
185*fb1b10abSAndroid Build Coastguard Worker unsigned int i;
186*fb1b10abSAndroid Build Coastguard Worker unsigned int a;
187*fb1b10abSAndroid Build Coastguard Worker unsigned char *des = dest;
188*fb1b10abSAndroid Build Coastguard Worker const unsigned char *src = source;
189*fb1b10abSAndroid Build Coastguard Worker
190*fb1b10abSAndroid Build Coastguard Worker (void)dest_width;
191*fb1b10abSAndroid Build Coastguard Worker
192*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < source_width; i += 2) {
193*fb1b10abSAndroid Build Coastguard Worker a = src[0];
194*fb1b10abSAndroid Build Coastguard Worker des[0] = (unsigned char)(a);
195*fb1b10abSAndroid Build Coastguard Worker src += 2;
196*fb1b10abSAndroid Build Coastguard Worker des += 1;
197*fb1b10abSAndroid Build Coastguard Worker }
198*fb1b10abSAndroid Build Coastguard Worker }
199*fb1b10abSAndroid Build Coastguard Worker
vp8_vertical_band_2_1_scale_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)200*fb1b10abSAndroid Build Coastguard Worker void vp8_vertical_band_2_1_scale_c(unsigned char *source,
201*fb1b10abSAndroid Build Coastguard Worker unsigned int src_pitch, unsigned char *dest,
202*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_pitch,
203*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
204*fb1b10abSAndroid Build Coastguard Worker (void)dest_pitch;
205*fb1b10abSAndroid Build Coastguard Worker (void)src_pitch;
206*fb1b10abSAndroid Build Coastguard Worker memcpy(dest, source, dest_width);
207*fb1b10abSAndroid Build Coastguard Worker }
208*fb1b10abSAndroid Build Coastguard Worker
vp8_vertical_band_2_1_scale_i_c(unsigned char * source,unsigned int src_pitch,unsigned char * dest,unsigned int dest_pitch,unsigned int dest_width)209*fb1b10abSAndroid Build Coastguard Worker void vp8_vertical_band_2_1_scale_i_c(unsigned char *source,
210*fb1b10abSAndroid Build Coastguard Worker unsigned int src_pitch,
211*fb1b10abSAndroid Build Coastguard Worker unsigned char *dest,
212*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_pitch,
213*fb1b10abSAndroid Build Coastguard Worker unsigned int dest_width) {
214*fb1b10abSAndroid Build Coastguard Worker int i;
215*fb1b10abSAndroid Build Coastguard Worker int temp;
216*fb1b10abSAndroid Build Coastguard Worker int width = dest_width;
217*fb1b10abSAndroid Build Coastguard Worker
218*fb1b10abSAndroid Build Coastguard Worker (void)dest_pitch;
219*fb1b10abSAndroid Build Coastguard Worker
220*fb1b10abSAndroid Build Coastguard Worker for (i = 0; i < width; i++) {
221*fb1b10abSAndroid Build Coastguard Worker temp = 8;
222*fb1b10abSAndroid Build Coastguard Worker temp += source[i - (int)src_pitch] * 3;
223*fb1b10abSAndroid Build Coastguard Worker temp += source[i] * 10;
224*fb1b10abSAndroid Build Coastguard Worker temp += source[i + src_pitch] * 3;
225*fb1b10abSAndroid Build Coastguard Worker temp >>= 4;
226*fb1b10abSAndroid Build Coastguard Worker dest[i] = (unsigned char)(temp);
227*fb1b10abSAndroid Build Coastguard Worker }
228*fb1b10abSAndroid Build Coastguard Worker }
229