19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org/* 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * Use of this source code is governed by a BSD-style license 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * that can be found in the LICENSE file in the root of the source 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * tree. An additional intellectual property rights grant can be found 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * in the file PATENTS. All contributing project authors may 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * be found in the AUTHORS file in the root of the source tree. 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com */ 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "vpx_config.h" 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "vp8_rtcd.h" 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "quantize.h" 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "vp8/common/reconintra4x4.h" 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "encodemb.h" 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "vp8/common/invtrans.h" 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "encodeintra.h" 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred) 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com{ 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int i; 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int intra_pred_var = 0; 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com (void) cpi; 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 285ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (use_dc_pred) 295ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org { 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->e_mbd.mode_info_context->mbmi.mode = DC_PRED; 319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_encode_intra16x16mby(x); 35b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_inverse_transform_mby(&x->e_mbd); 379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com else 399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com { 409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (i = 0; i < 16; i++) 41b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org { 42b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org x->e_mbd.block[i].bmi.as_mode = B_DC_PRED; 439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_encode_intra4x4block(x, i); 449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 475a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org intra_pred_var = vp8_get_mb_ss(x->src_diff); 489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return intra_pred_var; 509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 513a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org 523a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.orgvoid vp8_encode_intra4x4block(MACROBLOCK *x, int ib) 539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com{ 549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com BLOCKD *b = &x->e_mbd.block[ib]; 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com BLOCK *be = &x->block[ib]; 569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int dst_stride = x->e_mbd.dst.y_stride; 5765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 58c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org unsigned char *Above = dst - dst_stride; 599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com unsigned char *yleft = dst - 1; 609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com unsigned char top_left = Above[-1]; 619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_intra4x4_predict(Above, yleft, dst_stride, b->bmi.as_mode, 639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com b->predictor, 16, top_left); 649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_subtract_b(be, b, 16); 669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->short_fdct4x4(be->src_diff, be->coeff, 32); 689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->quantize_b(be, b); 709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (*b->eob > 1) 729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com { 739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_short_idct4x4llm(b->dqcoeff, b->predictor, 16, dst, dst_stride); 749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com else 769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com { 779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_dc_only_idct_add(b->dqcoeff[0], b->predictor, 16, dst, dst_stride); 789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid vp8_encode_intra4x4mby(MACROBLOCK *mb) 829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com{ 839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int i; 849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MACROBLOCKD *xd = &mb->e_mbd; 869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (i = 0; i < 16; i++) 899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_encode_intra4x4block(mb, i); 909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return; 919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid vp8_encode_intra16x16mby(MACROBLOCK *x) 949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com{ 959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com BLOCK *b = &x->block[0]; 969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MACROBLOCKD *xd = &x->e_mbd; 979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_build_intra_predictors_mby_s(xd, 999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.y_buffer - xd->dst.y_stride, 1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.y_buffer - 1, 1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.y_stride, 1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.y_buffer, 1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.y_stride); 1049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_subtract_mby(x->src_diff, *(b->base_src), 1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com b->src_stride, xd->dst.y_buffer, xd->dst.y_stride); 1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_transform_intra_mby(x); 1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_quantize_mby(x); 1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (x->optimize) 1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_optimize_mby(x); 1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid vp8_encode_intra16x16mbuv(MACROBLOCK *x) 1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com{ 1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MACROBLOCKD *xd = &x->e_mbd; 1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride, 1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.v_buffer - xd->dst.uv_stride, 1229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.u_buffer - 1, 1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.v_buffer - 1, 1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.uv_stride, 1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.u_buffer, xd->dst.v_buffer, 1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.uv_stride); 1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, 1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer, 1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com xd->dst.v_buffer, xd->dst.uv_stride); 1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_transform_mbuv(x); 1339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_quantize_mbuv(x); 1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (x->optimize) 1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com vp8_optimize_mbuv(x); 1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com