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" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "quantize.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "encodemb.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/invtrans.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "encodeintra.h" 191b362b15af34006e6a11974088a46d42b903418eJohann 201b362b15af34006e6a11974088a46d42b903418eJohann 211b362b15af34006e6a11974088a46d42b903418eJohannint vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred) 221b362b15af34006e6a11974088a46d42b903418eJohann{ 231b362b15af34006e6a11974088a46d42b903418eJohann 241b362b15af34006e6a11974088a46d42b903418eJohann int i; 251b362b15af34006e6a11974088a46d42b903418eJohann int intra_pred_var = 0; 261b362b15af34006e6a11974088a46d42b903418eJohann (void) cpi; 271b362b15af34006e6a11974088a46d42b903418eJohann 281b362b15af34006e6a11974088a46d42b903418eJohann if (use_dc_pred) 291b362b15af34006e6a11974088a46d42b903418eJohann { 301b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = DC_PRED; 311b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 321b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 331b362b15af34006e6a11974088a46d42b903418eJohann 341b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra16x16mby(x); 351b362b15af34006e6a11974088a46d42b903418eJohann 361b362b15af34006e6a11974088a46d42b903418eJohann vp8_inverse_transform_mby(&x->e_mbd); 371b362b15af34006e6a11974088a46d42b903418eJohann } 381b362b15af34006e6a11974088a46d42b903418eJohann else 391b362b15af34006e6a11974088a46d42b903418eJohann { 401b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 411b362b15af34006e6a11974088a46d42b903418eJohann { 421b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.block[i].bmi.as_mode = B_DC_PRED; 431b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra4x4block(x, i); 441b362b15af34006e6a11974088a46d42b903418eJohann } 451b362b15af34006e6a11974088a46d42b903418eJohann } 461b362b15af34006e6a11974088a46d42b903418eJohann 471b362b15af34006e6a11974088a46d42b903418eJohann intra_pred_var = vp8_get_mb_ss(x->src_diff); 481b362b15af34006e6a11974088a46d42b903418eJohann 491b362b15af34006e6a11974088a46d42b903418eJohann return intra_pred_var; 501b362b15af34006e6a11974088a46d42b903418eJohann} 511b362b15af34006e6a11974088a46d42b903418eJohann 521b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra4x4block(MACROBLOCK *x, int ib) 531b362b15af34006e6a11974088a46d42b903418eJohann{ 541b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b = &x->e_mbd.block[ib]; 551b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be = &x->block[ib]; 561b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->e_mbd.dst.y_stride; 571b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 581b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *Above = dst - dst_stride; 591b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *yleft = dst - 1; 601b362b15af34006e6a11974088a46d42b903418eJohann unsigned char top_left = Above[-1]; 611b362b15af34006e6a11974088a46d42b903418eJohann 621b362b15af34006e6a11974088a46d42b903418eJohann vp8_intra4x4_predict(Above, yleft, dst_stride, b->bmi.as_mode, 631b362b15af34006e6a11974088a46d42b903418eJohann b->predictor, 16, top_left); 641b362b15af34006e6a11974088a46d42b903418eJohann 651b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_b(be, b, 16); 661b362b15af34006e6a11974088a46d42b903418eJohann 671b362b15af34006e6a11974088a46d42b903418eJohann x->short_fdct4x4(be->src_diff, be->coeff, 32); 681b362b15af34006e6a11974088a46d42b903418eJohann 691b362b15af34006e6a11974088a46d42b903418eJohann x->quantize_b(be, b); 701b362b15af34006e6a11974088a46d42b903418eJohann 711b362b15af34006e6a11974088a46d42b903418eJohann if (*b->eob > 1) 721b362b15af34006e6a11974088a46d42b903418eJohann { 731b362b15af34006e6a11974088a46d42b903418eJohann vp8_short_idct4x4llm(b->dqcoeff, b->predictor, 16, dst, dst_stride); 741b362b15af34006e6a11974088a46d42b903418eJohann } 751b362b15af34006e6a11974088a46d42b903418eJohann else 761b362b15af34006e6a11974088a46d42b903418eJohann { 771b362b15af34006e6a11974088a46d42b903418eJohann vp8_dc_only_idct_add(b->dqcoeff[0], b->predictor, 16, dst, dst_stride); 781b362b15af34006e6a11974088a46d42b903418eJohann } 791b362b15af34006e6a11974088a46d42b903418eJohann} 801b362b15af34006e6a11974088a46d42b903418eJohann 811b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra4x4mby(MACROBLOCK *mb) 821b362b15af34006e6a11974088a46d42b903418eJohann{ 831b362b15af34006e6a11974088a46d42b903418eJohann int i; 841b362b15af34006e6a11974088a46d42b903418eJohann 851b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &mb->e_mbd; 861b362b15af34006e6a11974088a46d42b903418eJohann intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 871b362b15af34006e6a11974088a46d42b903418eJohann 881b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 891b362b15af34006e6a11974088a46d42b903418eJohann vp8_encode_intra4x4block(mb, i); 901b362b15af34006e6a11974088a46d42b903418eJohann return; 911b362b15af34006e6a11974088a46d42b903418eJohann} 921b362b15af34006e6a11974088a46d42b903418eJohann 931b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra16x16mby(MACROBLOCK *x) 941b362b15af34006e6a11974088a46d42b903418eJohann{ 951b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 961b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 971b362b15af34006e6a11974088a46d42b903418eJohann 981b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 991b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 1001b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 1011b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 1021b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer, 1031b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride); 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mby(x->src_diff, *(b->base_src), 1061b362b15af34006e6a11974088a46d42b903418eJohann b->src_stride, xd->dst.y_buffer, xd->dst.y_stride); 1071b362b15af34006e6a11974088a46d42b903418eJohann 1081b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_intra_mby(x); 1091b362b15af34006e6a11974088a46d42b903418eJohann 1101b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mby(x); 1111b362b15af34006e6a11974088a46d42b903418eJohann 1121b362b15af34006e6a11974088a46d42b903418eJohann if (x->optimize) 1131b362b15af34006e6a11974088a46d42b903418eJohann vp8_optimize_mby(x); 1141b362b15af34006e6a11974088a46d42b903418eJohann} 1151b362b15af34006e6a11974088a46d42b903418eJohann 1161b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_encode_intra16x16mbuv(MACROBLOCK *x) 1171b362b15af34006e6a11974088a46d42b903418eJohann{ 1181b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 1191b362b15af34006e6a11974088a46d42b903418eJohann 1201b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride, 1211b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - xd->dst.uv_stride, 1221b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer - 1, 1231b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - 1, 1241b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride, 1251b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer, xd->dst.v_buffer, 1261b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride); 1271b362b15af34006e6a11974088a46d42b903418eJohann 1281b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, 1291b362b15af34006e6a11974088a46d42b903418eJohann x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer, 1301b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer, xd->dst.uv_stride); 1311b362b15af34006e6a11974088a46d42b903418eJohann 1321b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_mbuv(x); 1331b362b15af34006e6a11974088a46d42b903418eJohann 1341b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mbuv(x); 1351b362b15af34006e6a11974088a46d42b903418eJohann 1361b362b15af34006e6a11974088a46d42b903418eJohann if (x->optimize) 1371b362b15af34006e6a11974088a46d42b903418eJohann vp8_optimize_mbuv(x); 1381b362b15af34006e6a11974088a46d42b903418eJohann} 139