/src/libvpx/vpx_scale/generic/gen_scalers.c
Line | Count | Source (jump to first uncovered line) |
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 | | void vp8_horizontal_line_5_4_scale_c(const unsigned char *source, |
37 | | unsigned int source_width, |
38 | | unsigned char *dest, |
39 | 0 | unsigned int dest_width) { |
40 | 0 | unsigned i; |
41 | 0 | unsigned int a, b, c, d, e; |
42 | 0 | unsigned char *des = dest; |
43 | 0 | const unsigned char *src = source; |
44 | |
|
45 | 0 | (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 | 0 | } |
62 | 0 | } |
63 | | |
64 | | 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 | 0 | unsigned int dest_width) { |
68 | 0 | unsigned int i; |
69 | 0 | 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 | 0 | } |
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 | | void vp8_horizontal_line_5_3_scale_c(const unsigned char *source, |
111 | | unsigned int source_width, |
112 | | unsigned char *dest, |
113 | 0 | unsigned int dest_width) { |
114 | 0 | unsigned int i; |
115 | 0 | unsigned int a, b, c, d, e; |
116 | 0 | unsigned char *des = dest; |
117 | 0 | const unsigned char *src = source; |
118 | |
|
119 | 0 | (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 | 0 | } |
135 | 0 | } |
136 | | |
137 | | 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 | 0 | unsigned int dest_width) { |
141 | 0 | unsigned int i; |
142 | 0 | 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 | 0 | } |
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 | | void vp8_horizontal_line_2_1_scale_c(const unsigned char *source, |
182 | | unsigned int source_width, |
183 | | unsigned char *dest, |
184 | 0 | unsigned int dest_width) { |
185 | 0 | unsigned int i; |
186 | 0 | unsigned int a; |
187 | 0 | unsigned char *des = dest; |
188 | 0 | const unsigned char *src = source; |
189 | |
|
190 | 0 | (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 | 0 | } |
198 | 0 | } |
199 | | |
200 | | 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 | 0 | unsigned int dest_width) { |
204 | 0 | (void)dest_pitch; |
205 | 0 | (void)src_pitch; |
206 | 0 | memcpy(dest, source, dest_width); |
207 | 0 | } |
208 | | |
209 | | 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 | 0 | unsigned int dest_width) { |
214 | 0 | int i; |
215 | 0 | int temp; |
216 | 0 | int width = dest_width; |
217 | |
|
218 | 0 | (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 | 0 | } |
228 | 0 | } |