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