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