media/libvpx/vpx_scale/generic/gen_scalers.c

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     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  */
    12 #include "vpx_scale/vpx_scale.h"
    13 #include "vpx_mem/vpx_mem.h"
    14 /****************************************************************************
    15 *  Imports
    16 ****************************************************************************/
    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;
    45   (void) dest_width;
    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];
    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);
    59     src += 5;
    60     des += 4;
    61   }
    62 }
    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;
    77   for (i = 0; i < dest_width; i++) {
    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];
    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);
    90     src++;
    91     des++;
    93   }
    94 }
    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;
   126   (void) dest_width;
   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];
   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);
   139     src += 5;
   140     des += 3;
   141   }
   143 }
   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;
   155   for (i = 0; i < dest_width; i++) {
   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];
   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);
   167     src++;
   168     des++;
   170   }
   171 }
   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;
   201   (void) dest_width;
   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 }
   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 }
   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;
   230   (void) dest_pitch;
   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 }

mercurial