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