1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org#include "vpx_config.h" 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "vp8_rtcd.h" 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "quantize.h" 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/reconintra4x4.h" 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodemb.h" 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vp8/common/invtrans.h" 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "encodeintra.h" 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vp8_encode_intra(VP8_COMP *cpi, MACROBLOCK *x, int use_dc_pred) 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int intra_pred_var = 0; 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org (void) cpi; 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (use_dc_pred) 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.mode = DC_PRED; 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 345c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_encode_intra16x16mby(x); 35167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 365c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_inverse_transform_mby(&x->e_mbd); 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org else 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 16; i++) 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->e_mbd.block[i].bmi.as_mode = B_DC_PRED; 435c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_encode_intra4x4block(x, i); 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 475c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org intra_pred_var = vp8_get_mb_ss(x->src_diff); 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return intra_pred_var; 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 525c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_encode_intra4x4block(MACROBLOCK *x, int ib) 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCKD *b = &x->e_mbd.block[ib]; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *be = &x->block[ib]; 565c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org int dst_stride = x->e_mbd.dst.y_stride; 57ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 58ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *Above = dst - dst_stride; 59ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char *yleft = dst - 1; 60ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org unsigned char top_left = Above[-1]; 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 62ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_intra4x4_predict(Above, yleft, dst_stride, b->bmi.as_mode, 63ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org b->predictor, 16, top_left); 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 655c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_subtract_b(be, b, 16); 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 675c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org x->short_fdct4x4(be->src_diff, be->coeff, 32); 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org x->quantize_b(be, b); 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 71167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (*b->eob > 1) 72167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 73ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_short_idct4x4llm(b->dqcoeff, b->predictor, 16, dst, dst_stride); 74167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 75167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org else 76167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 77ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org vp8_dc_only_idct_add(b->dqcoeff[0], b->predictor, 16, dst, dst_stride); 78167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 815c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_encode_intra4x4mby(MACROBLOCK *mb) 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 855c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org MACROBLOCKD *xd = &mb->e_mbd; 865c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 16; i++) 895c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_encode_intra4x4block(mb, i); 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org return; 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 935c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_encode_intra16x16mby(MACROBLOCK *x) 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org BLOCK *b = &x->block[0]; 96167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MACROBLOCKD *xd = &x->e_mbd; 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 985c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mby_s(xd, 995c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - xd->dst.y_stride, 1005c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer - 1, 1015c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride, 1025c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_buffer, 1035c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.y_stride); 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1055c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_subtract_mby(x->src_diff, *(b->base_src), 106167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org b->src_stride, xd->dst.y_buffer, xd->dst.y_stride); 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_transform_intra_mby(x); 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_quantize_mby(x); 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->optimize) 1135c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_optimize_mby(x); 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1165c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.orgvoid vp8_encode_intra16x16mbuv(MACROBLOCK *x) 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 118167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org MACROBLOCKD *xd = &x->e_mbd; 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1205c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_build_intra_predictors_mbuv_s(xd, xd->dst.u_buffer - xd->dst.uv_stride, 1215c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.v_buffer - xd->dst.uv_stride, 1225c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer - 1, 1235c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.v_buffer - 1, 1245c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.uv_stride, 1255c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.u_buffer, xd->dst.v_buffer, 1265c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org xd->dst.uv_stride); 127167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1285c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, 129167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org x->src.v_buffer, x->src.uv_stride, xd->dst.u_buffer, 130167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org xd->dst.v_buffer, xd->dst.uv_stride); 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_transform_mbuv(x); 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vp8_quantize_mbuv(x); 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (x->optimize) 1375c1d3b27608a3f3f6028c069b9bf066a4de474b6hclam@chromium.org vp8_optimize_mbuv(x); 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 139