Line data Source code
1 : /*
2 : * Copyright (c) 2016, Alliance for Open Media. All rights reserved
3 : *
4 : * This source code is subject to the terms of the BSD 2 Clause License and
5 : * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 : * was not distributed with this source code in the LICENSE file, you can
7 : * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 : * Media Patent License 1.0 was not distributed with this source code in the
9 : * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 : */
11 :
12 : #include "./aom_scale_rtcd.h"
13 : #include "aom_scale/aom_scale.h"
14 : #include "aom_mem/aom_mem.h"
15 : /****************************************************************************
16 : * Imports
17 : ****************************************************************************/
18 :
19 : /****************************************************************************
20 : *
21 : *
22 : * INPUTS : const unsigned char *source : Pointer to source data.
23 : * unsigned int source_width : Stride of source.
24 : * unsigned char *dest : Pointer to destination data.
25 : * unsigned int dest_width : Stride of destination
26 : * (NOT USED).
27 : *
28 : * OUTPUTS : None.
29 : *
30 : * RETURNS : void
31 : *
32 : * FUNCTION : Copies horizontal line of pixels from source to
33 : * destination scaling up by 4 to 5.
34 : *
35 : * SPECIAL NOTES : None.
36 : *
37 : ****************************************************************************/
38 0 : void aom_horizontal_line_5_4_scale_c(const unsigned char *source,
39 : unsigned int source_width,
40 : unsigned char *dest,
41 : unsigned int dest_width) {
42 0 : const unsigned char *const source_end = source + source_width;
43 : (void)dest_width;
44 :
45 0 : while (source < source_end) {
46 0 : const unsigned int a = source[0];
47 0 : const unsigned int b = source[1];
48 0 : const unsigned int c = source[2];
49 0 : const unsigned int d = source[3];
50 0 : const unsigned int e = source[4];
51 :
52 0 : dest[0] = (unsigned char)a;
53 0 : dest[1] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
54 0 : dest[2] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
55 0 : dest[3] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
56 :
57 0 : source += 5;
58 0 : dest += 4;
59 : }
60 0 : }
61 :
62 0 : void aom_vertical_band_5_4_scale_c(unsigned char *source, int src_pitch,
63 : unsigned char *dest, int dest_pitch,
64 : unsigned int dest_width) {
65 0 : const unsigned char *const dest_end = dest + dest_width;
66 0 : while (dest < dest_end) {
67 0 : const unsigned int a = source[0 * src_pitch];
68 0 : const unsigned int b = source[1 * src_pitch];
69 0 : const unsigned int c = source[2 * src_pitch];
70 0 : const unsigned int d = source[3 * src_pitch];
71 0 : const unsigned int e = source[4 * src_pitch];
72 :
73 0 : dest[0 * dest_pitch] = (unsigned char)a;
74 0 : dest[1 * dest_pitch] = (unsigned char)((b * 192 + c * 64 + 128) >> 8);
75 0 : dest[2 * dest_pitch] = (unsigned char)((c * 128 + d * 128 + 128) >> 8);
76 0 : dest[3 * dest_pitch] = (unsigned char)((d * 64 + e * 192 + 128) >> 8);
77 :
78 0 : ++source;
79 0 : ++dest;
80 : }
81 0 : }
82 :
83 : /*7***************************************************************************
84 : *
85 : * ROUTINE : aom_horizontal_line_3_5_scale_c
86 : *
87 : * INPUTS : const unsigned char *source : Pointer to source data.
88 : * unsigned int source_width : Stride of source.
89 : * unsigned char *dest : Pointer to destination data.
90 : * unsigned int dest_width : Stride of destination
91 : * (NOT USED).
92 : *
93 : * OUTPUTS : None.
94 : *
95 : * RETURNS : void
96 : *
97 : * FUNCTION : Copies horizontal line of pixels from source to
98 : * destination scaling up by 3 to 5.
99 : *
100 : * SPECIAL NOTES : None.
101 : *
102 : *
103 : ****************************************************************************/
104 0 : void aom_horizontal_line_5_3_scale_c(const unsigned char *source,
105 : unsigned int source_width,
106 : unsigned char *dest,
107 : unsigned int dest_width) {
108 0 : const unsigned char *const source_end = source + source_width;
109 : (void)dest_width;
110 0 : while (source < source_end) {
111 0 : const unsigned int a = source[0];
112 0 : const unsigned int b = source[1];
113 0 : const unsigned int c = source[2];
114 0 : const unsigned int d = source[3];
115 0 : const unsigned int e = source[4];
116 :
117 0 : dest[0] = (unsigned char)a;
118 0 : dest[1] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
119 0 : dest[2] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
120 :
121 0 : source += 5;
122 0 : dest += 3;
123 : }
124 0 : }
125 :
126 0 : void aom_vertical_band_5_3_scale_c(unsigned char *source, int src_pitch,
127 : unsigned char *dest, int dest_pitch,
128 : unsigned int dest_width) {
129 0 : const unsigned char *const dest_end = dest + dest_width;
130 0 : while (dest < dest_end) {
131 0 : const unsigned int a = source[0 * src_pitch];
132 0 : const unsigned int b = source[1 * src_pitch];
133 0 : const unsigned int c = source[2 * src_pitch];
134 0 : const unsigned int d = source[3 * src_pitch];
135 0 : const unsigned int e = source[4 * src_pitch];
136 :
137 0 : dest[0 * dest_pitch] = (unsigned char)a;
138 0 : dest[1 * dest_pitch] = (unsigned char)((b * 85 + c * 171 + 128) >> 8);
139 0 : dest[2 * dest_pitch] = (unsigned char)((d * 171 + e * 85 + 128) >> 8);
140 :
141 0 : ++source;
142 0 : ++dest;
143 : }
144 0 : }
145 :
146 : /****************************************************************************
147 : *
148 : * ROUTINE : aom_horizontal_line_1_2_scale_c
149 : *
150 : * INPUTS : const unsigned char *source : Pointer to source data.
151 : * unsigned int source_width : Stride of source.
152 : * unsigned char *dest : Pointer to destination data.
153 : * unsigned int dest_width : Stride of destination
154 : * (NOT USED).
155 : *
156 : * OUTPUTS : None.
157 : *
158 : * RETURNS : void
159 : *
160 : * FUNCTION : Copies horizontal line of pixels from source to
161 : * destination scaling up by 1 to 2.
162 : *
163 : * SPECIAL NOTES : None.
164 : *
165 : ****************************************************************************/
166 0 : void aom_horizontal_line_2_1_scale_c(const unsigned char *source,
167 : unsigned int source_width,
168 : unsigned char *dest,
169 : unsigned int dest_width) {
170 0 : const unsigned char *const source_end = source + source_width;
171 : (void)dest_width;
172 0 : while (source < source_end) {
173 0 : dest[0] = source[0];
174 0 : source += 2;
175 0 : ++dest;
176 : }
177 0 : }
178 :
179 0 : void aom_vertical_band_2_1_scale_c(unsigned char *source, int src_pitch,
180 : unsigned char *dest, int dest_pitch,
181 : unsigned int dest_width) {
182 : (void)dest_pitch;
183 : (void)src_pitch;
184 0 : memcpy(dest, source, dest_width);
185 0 : }
186 :
187 0 : void aom_vertical_band_2_1_scale_i_c(unsigned char *source, int src_pitch,
188 : unsigned char *dest, int dest_pitch,
189 : unsigned int dest_width) {
190 0 : const unsigned char *const dest_end = dest + dest_width;
191 : (void)dest_pitch;
192 0 : while (dest < dest_end) {
193 0 : const unsigned int a = source[-src_pitch] * 3;
194 0 : const unsigned int b = source[0] * 10;
195 0 : const unsigned int c = source[src_pitch] * 3;
196 0 : dest[0] = (unsigned char)((8 + a + b + c) >> 4);
197 0 : ++source;
198 0 : ++dest;
199 : }
200 0 : }
|