Coverage Report

Created: 2024-09-06 07:53

/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
}