Home | History | Annotate | Download | only in encoder
      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_ports/config.h"
     13 #include "vp8/common/idct.h"
     14 #include "quantize.h"
     15 #include "vp8/common/reconintra.h"
     16 #include "vp8/common/reconintra4x4.h"
     17 #include "encodemb.h"
     18 #include "vp8/common/invtrans.h"
     19 #include "vp8/common/recon.h"
     20 #include "dct.h"
     21 #include "vp8/common/g_common.h"
     22 #include "encodeintra.h"
     23 
     24 #define intra4x4ibias_rate    128
     25 #define intra4x4pbias_rate    256
     26 
     27 
     28 #if CONFIG_RUNTIME_CPU_DETECT
     29 #define IF_RTCD(x) (x)
     30 #else
     31 #define IF_RTCD(x) NULL
     32 #endif
     33 void vp8_encode_intra4x4block(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x, BLOCK *be, BLOCKD *b, int best_mode)
     34 {
     35     vp8_predict_intra4x4(b, best_mode, b->predictor);
     36 
     37     ENCODEMB_INVOKE(&rtcd->encodemb, subb)(be, b, 16);
     38 
     39     x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
     40 
     41     x->quantize_b(be, b);
     42 
     43     vp8_inverse_transform_b(IF_RTCD(&rtcd->common->idct), b, 32);
     44 
     45     RECON_INVOKE(&rtcd->common->recon, recon)(b->predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride);
     46 }
     47 
     48 void vp8_encode_intra4x4mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *mb)
     49 {
     50     int i;
     51 
     52     MACROBLOCKD *x = &mb->e_mbd;
     53     vp8_intra_prediction_down_copy(x);
     54 
     55     for (i = 0; i < 16; i++)
     56     {
     57         BLOCK *be = &mb->block[i];
     58         BLOCKD *b = &x->block[i];
     59 
     60         vp8_encode_intra4x4block(rtcd, mb, be, b, b->bmi.mode);
     61     }
     62 
     63     return;
     64 }
     65 
     66 void vp8_encode_intra16x16mby(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x)
     67 {
     68     int b;
     69 
     70     RECON_INVOKE(&rtcd->common->recon, build_intra_predictors_mby)(&x->e_mbd);
     71 
     72     ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, x->src.y_buffer, x->e_mbd.predictor, x->src.y_stride);
     73 
     74     vp8_transform_intra_mby(x);
     75 
     76     vp8_quantize_mby(x);
     77 
     78 #if !(CONFIG_REALTIME_ONLY)
     79 #if 1
     80     if (x->optimize)
     81         vp8_optimize_mby(x, rtcd);
     82 
     83 #endif
     84 #endif
     85 
     86     vp8_inverse_transform_mby(IF_RTCD(&rtcd->common->idct), &x->e_mbd);
     87 
     88     RECON_INVOKE(&rtcd->common->recon, recon_mby)
     89         (IF_RTCD(&rtcd->common->recon), &x->e_mbd);
     90 
     91     // make sure block modes are set the way we want them for context updates
     92     for (b = 0; b < 16; b++)
     93     {
     94         BLOCKD *d = &x->e_mbd.block[b];
     95 
     96         switch (x->e_mbd.mode_info_context->mbmi.mode)
     97         {
     98 
     99         case DC_PRED:
    100             d->bmi.mode = B_DC_PRED;
    101             break;
    102         case V_PRED:
    103             d->bmi.mode = B_VE_PRED;
    104             break;
    105         case H_PRED:
    106             d->bmi.mode = B_HE_PRED;
    107             break;
    108         case TM_PRED:
    109             d->bmi.mode = B_TM_PRED;
    110             break;
    111         default:
    112             d->bmi.mode = B_DC_PRED;
    113             break;
    114 
    115         }
    116     }
    117 }
    118 
    119 void vp8_encode_intra16x16mbuv(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x)
    120 {
    121     vp8_build_intra_predictors_mbuv(&x->e_mbd);
    122 
    123     ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride);
    124 
    125     vp8_transform_mbuv(x);
    126 
    127     vp8_quantize_mbuv(x);
    128 
    129 #if !(CONFIG_REALTIME_ONLY)
    130 #if 1
    131 
    132     if (x->optimize==2 ||(x->optimize && x->rddiv > 1))
    133         vp8_optimize_mbuv(x, rtcd);
    134 
    135 #endif
    136 #endif
    137 
    138     vp8_inverse_transform_mbuv(IF_RTCD(&rtcd->common->idct), &x->e_mbd);
    139 
    140     vp8_recon_intra_mbuv(IF_RTCD(&rtcd->common->recon), &x->e_mbd);
    141 }
    142 
    143