Home | History | Annotate | Download | only in generic
      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