Home | History | Annotate | Download | only in common
      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_config.h"
     13 #include "vp8_rtcd.h"
     14 #include "vpx_mem/vpx_mem.h"
     15 #include "blockd.h"
     16 
     17 void vp8_build_intra_predictors_mby_s_c(MACROBLOCKD *x,
     18                                           unsigned char * yabove_row,
     19                                           unsigned char * yleft,
     20                                           int left_stride,
     21                                           unsigned char * ypred_ptr,
     22                                           int y_stride)
     23 {
     24     unsigned char yleft_col[16];
     25     unsigned char ytop_left = yabove_row[-1];
     26     int r, c, i;
     27 
     28     for (i = 0; i < 16; i++)
     29     {
     30         yleft_col[i] = yleft[i* left_stride];
     31     }
     32 
     33     /* for Y */
     34     switch (x->mode_info_context->mbmi.mode)
     35     {
     36     case DC_PRED:
     37     {
     38         int expected_dc;
     39         int shift;
     40         int average = 0;
     41 
     42 
     43         if (x->up_available || x->left_available)
     44         {
     45             if (x->up_available)
     46             {
     47                 for (i = 0; i < 16; i++)
     48                 {
     49                     average += yabove_row[i];
     50                 }
     51             }
     52 
     53             if (x->left_available)
     54             {
     55 
     56                 for (i = 0; i < 16; i++)
     57                 {
     58                     average += yleft_col[i];
     59                 }
     60 
     61             }
     62 
     63 
     64 
     65             shift = 3 + x->up_available + x->left_available;
     66             expected_dc = (average + (1 << (shift - 1))) >> shift;
     67         }
     68         else
     69         {
     70             expected_dc = 128;
     71         }
     72 
     73         /*vpx_memset(ypred_ptr, expected_dc, 256);*/
     74         for (r = 0; r < 16; r++)
     75         {
     76             vpx_memset(ypred_ptr, expected_dc, 16);
     77             ypred_ptr += y_stride;
     78         }
     79     }
     80     break;
     81     case V_PRED:
     82     {
     83 
     84         for (r = 0; r < 16; r++)
     85         {
     86 
     87             ((int *)ypred_ptr)[0] = ((int *)yabove_row)[0];
     88             ((int *)ypred_ptr)[1] = ((int *)yabove_row)[1];
     89             ((int *)ypred_ptr)[2] = ((int *)yabove_row)[2];
     90             ((int *)ypred_ptr)[3] = ((int *)yabove_row)[3];
     91             ypred_ptr += y_stride;
     92         }
     93     }
     94     break;
     95     case H_PRED:
     96     {
     97 
     98         for (r = 0; r < 16; r++)
     99         {
    100 
    101             vpx_memset(ypred_ptr, yleft_col[r], 16);
    102             ypred_ptr += y_stride;
    103         }
    104 
    105     }
    106     break;
    107     case TM_PRED:
    108     {
    109 
    110         for (r = 0; r < 16; r++)
    111         {
    112             for (c = 0; c < 16; c++)
    113             {
    114                 int pred =  yleft_col[r] + yabove_row[ c] - ytop_left;
    115 
    116                 if (pred < 0)
    117                     pred = 0;
    118 
    119                 if (pred > 255)
    120                     pred = 255;
    121 
    122                 ypred_ptr[c] = pred;
    123             }
    124 
    125             ypred_ptr += y_stride;
    126         }
    127 
    128     }
    129     break;
    130     case B_PRED:
    131     case NEARESTMV:
    132     case NEARMV:
    133     case ZEROMV:
    134     case NEWMV:
    135     case SPLITMV:
    136     case MB_MODE_COUNT:
    137         break;
    138     }
    139 }
    140 
    141 void vp8_build_intra_predictors_mbuv_s_c(MACROBLOCKD *x,
    142                                          unsigned char * uabove_row,
    143                                          unsigned char * vabove_row,
    144                                          unsigned char * uleft,
    145                                          unsigned char * vleft,
    146                                          int left_stride,
    147                                          unsigned char * upred_ptr,
    148                                          unsigned char * vpred_ptr,
    149                                          int pred_stride)
    150 {
    151     unsigned char uleft_col[8];
    152     unsigned char utop_left = uabove_row[-1];
    153     unsigned char vleft_col[8];
    154     unsigned char vtop_left = vabove_row[-1];
    155 
    156     int i, j;
    157 
    158     for (i = 0; i < 8; i++)
    159     {
    160         uleft_col[i] = uleft [i* left_stride];
    161         vleft_col[i] = vleft [i* left_stride];
    162     }
    163 
    164     switch (x->mode_info_context->mbmi.uv_mode)
    165     {
    166     case DC_PRED:
    167     {
    168         int expected_udc;
    169         int expected_vdc;
    170         int shift;
    171         int Uaverage = 0;
    172         int Vaverage = 0;
    173 
    174         if (x->up_available)
    175         {
    176             for (i = 0; i < 8; i++)
    177             {
    178                 Uaverage += uabove_row[i];
    179                 Vaverage += vabove_row[i];
    180             }
    181         }
    182 
    183         if (x->left_available)
    184         {
    185             for (i = 0; i < 8; i++)
    186             {
    187                 Uaverage += uleft_col[i];
    188                 Vaverage += vleft_col[i];
    189             }
    190         }
    191 
    192         if (!x->up_available && !x->left_available)
    193         {
    194             expected_udc = 128;
    195             expected_vdc = 128;
    196         }
    197         else
    198         {
    199             shift = 2 + x->up_available + x->left_available;
    200             expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
    201             expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
    202         }
    203 
    204 
    205         /*vpx_memset(upred_ptr,expected_udc,64);*/
    206         /*vpx_memset(vpred_ptr,expected_vdc,64);*/
    207         for (i = 0; i < 8; i++)
    208         {
    209             vpx_memset(upred_ptr, expected_udc, 8);
    210             vpx_memset(vpred_ptr, expected_vdc, 8);
    211             upred_ptr += pred_stride;
    212             vpred_ptr += pred_stride;
    213         }
    214     }
    215     break;
    216     case V_PRED:
    217     {
    218         for (i = 0; i < 8; i++)
    219         {
    220             vpx_memcpy(upred_ptr, uabove_row, 8);
    221             vpx_memcpy(vpred_ptr, vabove_row, 8);
    222             upred_ptr += pred_stride;
    223             vpred_ptr += pred_stride;
    224         }
    225 
    226     }
    227     break;
    228     case H_PRED:
    229     {
    230         for (i = 0; i < 8; i++)
    231         {
    232             vpx_memset(upred_ptr, uleft_col[i], 8);
    233             vpx_memset(vpred_ptr, vleft_col[i], 8);
    234             upred_ptr += pred_stride;
    235             vpred_ptr += pred_stride;
    236         }
    237     }
    238 
    239     break;
    240     case TM_PRED:
    241     {
    242         for (i = 0; i < 8; i++)
    243         {
    244             for (j = 0; j < 8; j++)
    245             {
    246                 int predu = uleft_col[i] + uabove_row[j] - utop_left;
    247                 int predv = vleft_col[i] + vabove_row[j] - vtop_left;
    248 
    249                 if (predu < 0)
    250                     predu = 0;
    251 
    252                 if (predu > 255)
    253                     predu = 255;
    254 
    255                 if (predv < 0)
    256                     predv = 0;
    257 
    258                 if (predv > 255)
    259                     predv = 255;
    260 
    261                 upred_ptr[j] = predu;
    262                 vpred_ptr[j] = predv;
    263             }
    264 
    265             upred_ptr += pred_stride;
    266             vpred_ptr += pred_stride;
    267         }
    268 
    269     }
    270     break;
    271     case B_PRED:
    272     case NEARESTMV:
    273     case NEARMV:
    274     case ZEROMV:
    275     case NEWMV:
    276     case SPLITMV:
    277     case MB_MODE_COUNT:
    278         break;
    279     }
    280 }
    281