encodemb.c revision 538f6170b788de7408b06efc6613dc98579aa6a6
190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/config.h" 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "encodemb.h" 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "reconinter.h" 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "quantize.h" 16f71323e297a928af368937089d3ed71239786f86Andreas Huber#include "tokenize.h" 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "invtrans.h" 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "recon.h" 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "reconintra.h" 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "dct.h" 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h" 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if CONFIG_RUNTIME_CPU_DETECT 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define IF_RTCD(x) (x) 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define IF_RTCD(x) NULL 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *src_ptr = (*(be->base_src) + be->src); 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *diff_ptr = be->src_diff; 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *pred_ptr = bd->predictor; 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int src_stride = be->src_stride; 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int r, c; 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 4; r++) 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 4; c++) 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber diff_ptr[c] = src_ptr[c] - pred_ptr[c]; 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber diff_ptr += pitch; 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred_ptr += pitch; 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_ptr += src_stride; 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_subtract_mbuv_c(short *diff, unsigned char *usrc, unsigned char *vsrc, unsigned char *pred, int stride) 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *udiff = diff + 256; 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *vdiff = diff + 320; 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *upred = pred + 256; 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *vpred = pred + 320; 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int r, c; 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 8; r++) 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 8; c++) 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber udiff[c] = usrc[c] - upred[c]; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber udiff += 8; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber upred += 8; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber usrc += stride; 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 8; r++) 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 8; c++) 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vdiff[c] = vsrc[c] - vpred[c]; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vdiff += 8; 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpred += 8; 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vsrc += stride; 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_subtract_mby_c(short *diff, unsigned char *src, unsigned char *pred, int stride) 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int r, c; 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (r = 0; r < 16; r++) 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (c = 0; c < 16; c++) 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber diff[c] = src[c] - pred[c]; 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber diff += 16; 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred += 16; 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src += stride; 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberstatic void vp8_subtract_mb(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, x->src.y_buffer, x->e_mbd.predictor, x->src.y_stride); 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride); 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_build_dcblock(MACROBLOCK *x) 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber short *src_diff_ptr = &x->src_diff[384]; 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 16; i++) 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber src_diff_ptr[i] = x->coeff[i * 16]; 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_transform_mbuv(MACROBLOCK *x) 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 16; i < 24; i += 2) 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 124f71323e297a928af368937089d3ed71239786f86Andreas Huber x->vp8_short_fdct8x4(&x->block[i].src_diff[0], 125f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[i].coeff[0], 16); 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_transform_intra_mby(MACROBLOCK *x) 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 16; i += 2) 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 136f71323e297a928af368937089d3ed71239786f86Andreas Huber x->vp8_short_fdct8x4(&x->block[i].src_diff[0], 137f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[i].coeff[0], 32); 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // build dc block from 16 y dc values 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_dcblock(x); 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // do 2nd order transform on the dc block 144f71323e297a928af368937089d3ed71239786f86Andreas Huber x->short_walsh4x4(&x->block[24].src_diff[0], 145f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[24].coeff[0], 8); 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_transform_mb(MACROBLOCK *x) 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 16; i += 2) 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 156f71323e297a928af368937089d3ed71239786f86Andreas Huber x->vp8_short_fdct8x4(&x->block[i].src_diff[0], 157f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[i].coeff[0], 32); 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // build dc block from 16 y dc values 161f71323e297a928af368937089d3ed71239786f86Andreas Huber if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_dcblock(x); 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 16; i < 24; i += 2) 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 166f71323e297a928af368937089d3ed71239786f86Andreas Huber x->vp8_short_fdct8x4(&x->block[i].src_diff[0], 167f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[i].coeff[0], 16); 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // do 2nd order transform on the dc block 171f71323e297a928af368937089d3ed71239786f86Andreas Huber if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) 172f71323e297a928af368937089d3ed71239786f86Andreas Huber x->short_walsh4x4(&x->block[24].src_diff[0], 173f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[24].coeff[0], 8); 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_transform_mby(MACROBLOCK *x) 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (i = 0; i < 16; i += 2) 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 183f71323e297a928af368937089d3ed71239786f86Andreas Huber x->vp8_short_fdct8x4(&x->block[i].src_diff[0], 184f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[i].coeff[0], 32); 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // build dc block from 16 y dc values 188f71323e297a928af368937089d3ed71239786f86Andreas Huber if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_dcblock(x); 191f71323e297a928af368937089d3ed71239786f86Andreas Huber x->short_walsh4x4(&x->block[24].src_diff[0], 192f71323e297a928af368937089d3ed71239786f86Andreas Huber &x->block[24].coeff[0], 8); 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_stuff_inter16x16(MACROBLOCK *x) 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_inter_predictors_mb_s(&x->e_mbd); 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // recon = copy from predictors to destination 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber BLOCKD *b = &x->e_mbd.block[0]; 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *pred_ptr = b->predictor; 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unsigned char *dst_ptr = *(b->base_dst) + b->dst; 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int stride = b->dst_stride; 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int i; 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for(i=0;i<16;i++) 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_memcpy(dst_ptr+i*stride,pred_ptr+16*i,16); 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b = &x->e_mbd.block[16]; 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred_ptr = b->predictor; 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber dst_ptr = *(b->base_dst) + b->dst; 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber stride = b->dst_stride; 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for(i=0;i<8;i++) 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_memcpy(dst_ptr+i*stride,pred_ptr+8*i,8); 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber b = &x->e_mbd.block[20]; 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber pred_ptr = b->predictor; 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber dst_ptr = *(b->base_dst) + b->dst; 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber stride = b->dst_stride; 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for(i=0;i<8;i++) 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vpx_memcpy(dst_ptr+i*stride,pred_ptr+8*i,8); 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if !(CONFIG_REALTIME_ONLY) 232f71323e297a928af368937089d3ed71239786f86Andreas Huber#define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) ) 233f71323e297a928af368937089d3ed71239786f86Andreas Huber#define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF ) 234f71323e297a928af368937089d3ed71239786f86Andreas Huber 235f71323e297a928af368937089d3ed71239786f86Andreas Hubertypedef struct vp8_token_state vp8_token_state; 236f71323e297a928af368937089d3ed71239786f86Andreas Huber 237f71323e297a928af368937089d3ed71239786f86Andreas Huberstruct vp8_token_state{ 238f71323e297a928af368937089d3ed71239786f86Andreas Huber int rate; 239f71323e297a928af368937089d3ed71239786f86Andreas Huber int error; 240f71323e297a928af368937089d3ed71239786f86Andreas Huber signed char next; 241f71323e297a928af368937089d3ed71239786f86Andreas Huber signed char token; 242f71323e297a928af368937089d3ed71239786f86Andreas Huber short qc; 243f71323e297a928af368937089d3ed71239786f86Andreas Huber}; 244f71323e297a928af368937089d3ed71239786f86Andreas Huber 245538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber// TODO: experiments to find optimal multiple numbers 246538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define Y1_RD_MULT 1 247538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define UV_RD_MULT 1 248538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#define Y2_RD_MULT 4 249538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 250538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic const int plane_rd_mult[4]= 251538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 252538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber Y1_RD_MULT, 253538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber Y2_RD_MULT, 254538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber UV_RD_MULT, 255538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber Y1_RD_MULT 256538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}; 257538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 258538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_optimize_b(MACROBLOCK *mb, int ib, int type, 259f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l, 260f71323e297a928af368937089d3ed71239786f86Andreas Huber const VP8_ENCODER_RTCD *rtcd) 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 262f71323e297a928af368937089d3ed71239786f86Andreas Huber BLOCK *b; 263f71323e297a928af368937089d3ed71239786f86Andreas Huber BLOCKD *d; 264f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_token_state tokens[17][2]; 265f71323e297a928af368937089d3ed71239786f86Andreas Huber unsigned best_mask[2]; 266f71323e297a928af368937089d3ed71239786f86Andreas Huber const short *dequant_ptr; 267f71323e297a928af368937089d3ed71239786f86Andreas Huber const short *coeff_ptr; 268f71323e297a928af368937089d3ed71239786f86Andreas Huber short *qcoeff_ptr; 269f71323e297a928af368937089d3ed71239786f86Andreas Huber short *dqcoeff_ptr; 270f71323e297a928af368937089d3ed71239786f86Andreas Huber int eob; 271f71323e297a928af368937089d3ed71239786f86Andreas Huber int i0; 272f71323e297a928af368937089d3ed71239786f86Andreas Huber int rc; 273f71323e297a928af368937089d3ed71239786f86Andreas Huber int x; 274f71323e297a928af368937089d3ed71239786f86Andreas Huber int sz; 275f71323e297a928af368937089d3ed71239786f86Andreas Huber int next; 276f71323e297a928af368937089d3ed71239786f86Andreas Huber int path; 277f71323e297a928af368937089d3ed71239786f86Andreas Huber int rdmult; 278f71323e297a928af368937089d3ed71239786f86Andreas Huber int rddiv; 279f71323e297a928af368937089d3ed71239786f86Andreas Huber int final_eob; 280f71323e297a928af368937089d3ed71239786f86Andreas Huber int rd_cost0; 281f71323e297a928af368937089d3ed71239786f86Andreas Huber int rd_cost1; 282f71323e297a928af368937089d3ed71239786f86Andreas Huber int rate0; 283f71323e297a928af368937089d3ed71239786f86Andreas Huber int rate1; 284f71323e297a928af368937089d3ed71239786f86Andreas Huber int error0; 285f71323e297a928af368937089d3ed71239786f86Andreas Huber int error1; 286f71323e297a928af368937089d3ed71239786f86Andreas Huber int t0; 287f71323e297a928af368937089d3ed71239786f86Andreas Huber int t1; 288f71323e297a928af368937089d3ed71239786f86Andreas Huber int best; 289f71323e297a928af368937089d3ed71239786f86Andreas Huber int band; 290f71323e297a928af368937089d3ed71239786f86Andreas Huber int pt; 291538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int i; 292538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int err_mult = plane_rd_mult[type]; 293f71323e297a928af368937089d3ed71239786f86Andreas Huber 294538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber b = &mb->block[ib]; 295538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber d = &mb->e_mbd.block[ib]; 296f71323e297a928af368937089d3ed71239786f86Andreas Huber 297f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Enable this to test the effect of RDO as a replacement for the dynamic 298f71323e297a928af368937089d3ed71239786f86Andreas Huber * zero bin instead of an augmentation of it. 299f71323e297a928af368937089d3ed71239786f86Andreas Huber */ 300f71323e297a928af368937089d3ed71239786f86Andreas Huber#if 0 301f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_strict_quantize_b(b, d); 302f71323e297a928af368937089d3ed71239786f86Andreas Huber#endif 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 304538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber dequant_ptr = d->dequant; 305538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber coeff_ptr = b->coeff; 306f71323e297a928af368937089d3ed71239786f86Andreas Huber qcoeff_ptr = d->qcoeff; 307f71323e297a928af368937089d3ed71239786f86Andreas Huber dqcoeff_ptr = d->dqcoeff; 308f71323e297a928af368937089d3ed71239786f86Andreas Huber i0 = !type; 309f71323e297a928af368937089d3ed71239786f86Andreas Huber eob = d->eob; 310f71323e297a928af368937089d3ed71239786f86Andreas Huber 311f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Now set up a Viterbi trellis to evaluate alternative roundings. */ 312f71323e297a928af368937089d3ed71239786f86Andreas Huber /* TODO: These should vary with the block type, since the quantizer does. */ 313538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber rdmult = (mb->rdmult << 2)*err_mult; 314f71323e297a928af368937089d3ed71239786f86Andreas Huber rddiv = mb->rddiv; 315f71323e297a928af368937089d3ed71239786f86Andreas Huber best_mask[0] = best_mask[1] = 0; 316f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Initialize the sentinel node of the trellis. */ 317f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[eob][0].rate = 0; 318f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[eob][0].error = 0; 319f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[eob][0].next = 16; 320f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[eob][0].token = DCT_EOB_TOKEN; 321f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[eob][0].qc = 0; 322f71323e297a928af368937089d3ed71239786f86Andreas Huber *(tokens[eob] + 1) = *(tokens[eob] + 0); 323f71323e297a928af368937089d3ed71239786f86Andreas Huber next = eob; 324f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = eob; i-- > i0;) 325f71323e297a928af368937089d3ed71239786f86Andreas Huber { 326f71323e297a928af368937089d3ed71239786f86Andreas Huber int base_bits; 327f71323e297a928af368937089d3ed71239786f86Andreas Huber int d2; 328f71323e297a928af368937089d3ed71239786f86Andreas Huber int dx; 329f71323e297a928af368937089d3ed71239786f86Andreas Huber 330f71323e297a928af368937089d3ed71239786f86Andreas Huber rc = vp8_default_zig_zag1d[i]; 331f71323e297a928af368937089d3ed71239786f86Andreas Huber x = qcoeff_ptr[rc]; 332f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Only add a trellis state for non-zero coefficients. */ 333f71323e297a928af368937089d3ed71239786f86Andreas Huber if (x) 334f71323e297a928af368937089d3ed71239786f86Andreas Huber { 335f71323e297a928af368937089d3ed71239786f86Andreas Huber int shortcut=0; 336f71323e297a928af368937089d3ed71239786f86Andreas Huber error0 = tokens[next][0].error; 337f71323e297a928af368937089d3ed71239786f86Andreas Huber error1 = tokens[next][1].error; 338f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Evaluate the first possibility for this state. */ 339f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 = tokens[next][0].rate; 340f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 = tokens[next][1].rate; 341f71323e297a928af368937089d3ed71239786f86Andreas Huber t0 = (vp8_dct_value_tokens_ptr + x)->Token; 342f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Consider both possible successor states. */ 343f71323e297a928af368937089d3ed71239786f86Andreas Huber if (next < 16) 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 345f71323e297a928af368937089d3ed71239786f86Andreas Huber band = vp8_coef_bands[i + 1]; 346f71323e297a928af368937089d3ed71239786f86Andreas Huber pt = vp8_prev_token_class[t0]; 347f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 += 348f71323e297a928af368937089d3ed71239786f86Andreas Huber mb->token_costs[type][band][pt][tokens[next][0].token]; 349f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 += 350f71323e297a928af368937089d3ed71239786f86Andreas Huber mb->token_costs[type][band][pt][tokens[next][1].token]; 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 352f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0); 353f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1); 354f71323e297a928af368937089d3ed71239786f86Andreas Huber if (rd_cost0 == rd_cost1) 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 356f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0); 357f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1); 35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 359f71323e297a928af368937089d3ed71239786f86Andreas Huber /* And pick the best. */ 360f71323e297a928af368937089d3ed71239786f86Andreas Huber best = rd_cost1 < rd_cost0; 361f71323e297a928af368937089d3ed71239786f86Andreas Huber base_bits = *(vp8_dct_value_cost_ptr + x); 362f71323e297a928af368937089d3ed71239786f86Andreas Huber dx = dqcoeff_ptr[rc] - coeff_ptr[rc]; 363f71323e297a928af368937089d3ed71239786f86Andreas Huber d2 = dx*dx; 364f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][0].rate = base_bits + (best ? rate1 : rate0); 365f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][0].error = d2 + (best ? error1 : error0); 366f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][0].next = next; 367f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][0].token = t0; 368f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][0].qc = x; 369f71323e297a928af368937089d3ed71239786f86Andreas Huber best_mask[0] |= best << i; 370f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Evaluate the second possibility for this state. */ 371f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 = tokens[next][0].rate; 372f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 = tokens[next][1].rate; 373f71323e297a928af368937089d3ed71239786f86Andreas Huber 374f71323e297a928af368937089d3ed71239786f86Andreas Huber if((abs(x)*dequant_ptr[rc]>abs(coeff_ptr[rc])) && 375f71323e297a928af368937089d3ed71239786f86Andreas Huber (abs(x)*dequant_ptr[rc]<abs(coeff_ptr[rc])+dequant_ptr[rc])) 376f71323e297a928af368937089d3ed71239786f86Andreas Huber shortcut = 1; 377f71323e297a928af368937089d3ed71239786f86Andreas Huber else 378f71323e297a928af368937089d3ed71239786f86Andreas Huber shortcut = 0; 379f71323e297a928af368937089d3ed71239786f86Andreas Huber 380f71323e297a928af368937089d3ed71239786f86Andreas Huber if(shortcut) 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 382f71323e297a928af368937089d3ed71239786f86Andreas Huber sz = -(x < 0); 383f71323e297a928af368937089d3ed71239786f86Andreas Huber x -= 2*sz + 1; 38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 386f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Consider both possible successor states. */ 387f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!x) 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 389f71323e297a928af368937089d3ed71239786f86Andreas Huber /* If we reduced this coefficient to zero, check to see if 390f71323e297a928af368937089d3ed71239786f86Andreas Huber * we need to move the EOB back here. 391f71323e297a928af368937089d3ed71239786f86Andreas Huber */ 392f71323e297a928af368937089d3ed71239786f86Andreas Huber t0 = tokens[next][0].token == DCT_EOB_TOKEN ? 393f71323e297a928af368937089d3ed71239786f86Andreas Huber DCT_EOB_TOKEN : ZERO_TOKEN; 394f71323e297a928af368937089d3ed71239786f86Andreas Huber t1 = tokens[next][1].token == DCT_EOB_TOKEN ? 395f71323e297a928af368937089d3ed71239786f86Andreas Huber DCT_EOB_TOKEN : ZERO_TOKEN; 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 397f71323e297a928af368937089d3ed71239786f86Andreas Huber else 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 399f71323e297a928af368937089d3ed71239786f86Andreas Huber t0=t1 = (vp8_dct_value_tokens_ptr + x)->Token; 400f71323e297a928af368937089d3ed71239786f86Andreas Huber } 401f71323e297a928af368937089d3ed71239786f86Andreas Huber if (next < 16) 402f71323e297a928af368937089d3ed71239786f86Andreas Huber { 403f71323e297a928af368937089d3ed71239786f86Andreas Huber band = vp8_coef_bands[i + 1]; 404f71323e297a928af368937089d3ed71239786f86Andreas Huber if(t0!=DCT_EOB_TOKEN) 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 406f71323e297a928af368937089d3ed71239786f86Andreas Huber pt = vp8_prev_token_class[t0]; 407f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 += mb->token_costs[type][band][pt][ 408f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][0].token]; 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 410f71323e297a928af368937089d3ed71239786f86Andreas Huber if(t1!=DCT_EOB_TOKEN) 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 412f71323e297a928af368937089d3ed71239786f86Andreas Huber pt = vp8_prev_token_class[t1]; 413f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 += mb->token_costs[type][band][pt][ 414f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][1].token]; 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 418f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0); 419f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1); 420f71323e297a928af368937089d3ed71239786f86Andreas Huber if (rd_cost0 == rd_cost1) 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 422f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0); 423f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1); 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 425f71323e297a928af368937089d3ed71239786f86Andreas Huber /* And pick the best. */ 426f71323e297a928af368937089d3ed71239786f86Andreas Huber best = rd_cost1 < rd_cost0; 427f71323e297a928af368937089d3ed71239786f86Andreas Huber base_bits = *(vp8_dct_value_cost_ptr + x); 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 429f71323e297a928af368937089d3ed71239786f86Andreas Huber if(shortcut) 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 431f71323e297a928af368937089d3ed71239786f86Andreas Huber dx -= (dequant_ptr[rc] + sz) ^ sz; 432f71323e297a928af368937089d3ed71239786f86Andreas Huber d2 = dx*dx; 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 434f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][1].rate = base_bits + (best ? rate1 : rate0); 435f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][1].error = d2 + (best ? error1 : error0); 436f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][1].next = next; 437f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][1].token =best?t1:t0; 438f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[i][1].qc = x; 439f71323e297a928af368937089d3ed71239786f86Andreas Huber best_mask[1] |= best << i; 440f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Finally, make this the new head of the trellis. */ 441f71323e297a928af368937089d3ed71239786f86Andreas Huber next = i; 442f71323e297a928af368937089d3ed71239786f86Andreas Huber } 443f71323e297a928af368937089d3ed71239786f86Andreas Huber /* There's no choice to make for a zero coefficient, so we don't 444f71323e297a928af368937089d3ed71239786f86Andreas Huber * add a new trellis node, but we do need to update the costs. 445f71323e297a928af368937089d3ed71239786f86Andreas Huber */ 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber else 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 448f71323e297a928af368937089d3ed71239786f86Andreas Huber band = vp8_coef_bands[i + 1]; 449f71323e297a928af368937089d3ed71239786f86Andreas Huber t0 = tokens[next][0].token; 450f71323e297a928af368937089d3ed71239786f86Andreas Huber t1 = tokens[next][1].token; 451f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Update the cost of each path if we're past the EOB token. */ 452f71323e297a928af368937089d3ed71239786f86Andreas Huber if (t0 != DCT_EOB_TOKEN) 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 454f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][0].rate += mb->token_costs[type][band][0][t0]; 455f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][0].token = ZERO_TOKEN; 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 457f71323e297a928af368937089d3ed71239786f86Andreas Huber if (t1 != DCT_EOB_TOKEN) 458f71323e297a928af368937089d3ed71239786f86Andreas Huber { 459f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][1].rate += mb->token_costs[type][band][0][t1]; 460f71323e297a928af368937089d3ed71239786f86Andreas Huber tokens[next][1].token = ZERO_TOKEN; 461f71323e297a928af368937089d3ed71239786f86Andreas Huber } 462f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Don't update next, because we didn't add a new node. */ 46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 466f71323e297a928af368937089d3ed71239786f86Andreas Huber /* Now pick the best path through the whole trellis. */ 467f71323e297a928af368937089d3ed71239786f86Andreas Huber band = vp8_coef_bands[i + 1]; 468f71323e297a928af368937089d3ed71239786f86Andreas Huber VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 469f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 = tokens[next][0].rate; 470f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 = tokens[next][1].rate; 471f71323e297a928af368937089d3ed71239786f86Andreas Huber error0 = tokens[next][0].error; 472f71323e297a928af368937089d3ed71239786f86Andreas Huber error1 = tokens[next][1].error; 473f71323e297a928af368937089d3ed71239786f86Andreas Huber t0 = tokens[next][0].token; 474f71323e297a928af368937089d3ed71239786f86Andreas Huber t1 = tokens[next][1].token; 475f71323e297a928af368937089d3ed71239786f86Andreas Huber rate0 += mb->token_costs[type][band][pt][t0]; 476f71323e297a928af368937089d3ed71239786f86Andreas Huber rate1 += mb->token_costs[type][band][pt][t1]; 477f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0); 478f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1); 479f71323e297a928af368937089d3ed71239786f86Andreas Huber if (rd_cost0 == rd_cost1) 480f71323e297a928af368937089d3ed71239786f86Andreas Huber { 481f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0); 482f71323e297a928af368937089d3ed71239786f86Andreas Huber rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1); 483f71323e297a928af368937089d3ed71239786f86Andreas Huber } 484f71323e297a928af368937089d3ed71239786f86Andreas Huber best = rd_cost1 < rd_cost0; 485f71323e297a928af368937089d3ed71239786f86Andreas Huber final_eob = i0 - 1; 486f71323e297a928af368937089d3ed71239786f86Andreas Huber for (i = next; i < eob; i = next) 487f71323e297a928af368937089d3ed71239786f86Andreas Huber { 488f71323e297a928af368937089d3ed71239786f86Andreas Huber x = tokens[i][best].qc; 489f71323e297a928af368937089d3ed71239786f86Andreas Huber if (x) 490f71323e297a928af368937089d3ed71239786f86Andreas Huber final_eob = i; 491f71323e297a928af368937089d3ed71239786f86Andreas Huber rc = vp8_default_zig_zag1d[i]; 492f71323e297a928af368937089d3ed71239786f86Andreas Huber qcoeff_ptr[rc] = x; 493f71323e297a928af368937089d3ed71239786f86Andreas Huber dqcoeff_ptr[rc] = x * dequant_ptr[rc]; 494f71323e297a928af368937089d3ed71239786f86Andreas Huber next = tokens[i][best].next; 495f71323e297a928af368937089d3ed71239786f86Andreas Huber best = (best_mask[best] >> i) & 1; 496f71323e297a928af368937089d3ed71239786f86Andreas Huber } 497f71323e297a928af368937089d3ed71239786f86Andreas Huber final_eob++; 498f71323e297a928af368937089d3ed71239786f86Andreas Huber 499f71323e297a928af368937089d3ed71239786f86Andreas Huber d->eob = final_eob; 500f71323e297a928af368937089d3ed71239786f86Andreas Huber *a = *l = (d->eob != !type); 50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_optimize_mb(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) 50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int b; 506f71323e297a928af368937089d3ed71239786f86Andreas Huber int type; 507f71323e297a928af368937089d3ed71239786f86Andreas Huber int has_2nd_order; 508f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT_PLANES t_above, t_left; 509f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *ta; 510f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *tl; 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 512f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 513f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 515f71323e297a928af368937089d3ed71239786f86Andreas Huber ta = (ENTROPY_CONTEXT *)&t_above; 516f71323e297a928af368937089d3ed71239786f86Andreas Huber tl = (ENTROPY_CONTEXT *)&t_left; 517f71323e297a928af368937089d3ed71239786f86Andreas Huber 518f71323e297a928af368937089d3ed71239786f86Andreas Huber has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED 519f71323e297a928af368937089d3ed71239786f86Andreas Huber && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV); 520f71323e297a928af368937089d3ed71239786f86Andreas Huber type = has_2nd_order ? 0 : 3; 52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 0; b < 16; b++) 52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 524f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_optimize_b(x, b, type, 525f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 16; b < 20; b++) 52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 530f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 531f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 20; b < 24; b++) 53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 536f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 537f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 541f71323e297a928af368937089d3ed71239786f86Andreas Huber if (has_2nd_order) 54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 543538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber b=24; 544538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 545538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_optimize_mby(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) 55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int b; 553f71323e297a928af368937089d3ed71239786f86Andreas Huber int type; 554f71323e297a928af368937089d3ed71239786f86Andreas Huber int has_2nd_order; 555f71323e297a928af368937089d3ed71239786f86Andreas Huber 556f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT_PLANES t_above, t_left; 557f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *ta; 558f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *tl; 55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 560f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!x->e_mbd.above_context) 56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return; 56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 563f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!x->e_mbd.left_context) 56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return; 56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 566f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 567f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 569f71323e297a928af368937089d3ed71239786f86Andreas Huber ta = (ENTROPY_CONTEXT *)&t_above; 570f71323e297a928af368937089d3ed71239786f86Andreas Huber tl = (ENTROPY_CONTEXT *)&t_left; 571f71323e297a928af368937089d3ed71239786f86Andreas Huber 572f71323e297a928af368937089d3ed71239786f86Andreas Huber has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED 573f71323e297a928af368937089d3ed71239786f86Andreas Huber && x->e_mbd.mode_info_context->mbmi.mode != SPLITMV); 574f71323e297a928af368937089d3ed71239786f86Andreas Huber type = has_2nd_order ? 0 : 3; 57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 0; b < 16; b++) 57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 578f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_optimize_b(x, b, type, 579f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 582538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 583f71323e297a928af368937089d3ed71239786f86Andreas Huber if (has_2nd_order) 584f71323e297a928af368937089d3ed71239786f86Andreas Huber { 585538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber b=24; 586538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 587538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 588f71323e297a928af368937089d3ed71239786f86Andreas Huber } 58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_optimize_mbuv(MACROBLOCK *x, const VP8_ENCODER_RTCD *rtcd) 59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber int b; 594f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT_PLANES t_above, t_left; 595f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *ta; 596f71323e297a928af368937089d3ed71239786f86Andreas Huber ENTROPY_CONTEXT *tl; 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 598f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!x->e_mbd.above_context) 59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return; 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 601f71323e297a928af368937089d3ed71239786f86Andreas Huber if (!x->e_mbd.left_context) 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return; 60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 604f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 605f71323e297a928af368937089d3ed71239786f86Andreas Huber vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 607f71323e297a928af368937089d3ed71239786f86Andreas Huber ta = (ENTROPY_CONTEXT *)&t_above; 608f71323e297a928af368937089d3ed71239786f86Andreas Huber tl = (ENTROPY_CONTEXT *)&t_left; 60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 16; b < 20; b++) 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 613f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for (b = 20; b < 24; b++) 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_optimize_b(x, b, vp8_block2type[b], 619f71323e297a928af368937089d3ed71239786f86Andreas Huber ta + vp8_block2above[b], tl + vp8_block2left[b], rtcd); 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_inter16x16(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_inter_predictors_mb(&x->e_mbd); 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_subtract_mb(rtcd, x); 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_transform_mb(x); 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_quantize_mb(x); 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if !(CONFIG_REALTIME_ONLY) 636538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (x->optimize==2 ||(x->optimize && x->rddiv > 1)) 63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_optimize_mb(x, rtcd); 63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_inverse_transform_mb(IF_RTCD(&rtcd->common->idct), &x->e_mbd); 64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 642538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber RECON_INVOKE(&rtcd->common->recon, recon_mb) 643538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (IF_RTCD(&rtcd->common->recon), &x->e_mbd); 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* this funciton is used by first pass only */ 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_inter16x16y(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) 64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_inter_predictors_mby(&x->e_mbd); 65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENCODEMB_INVOKE(&rtcd->encodemb, submby)(x->src_diff, x->src.y_buffer, x->e_mbd.predictor, x->src.y_stride); 65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_transform_mby(x); 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_quantize_mby(x); 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_inverse_transform_mby(IF_RTCD(&rtcd->common->idct), &x->e_mbd); 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 660538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber RECON_INVOKE(&rtcd->common->recon, recon_mby) 661538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber (IF_RTCD(&rtcd->common->recon), &x->e_mbd); 66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_inter16x16uv(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) 66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_inter_predictors_mbuv(&x->e_mbd); 66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride); 67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_transform_mbuv(x); 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_quantize_mbuv(x); 67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_inverse_transform_mbuv(IF_RTCD(&rtcd->common->idct), &x->e_mbd); 67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_recon_intra_mbuv(IF_RTCD(&rtcd->common->recon), &x->e_mbd); 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_encode_inter16x16uvrd(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *x) 68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber vp8_build_inter_predictors_mbuv(&x->e_mbd); 68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ENCODEMB_INVOKE(&rtcd->encodemb, submbuv)(x->src_diff, x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, x->src.uv_stride); 68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 686f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_transform_mbuv(x); 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 688f71323e297a928af368937089d3ed71239786f86Andreas Huber vp8_quantize_mbuv(x); 68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 691