media/libvpx/vp8/common/reconintra4x4.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_config.h"
    13 #include "vp8_rtcd.h"
    14 #include "blockd.h"
    16 void vp8_intra4x4_predict_c(unsigned char *Above,
    17                             unsigned char *yleft, int left_stride,
    18                             int           _b_mode,
    19                             unsigned char *dst, int dst_stride,
    20                             unsigned char top_left)
    21 {
    22     int i, r, c;
    23     B_PREDICTION_MODE b_mode = (B_PREDICTION_MODE)_b_mode;
    24     unsigned char Left[4];
    25     Left[0] = yleft[0];
    26     Left[1] = yleft[left_stride];
    27     Left[2] = yleft[2 * left_stride];
    28     Left[3] = yleft[3 * left_stride];
    30     switch (b_mode)
    31     {
    32     case B_DC_PRED:
    33     {
    34         int expected_dc = 0;
    36         for (i = 0; i < 4; i++)
    37         {
    38             expected_dc += Above[i];
    39             expected_dc += Left[i];
    40         }
    42         expected_dc = (expected_dc + 4) >> 3;
    44         for (r = 0; r < 4; r++)
    45         {
    46             for (c = 0; c < 4; c++)
    47             {
    48                 dst[c] = expected_dc;
    49             }
    51             dst += dst_stride;
    52         }
    53     }
    54     break;
    55     case B_TM_PRED:
    56     {
    57         /* prediction similar to true_motion prediction */
    58         for (r = 0; r < 4; r++)
    59         {
    60             for (c = 0; c < 4; c++)
    61             {
    62                 int pred = Above[c] - top_left + Left[r];
    64                 if (pred < 0)
    65                     pred = 0;
    67                 if (pred > 255)
    68                     pred = 255;
    70                 dst[c] = pred;
    71             }
    73             dst += dst_stride;
    74         }
    75     }
    76     break;
    78     case B_VE_PRED:
    79     {
    81         unsigned int ap[4];
    82         ap[0] = (top_left  + 2 * Above[0] + Above[1] + 2) >> 2;
    83         ap[1] = (Above[0] + 2 * Above[1] + Above[2] + 2) >> 2;
    84         ap[2] = (Above[1] + 2 * Above[2] + Above[3] + 2) >> 2;
    85         ap[3] = (Above[2] + 2 * Above[3] + Above[4] + 2) >> 2;
    87         for (r = 0; r < 4; r++)
    88         {
    89             for (c = 0; c < 4; c++)
    90             {
    92                 dst[c] = ap[c];
    93             }
    95             dst += dst_stride;
    96         }
    98     }
    99     break;
   102     case B_HE_PRED:
   103     {
   105         unsigned int lp[4];
   106         lp[0] = (top_left + 2 * Left[0] + Left[1] + 2) >> 2;
   107         lp[1] = (Left[0] + 2 * Left[1] + Left[2] + 2) >> 2;
   108         lp[2] = (Left[1] + 2 * Left[2] + Left[3] + 2) >> 2;
   109         lp[3] = (Left[2] + 2 * Left[3] + Left[3] + 2) >> 2;
   111         for (r = 0; r < 4; r++)
   112         {
   113             for (c = 0; c < 4; c++)
   114             {
   115                 dst[c] = lp[r];
   116             }
   118             dst += dst_stride;
   119         }
   120     }
   121     break;
   122     case B_LD_PRED:
   123     {
   124         unsigned char *ptr = Above;
   125         dst[0 * dst_stride + 0] = (ptr[0] + ptr[1] * 2 + ptr[2] + 2) >> 2;
   126         dst[0 * dst_stride + 1] =
   127             dst[1 * dst_stride + 0] = (ptr[1] + ptr[2] * 2 + ptr[3] + 2) >> 2;
   128         dst[0 * dst_stride + 2] =
   129             dst[1 * dst_stride + 1] =
   130                 dst[2 * dst_stride + 0] = (ptr[2] + ptr[3] * 2 + ptr[4] + 2) >> 2;
   131         dst[0 * dst_stride + 3] =
   132             dst[1 * dst_stride + 2] =
   133                 dst[2 * dst_stride + 1] =
   134                     dst[3 * dst_stride + 0] = (ptr[3] + ptr[4] * 2 + ptr[5] + 2) >> 2;
   135         dst[1 * dst_stride + 3] =
   136             dst[2 * dst_stride + 2] =
   137                 dst[3 * dst_stride + 1] = (ptr[4] + ptr[5] * 2 + ptr[6] + 2) >> 2;
   138         dst[2 * dst_stride + 3] =
   139             dst[3 * dst_stride + 2] = (ptr[5] + ptr[6] * 2 + ptr[7] + 2) >> 2;
   140         dst[3 * dst_stride + 3] = (ptr[6] + ptr[7] * 2 + ptr[7] + 2) >> 2;
   142     }
   143     break;
   144     case B_RD_PRED:
   145     {
   147         unsigned char pp[9];
   149         pp[0] = Left[3];
   150         pp[1] = Left[2];
   151         pp[2] = Left[1];
   152         pp[3] = Left[0];
   153         pp[4] = top_left;
   154         pp[5] = Above[0];
   155         pp[6] = Above[1];
   156         pp[7] = Above[2];
   157         pp[8] = Above[3];
   159         dst[3 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
   160         dst[3 * dst_stride + 1] =
   161             dst[2 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
   162         dst[3 * dst_stride + 2] =
   163             dst[2 * dst_stride + 1] =
   164                 dst[1 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
   165         dst[3 * dst_stride + 3] =
   166             dst[2 * dst_stride + 2] =
   167                 dst[1 * dst_stride + 1] =
   168                     dst[0 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
   169         dst[2 * dst_stride + 3] =
   170             dst[1 * dst_stride + 2] =
   171                 dst[0 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
   172         dst[1 * dst_stride + 3] =
   173             dst[0 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
   174         dst[0 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
   176     }
   177     break;
   178     case B_VR_PRED:
   179     {
   181         unsigned char pp[9];
   183         pp[0] = Left[3];
   184         pp[1] = Left[2];
   185         pp[2] = Left[1];
   186         pp[3] = Left[0];
   187         pp[4] = top_left;
   188         pp[5] = Above[0];
   189         pp[6] = Above[1];
   190         pp[7] = Above[2];
   191         pp[8] = Above[3];
   194         dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
   195         dst[2 * dst_stride + 0] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
   196         dst[3 * dst_stride + 1] =
   197             dst[1 * dst_stride + 0] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
   198         dst[2 * dst_stride + 1] =
   199             dst[0 * dst_stride + 0] = (pp[4] + pp[5] + 1) >> 1;
   200         dst[3 * dst_stride + 2] =
   201             dst[1 * dst_stride + 1] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
   202         dst[2 * dst_stride + 2] =
   203             dst[0 * dst_stride + 1] = (pp[5] + pp[6] + 1) >> 1;
   204         dst[3 * dst_stride + 3] =
   205             dst[1 * dst_stride + 2] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
   206         dst[2 * dst_stride + 3] =
   207             dst[0 * dst_stride + 2] = (pp[6] + pp[7] + 1) >> 1;
   208         dst[1 * dst_stride + 3] = (pp[6] + pp[7] * 2 + pp[8] + 2) >> 2;
   209         dst[0 * dst_stride + 3] = (pp[7] + pp[8] + 1) >> 1;
   211     }
   212     break;
   213     case B_VL_PRED:
   214     {
   216         unsigned char *pp = Above;
   218         dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
   219         dst[1 * dst_stride + 0] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
   220         dst[2 * dst_stride + 0] =
   221             dst[0 * dst_stride + 1] = (pp[1] + pp[2] + 1) >> 1;
   222         dst[1 * dst_stride + 1] =
   223             dst[3 * dst_stride + 0] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
   224         dst[2 * dst_stride + 1] =
   225             dst[0 * dst_stride + 2] = (pp[2] + pp[3] + 1) >> 1;
   226         dst[3 * dst_stride + 1] =
   227             dst[1 * dst_stride + 2] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
   228         dst[0 * dst_stride + 3] =
   229             dst[2 * dst_stride + 2] = (pp[3] + pp[4] + 1) >> 1;
   230         dst[1 * dst_stride + 3] =
   231             dst[3 * dst_stride + 2] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
   232         dst[2 * dst_stride + 3] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
   233         dst[3 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
   234     }
   235     break;
   237     case B_HD_PRED:
   238     {
   239         unsigned char pp[9];
   240         pp[0] = Left[3];
   241         pp[1] = Left[2];
   242         pp[2] = Left[1];
   243         pp[3] = Left[0];
   244         pp[4] = top_left;
   245         pp[5] = Above[0];
   246         pp[6] = Above[1];
   247         pp[7] = Above[2];
   248         pp[8] = Above[3];
   251         dst[3 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
   252         dst[3 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
   253         dst[2 * dst_stride + 0] =
   254             dst[3 * dst_stride + 2] = (pp[1] + pp[2] + 1) >> 1;
   255         dst[2 * dst_stride + 1] =
   256             dst[3 * dst_stride + 3] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
   257         dst[2 * dst_stride + 2] =
   258             dst[1 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
   259         dst[2 * dst_stride + 3] =
   260             dst[1 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[4] + 2) >> 2;
   261         dst[1 * dst_stride + 2] =
   262             dst[0 * dst_stride + 0] = (pp[3] + pp[4] + 1) >> 1;
   263         dst[1 * dst_stride + 3] =
   264             dst[0 * dst_stride + 1] = (pp[3] + pp[4] * 2 + pp[5] + 2) >> 2;
   265         dst[0 * dst_stride + 2] = (pp[4] + pp[5] * 2 + pp[6] + 2) >> 2;
   266         dst[0 * dst_stride + 3] = (pp[5] + pp[6] * 2 + pp[7] + 2) >> 2;
   267     }
   268     break;
   271     case B_HU_PRED:
   272     {
   273         unsigned char *pp = Left;
   274         dst[0 * dst_stride + 0] = (pp[0] + pp[1] + 1) >> 1;
   275         dst[0 * dst_stride + 1] = (pp[0] + pp[1] * 2 + pp[2] + 2) >> 2;
   276         dst[0 * dst_stride + 2] =
   277             dst[1 * dst_stride + 0] = (pp[1] + pp[2] + 1) >> 1;
   278         dst[0 * dst_stride + 3] =
   279             dst[1 * dst_stride + 1] = (pp[1] + pp[2] * 2 + pp[3] + 2) >> 2;
   280         dst[1 * dst_stride + 2] =
   281             dst[2 * dst_stride + 0] = (pp[2] + pp[3] + 1) >> 1;
   282         dst[1 * dst_stride + 3] =
   283             dst[2 * dst_stride + 1] = (pp[2] + pp[3] * 2 + pp[3] + 2) >> 2;
   284         dst[2 * dst_stride + 2] =
   285             dst[2 * dst_stride + 3] =
   286                 dst[3 * dst_stride + 0] =
   287                     dst[3 * dst_stride + 1] =
   288                         dst[3 * dst_stride + 2] =
   289                             dst[3 * dst_stride + 3] = pp[3];
   290     }
   291     break;
   293     default:
   294     break;
   296     }
   297 }

mercurial