11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 13ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang#include "vp8_rtcd.h" 14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vpx_dsp_rtcd.h" 15da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "vp8/encoder/quantize.h" 162263fc984bdc858ee931d3e35c87c404de923950Johann#include "vp8/common/reconintra.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "encodemb.h" 191b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/invtrans.h" 201b362b15af34006e6a11974088a46d42b903418eJohann#include "encodeintra.h" 211b362b15af34006e6a11974088a46d42b903418eJohann 221b362b15af34006e6a11974088a46d42b903418eJohann 231b362b15af34006e6a11974088a46d42b903418eJohannint vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred) 241b362b15af34006e6a11974088a46d42b903418eJohann{ 251b362b15af34006e6a11974088a46d42b903418eJohann 261b362b15af34006e6a11974088a46d42b903418eJohann int i; 271b362b15af34006e6a11974088a46d42b903418eJohann int intra_pred_var = 0; 281b362b15af34006e6a11974088a46d42b903418eJohann (void) cpi; 291b362b15af34006e6a11974088a46d42b903418eJohann 301b362b15af34006e6a11974088a46d42b903418eJohann if (use_dc_pred) 311b362b15af34006e6a11974088a46d42b903418eJohann { 321b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = DC_PRED; 331b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 341b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 351b362b15af34006e6a11974088a46d42b903418eJohann 361b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra16x16mby(x); 371b362b15af34006e6a11974088a46d42b903418eJohann 381b362b15af34006e6a11974088a46d42b903418eJohann vp8_inverse_transform_mby(&x->e_mbd); 391b362b15af34006e6a11974088a46d42b903418eJohann } 401b362b15af34006e6a11974088a46d42b903418eJohann else 411b362b15af34006e6a11974088a46d42b903418eJohann { 421b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 431b362b15af34006e6a11974088a46d42b903418eJohann { 441b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.block[i].bmi.as_mode = B_DC_PRED; 451b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra4x4block(x, i); 461b362b15af34006e6a11974088a46d42b903418eJohann } 471b362b15af34006e6a11974088a46d42b903418eJohann } 481b362b15af34006e6a11974088a46d42b903418eJohann 49da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian intra_pred_var = vpx_get_mb_ss(x->src_diff); 501b362b15af34006e6a11974088a46d42b903418eJohann 511b362b15af34006e6a11974088a46d42b903418eJohann return intra_pred_var; 521b362b15af34006e6a11974088a46d42b903418eJohann} 531b362b15af34006e6a11974088a46d42b903418eJohann 541b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra4x4block(MACROBLOCK *x, int ib) 551b362b15af34006e6a11974088a46d42b903418eJohann{ 561b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b = &x->e_mbd.block[ib]; 571b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be = &x->block[ib]; 581b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->e_mbd.dst.y_stride; 591b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 601b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *Above = dst - dst_stride; 611b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *yleft = dst - 1; 621b362b15af34006e6a11974088a46d42b903418eJohann unsigned char top_left = Above[-1]; 631b362b15af34006e6a11974088a46d42b903418eJohann 641b362b15af34006e6a11974088a46d42b903418eJohann vp8_intra4x4_predict(Above, yleft, dst_stride, b->bmi.as_mode, 651b362b15af34006e6a11974088a46d42b903418eJohann b->predictor, 16, top_left); 661b362b15af34006e6a11974088a46d42b903418eJohann 671b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_b(be, b, 16); 681b362b15af34006e6a11974088a46d42b903418eJohann 691b362b15af34006e6a11974088a46d42b903418eJohann x->short_fdct4x4(be->src_diff, be->coeff, 32); 701b362b15af34006e6a11974088a46d42b903418eJohann 711b362b15af34006e6a11974088a46d42b903418eJohann x->quantize_b(be, b); 721b362b15af34006e6a11974088a46d42b903418eJohann 731b362b15af34006e6a11974088a46d42b903418eJohann if (*b->eob > 1) 741b362b15af34006e6a11974088a46d42b903418eJohann { 751b362b15af34006e6a11974088a46d42b903418eJohann vp8_short_idct4x4llm(b->dqcoeff, b->predictor, 16, dst, dst_stride); 761b362b15af34006e6a11974088a46d42b903418eJohann } 771b362b15af34006e6a11974088a46d42b903418eJohann else 781b362b15af34006e6a11974088a46d42b903418eJohann { 791b362b15af34006e6a11974088a46d42b903418eJohann vp8_dc_only_idct_add(b->dqcoeff[0], b->predictor, 16, dst, dst_stride); 801b362b15af34006e6a11974088a46d42b903418eJohann } 811b362b15af34006e6a11974088a46d42b903418eJohann} 821b362b15af34006e6a11974088a46d42b903418eJohann 831b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra4x4mby(MACROBLOCK *mb) 841b362b15af34006e6a11974088a46d42b903418eJohann{ 851b362b15af34006e6a11974088a46d42b903418eJohann int i; 861b362b15af34006e6a11974088a46d42b903418eJohann 871b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &mb->e_mbd; 881b362b15af34006e6a11974088a46d42b903418eJohann intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 891b362b15af34006e6a11974088a46d42b903418eJohann 901b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 911b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra4x4block(mb, i); 921b362b15af34006e6a11974088a46d42b903418eJohann return; 931b362b15af34006e6a11974088a46d42b903418eJohann} 941b362b15af34006e6a11974088a46d42b903418eJohann 951b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra16x16mby(MACROBLOCK *x) 961b362b15af34006e6a11974088a46d42b903418eJohann{ 971b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 981b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 991b362b15af34006e6a11974088a46d42b903418eJohann 1001b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 1011b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 1021b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 1031b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 1041b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer, 1051b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride); 1061b362b15af34006e6a11974088a46d42b903418eJohann 1071b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mby(x->src_diff, *(b->base_src), 1081b362b15af34006e6a11974088a46d42b903418eJohann b->src_stride, xd->dst.y_buffer, xd->dst.y_stride); 1091b362b15af34006e6a11974088a46d42b903418eJohann 1101b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_intra_mby(x); 1111b362b15af34006e6a11974088a46d42b903418eJohann 1121b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mby(x); 1131b362b15af34006e6a11974088a46d42b903418eJohann 1141b362b15af34006e6a11974088a46d42b903418eJohann if (x->optimize) 1151b362b15af34006e6a11974088a46d42b903418eJohann vp8_optimize_mby(x); 1161b362b15af34006e6a11974088a46d42b903418eJohann} 1171b362b15af34006e6a11974088a46d42b903418eJohann 1181b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra16x16mbuv(MACROBLOCK *x) 1191b362b15af34006e6a11974088a46d42b903418eJohann{ 1201b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride, 1231b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - xd->dst.uv_stride, 1241b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer - 1, 1251b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - 1, 1261b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride, 1271b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 1281b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride); 1291b362b15af34006e6a11974088a46d42b903418eJohann 1301b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, 1311b362b15af34006e6a11974088a46d42b903418eJohann x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer, 1321b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer, xd->dst.uv_stride); 1331b362b15af34006e6a11974088a46d42b903418eJohann 1341b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_mbuv(x); 1351b362b15af34006e6a11974088a46d42b903418eJohann 1361b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mbuv(x); 1371b362b15af34006e6a11974088a46d42b903418eJohann 1381b362b15af34006e6a11974088a46d42b903418eJohann if (x->optimize) 1391b362b15af34006e6a11974088a46d42b903418eJohann vp8_optimize_mbuv(x); 1401b362b15af34006e6a11974088a46d42b903418eJohann} 141