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