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