xref: /aosp_15_r20/external/libvpx/vp8/encoder/encodemb.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker 
13*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vp8_rtcd.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "encodemb.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/reconinter.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "vp8/encoder/quantize.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "tokenize.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/invtrans.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx_mem/vpx_mem.h"
21*fb1b10abSAndroid Build Coastguard Worker #include "rdopt.h"
22*fb1b10abSAndroid Build Coastguard Worker 
vp8_subtract_b(BLOCK * be,BLOCKD * bd,int pitch)23*fb1b10abSAndroid Build Coastguard Worker void vp8_subtract_b(BLOCK *be, BLOCKD *bd, int pitch) {
24*fb1b10abSAndroid Build Coastguard Worker   unsigned char *src_ptr = (*(be->base_src) + be->src);
25*fb1b10abSAndroid Build Coastguard Worker   short *diff_ptr = be->src_diff;
26*fb1b10abSAndroid Build Coastguard Worker   unsigned char *pred_ptr = bd->predictor;
27*fb1b10abSAndroid Build Coastguard Worker   int src_stride = be->src_stride;
28*fb1b10abSAndroid Build Coastguard Worker 
29*fb1b10abSAndroid Build Coastguard Worker   vpx_subtract_block(4, 4, diff_ptr, pitch, src_ptr, src_stride, pred_ptr,
30*fb1b10abSAndroid Build Coastguard Worker                      pitch);
31*fb1b10abSAndroid Build Coastguard Worker }
32*fb1b10abSAndroid Build Coastguard Worker 
vp8_subtract_mbuv(short * diff,unsigned char * usrc,unsigned char * vsrc,int src_stride,unsigned char * upred,unsigned char * vpred,int pred_stride)33*fb1b10abSAndroid Build Coastguard Worker void vp8_subtract_mbuv(short *diff, unsigned char *usrc, unsigned char *vsrc,
34*fb1b10abSAndroid Build Coastguard Worker                        int src_stride, unsigned char *upred,
35*fb1b10abSAndroid Build Coastguard Worker                        unsigned char *vpred, int pred_stride) {
36*fb1b10abSAndroid Build Coastguard Worker   short *udiff = diff + 256;
37*fb1b10abSAndroid Build Coastguard Worker   short *vdiff = diff + 320;
38*fb1b10abSAndroid Build Coastguard Worker 
39*fb1b10abSAndroid Build Coastguard Worker   vpx_subtract_block(8, 8, udiff, 8, usrc, src_stride, upred, pred_stride);
40*fb1b10abSAndroid Build Coastguard Worker   vpx_subtract_block(8, 8, vdiff, 8, vsrc, src_stride, vpred, pred_stride);
41*fb1b10abSAndroid Build Coastguard Worker }
42*fb1b10abSAndroid Build Coastguard Worker 
vp8_subtract_mby(short * diff,unsigned char * src,int src_stride,unsigned char * pred,int pred_stride)43*fb1b10abSAndroid Build Coastguard Worker void vp8_subtract_mby(short *diff, unsigned char *src, int src_stride,
44*fb1b10abSAndroid Build Coastguard Worker                       unsigned char *pred, int pred_stride) {
45*fb1b10abSAndroid Build Coastguard Worker   vpx_subtract_block(16, 16, diff, 16, src, src_stride, pred, pred_stride);
46*fb1b10abSAndroid Build Coastguard Worker }
47*fb1b10abSAndroid Build Coastguard Worker 
vp8_subtract_mb(MACROBLOCK * x)48*fb1b10abSAndroid Build Coastguard Worker static void vp8_subtract_mb(MACROBLOCK *x) {
49*fb1b10abSAndroid Build Coastguard Worker   BLOCK *b = &x->block[0];
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker   vp8_subtract_mby(x->src_diff, *(b->base_src), b->src_stride,
52*fb1b10abSAndroid Build Coastguard Worker                    x->e_mbd.dst.y_buffer, x->e_mbd.dst.y_stride);
53*fb1b10abSAndroid Build Coastguard Worker   vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
54*fb1b10abSAndroid Build Coastguard Worker                     x->src.uv_stride, x->e_mbd.dst.u_buffer,
55*fb1b10abSAndroid Build Coastguard Worker                     x->e_mbd.dst.v_buffer, x->e_mbd.dst.uv_stride);
56*fb1b10abSAndroid Build Coastguard Worker }
57*fb1b10abSAndroid Build Coastguard Worker 
build_dcblock(MACROBLOCK * x)58*fb1b10abSAndroid Build Coastguard Worker static void build_dcblock(MACROBLOCK *x) {
59*fb1b10abSAndroid Build Coastguard Worker   short *src_diff_ptr = &x->src_diff[384];
60*fb1b10abSAndroid Build Coastguard Worker   int i;
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; ++i) {
63*fb1b10abSAndroid Build Coastguard Worker     src_diff_ptr[i] = x->coeff[i * 16];
64*fb1b10abSAndroid Build Coastguard Worker   }
65*fb1b10abSAndroid Build Coastguard Worker }
66*fb1b10abSAndroid Build Coastguard Worker 
vp8_transform_mbuv(MACROBLOCK * x)67*fb1b10abSAndroid Build Coastguard Worker void vp8_transform_mbuv(MACROBLOCK *x) {
68*fb1b10abSAndroid Build Coastguard Worker   int i;
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker   for (i = 16; i < 24; i += 2) {
71*fb1b10abSAndroid Build Coastguard Worker     x->short_fdct8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 16);
72*fb1b10abSAndroid Build Coastguard Worker   }
73*fb1b10abSAndroid Build Coastguard Worker }
74*fb1b10abSAndroid Build Coastguard Worker 
vp8_transform_intra_mby(MACROBLOCK * x)75*fb1b10abSAndroid Build Coastguard Worker void vp8_transform_intra_mby(MACROBLOCK *x) {
76*fb1b10abSAndroid Build Coastguard Worker   int i;
77*fb1b10abSAndroid Build Coastguard Worker 
78*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; i += 2) {
79*fb1b10abSAndroid Build Coastguard Worker     x->short_fdct8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32);
80*fb1b10abSAndroid Build Coastguard Worker   }
81*fb1b10abSAndroid Build Coastguard Worker 
82*fb1b10abSAndroid Build Coastguard Worker   /* build dc block from 16 y dc values */
83*fb1b10abSAndroid Build Coastguard Worker   build_dcblock(x);
84*fb1b10abSAndroid Build Coastguard Worker 
85*fb1b10abSAndroid Build Coastguard Worker   /* do 2nd order transform on the dc block */
86*fb1b10abSAndroid Build Coastguard Worker   x->short_walsh4x4(&x->block[24].src_diff[0], &x->block[24].coeff[0], 8);
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker 
transform_mb(MACROBLOCK * x)89*fb1b10abSAndroid Build Coastguard Worker static void transform_mb(MACROBLOCK *x) {
90*fb1b10abSAndroid Build Coastguard Worker   int i;
91*fb1b10abSAndroid Build Coastguard Worker 
92*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; i += 2) {
93*fb1b10abSAndroid Build Coastguard Worker     x->short_fdct8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32);
94*fb1b10abSAndroid Build Coastguard Worker   }
95*fb1b10abSAndroid Build Coastguard Worker 
96*fb1b10abSAndroid Build Coastguard Worker   /* build dc block from 16 y dc values */
97*fb1b10abSAndroid Build Coastguard Worker   if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) build_dcblock(x);
98*fb1b10abSAndroid Build Coastguard Worker 
99*fb1b10abSAndroid Build Coastguard Worker   for (i = 16; i < 24; i += 2) {
100*fb1b10abSAndroid Build Coastguard Worker     x->short_fdct8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 16);
101*fb1b10abSAndroid Build Coastguard Worker   }
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker   /* do 2nd order transform on the dc block */
104*fb1b10abSAndroid Build Coastguard Worker   if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) {
105*fb1b10abSAndroid Build Coastguard Worker     x->short_walsh4x4(&x->block[24].src_diff[0], &x->block[24].coeff[0], 8);
106*fb1b10abSAndroid Build Coastguard Worker   }
107*fb1b10abSAndroid Build Coastguard Worker }
108*fb1b10abSAndroid Build Coastguard Worker 
transform_mby(MACROBLOCK * x)109*fb1b10abSAndroid Build Coastguard Worker static void transform_mby(MACROBLOCK *x) {
110*fb1b10abSAndroid Build Coastguard Worker   int i;
111*fb1b10abSAndroid Build Coastguard Worker 
112*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 16; i += 2) {
113*fb1b10abSAndroid Build Coastguard Worker     x->short_fdct8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32);
114*fb1b10abSAndroid Build Coastguard Worker   }
115*fb1b10abSAndroid Build Coastguard Worker 
116*fb1b10abSAndroid Build Coastguard Worker   /* build dc block from 16 y dc values */
117*fb1b10abSAndroid Build Coastguard Worker   if (x->e_mbd.mode_info_context->mbmi.mode != SPLITMV) {
118*fb1b10abSAndroid Build Coastguard Worker     build_dcblock(x);
119*fb1b10abSAndroid Build Coastguard Worker     x->short_walsh4x4(&x->block[24].src_diff[0], &x->block[24].coeff[0], 8);
120*fb1b10abSAndroid Build Coastguard Worker   }
121*fb1b10abSAndroid Build Coastguard Worker }
122*fb1b10abSAndroid Build Coastguard Worker 
123*fb1b10abSAndroid Build Coastguard Worker #define RDTRUNC(RM, DM, R, D) ((128 + (R) * (RM)) & 0xFF)
124*fb1b10abSAndroid Build Coastguard Worker 
125*fb1b10abSAndroid Build Coastguard Worker typedef struct vp8_token_state vp8_token_state;
126*fb1b10abSAndroid Build Coastguard Worker 
127*fb1b10abSAndroid Build Coastguard Worker struct vp8_token_state {
128*fb1b10abSAndroid Build Coastguard Worker   int rate;
129*fb1b10abSAndroid Build Coastguard Worker   int error;
130*fb1b10abSAndroid Build Coastguard Worker   signed char next;
131*fb1b10abSAndroid Build Coastguard Worker   signed char token;
132*fb1b10abSAndroid Build Coastguard Worker   short qc;
133*fb1b10abSAndroid Build Coastguard Worker };
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker /* TODO: experiments to find optimal multiple numbers */
136*fb1b10abSAndroid Build Coastguard Worker #define Y1_RD_MULT 4
137*fb1b10abSAndroid Build Coastguard Worker #define UV_RD_MULT 2
138*fb1b10abSAndroid Build Coastguard Worker #define Y2_RD_MULT 16
139*fb1b10abSAndroid Build Coastguard Worker 
140*fb1b10abSAndroid Build Coastguard Worker static const int plane_rd_mult[4] = { Y1_RD_MULT, Y2_RD_MULT, UV_RD_MULT,
141*fb1b10abSAndroid Build Coastguard Worker                                       Y1_RD_MULT };
142*fb1b10abSAndroid Build Coastguard Worker 
optimize_b(MACROBLOCK * mb,int ib,int type,ENTROPY_CONTEXT * a,ENTROPY_CONTEXT * l)143*fb1b10abSAndroid Build Coastguard Worker static void optimize_b(MACROBLOCK *mb, int ib, int type, ENTROPY_CONTEXT *a,
144*fb1b10abSAndroid Build Coastguard Worker                        ENTROPY_CONTEXT *l) {
145*fb1b10abSAndroid Build Coastguard Worker   BLOCK *b;
146*fb1b10abSAndroid Build Coastguard Worker   BLOCKD *d;
147*fb1b10abSAndroid Build Coastguard Worker   vp8_token_state tokens[17][2];
148*fb1b10abSAndroid Build Coastguard Worker   unsigned best_mask[2];
149*fb1b10abSAndroid Build Coastguard Worker   const short *dequant_ptr;
150*fb1b10abSAndroid Build Coastguard Worker   const short *coeff_ptr;
151*fb1b10abSAndroid Build Coastguard Worker   short *qcoeff_ptr;
152*fb1b10abSAndroid Build Coastguard Worker   short *dqcoeff_ptr;
153*fb1b10abSAndroid Build Coastguard Worker   int eob;
154*fb1b10abSAndroid Build Coastguard Worker   int i0;
155*fb1b10abSAndroid Build Coastguard Worker   int rc;
156*fb1b10abSAndroid Build Coastguard Worker   int x;
157*fb1b10abSAndroid Build Coastguard Worker   int sz = 0;
158*fb1b10abSAndroid Build Coastguard Worker   int next;
159*fb1b10abSAndroid Build Coastguard Worker   int rdmult;
160*fb1b10abSAndroid Build Coastguard Worker   int rddiv;
161*fb1b10abSAndroid Build Coastguard Worker   int final_eob;
162*fb1b10abSAndroid Build Coastguard Worker   int rd_cost0;
163*fb1b10abSAndroid Build Coastguard Worker   int rd_cost1;
164*fb1b10abSAndroid Build Coastguard Worker   int rate0;
165*fb1b10abSAndroid Build Coastguard Worker   int rate1;
166*fb1b10abSAndroid Build Coastguard Worker   int error0;
167*fb1b10abSAndroid Build Coastguard Worker   int error1;
168*fb1b10abSAndroid Build Coastguard Worker   int t0;
169*fb1b10abSAndroid Build Coastguard Worker   int t1;
170*fb1b10abSAndroid Build Coastguard Worker   int best;
171*fb1b10abSAndroid Build Coastguard Worker   int band;
172*fb1b10abSAndroid Build Coastguard Worker   int pt;
173*fb1b10abSAndroid Build Coastguard Worker   int i;
174*fb1b10abSAndroid Build Coastguard Worker   int err_mult = plane_rd_mult[type];
175*fb1b10abSAndroid Build Coastguard Worker 
176*fb1b10abSAndroid Build Coastguard Worker   b = &mb->block[ib];
177*fb1b10abSAndroid Build Coastguard Worker   d = &mb->e_mbd.block[ib];
178*fb1b10abSAndroid Build Coastguard Worker 
179*fb1b10abSAndroid Build Coastguard Worker   dequant_ptr = d->dequant;
180*fb1b10abSAndroid Build Coastguard Worker   coeff_ptr = b->coeff;
181*fb1b10abSAndroid Build Coastguard Worker   qcoeff_ptr = d->qcoeff;
182*fb1b10abSAndroid Build Coastguard Worker   dqcoeff_ptr = d->dqcoeff;
183*fb1b10abSAndroid Build Coastguard Worker   i0 = !type;
184*fb1b10abSAndroid Build Coastguard Worker   eob = *d->eob;
185*fb1b10abSAndroid Build Coastguard Worker 
186*fb1b10abSAndroid Build Coastguard Worker   /* Now set up a Viterbi trellis to evaluate alternative roundings. */
187*fb1b10abSAndroid Build Coastguard Worker   rdmult = mb->rdmult * err_mult;
188*fb1b10abSAndroid Build Coastguard Worker   if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
189*fb1b10abSAndroid Build Coastguard Worker     rdmult = (rdmult * 9) >> 4;
190*fb1b10abSAndroid Build Coastguard Worker   }
191*fb1b10abSAndroid Build Coastguard Worker 
192*fb1b10abSAndroid Build Coastguard Worker   rddiv = mb->rddiv;
193*fb1b10abSAndroid Build Coastguard Worker   best_mask[0] = best_mask[1] = 0;
194*fb1b10abSAndroid Build Coastguard Worker   /* Initialize the sentinel node of the trellis. */
195*fb1b10abSAndroid Build Coastguard Worker   tokens[eob][0].rate = 0;
196*fb1b10abSAndroid Build Coastguard Worker   tokens[eob][0].error = 0;
197*fb1b10abSAndroid Build Coastguard Worker   tokens[eob][0].next = 16;
198*fb1b10abSAndroid Build Coastguard Worker   tokens[eob][0].token = DCT_EOB_TOKEN;
199*fb1b10abSAndroid Build Coastguard Worker   tokens[eob][0].qc = 0;
200*fb1b10abSAndroid Build Coastguard Worker   *(tokens[eob] + 1) = *(tokens[eob] + 0);
201*fb1b10abSAndroid Build Coastguard Worker   next = eob;
202*fb1b10abSAndroid Build Coastguard Worker   for (i = eob; i-- > i0;) {
203*fb1b10abSAndroid Build Coastguard Worker     int base_bits;
204*fb1b10abSAndroid Build Coastguard Worker     int d2;
205*fb1b10abSAndroid Build Coastguard Worker     int dx;
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker     rc = vp8_default_zig_zag1d[i];
208*fb1b10abSAndroid Build Coastguard Worker     x = qcoeff_ptr[rc];
209*fb1b10abSAndroid Build Coastguard Worker     /* Only add a trellis state for non-zero coefficients. */
210*fb1b10abSAndroid Build Coastguard Worker     if (x) {
211*fb1b10abSAndroid Build Coastguard Worker       int shortcut = 0;
212*fb1b10abSAndroid Build Coastguard Worker       error0 = tokens[next][0].error;
213*fb1b10abSAndroid Build Coastguard Worker       error1 = tokens[next][1].error;
214*fb1b10abSAndroid Build Coastguard Worker       /* Evaluate the first possibility for this state. */
215*fb1b10abSAndroid Build Coastguard Worker       rate0 = tokens[next][0].rate;
216*fb1b10abSAndroid Build Coastguard Worker       rate1 = tokens[next][1].rate;
217*fb1b10abSAndroid Build Coastguard Worker       t0 = (vp8_dct_value_tokens_ptr + x)->Token;
218*fb1b10abSAndroid Build Coastguard Worker       /* Consider both possible successor states. */
219*fb1b10abSAndroid Build Coastguard Worker       if (next < 16) {
220*fb1b10abSAndroid Build Coastguard Worker         band = vp8_coef_bands[i + 1];
221*fb1b10abSAndroid Build Coastguard Worker         pt = vp8_prev_token_class[t0];
222*fb1b10abSAndroid Build Coastguard Worker         rate0 += mb->token_costs[type][band][pt][tokens[next][0].token];
223*fb1b10abSAndroid Build Coastguard Worker         rate1 += mb->token_costs[type][band][pt][tokens[next][1].token];
224*fb1b10abSAndroid Build Coastguard Worker       }
225*fb1b10abSAndroid Build Coastguard Worker       rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
226*fb1b10abSAndroid Build Coastguard Worker       rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
227*fb1b10abSAndroid Build Coastguard Worker       if (rd_cost0 == rd_cost1) {
228*fb1b10abSAndroid Build Coastguard Worker         rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
229*fb1b10abSAndroid Build Coastguard Worker         rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
230*fb1b10abSAndroid Build Coastguard Worker       }
231*fb1b10abSAndroid Build Coastguard Worker       /* And pick the best. */
232*fb1b10abSAndroid Build Coastguard Worker       best = rd_cost1 < rd_cost0;
233*fb1b10abSAndroid Build Coastguard Worker       base_bits = *(vp8_dct_value_cost_ptr + x);
234*fb1b10abSAndroid Build Coastguard Worker       dx = dqcoeff_ptr[rc] - coeff_ptr[rc];
235*fb1b10abSAndroid Build Coastguard Worker       d2 = dx * dx;
236*fb1b10abSAndroid Build Coastguard Worker       tokens[i][0].rate = base_bits + (best ? rate1 : rate0);
237*fb1b10abSAndroid Build Coastguard Worker       tokens[i][0].error = d2 + (best ? error1 : error0);
238*fb1b10abSAndroid Build Coastguard Worker       tokens[i][0].next = next;
239*fb1b10abSAndroid Build Coastguard Worker       tokens[i][0].token = t0;
240*fb1b10abSAndroid Build Coastguard Worker       tokens[i][0].qc = x;
241*fb1b10abSAndroid Build Coastguard Worker       best_mask[0] |= best << i;
242*fb1b10abSAndroid Build Coastguard Worker       /* Evaluate the second possibility for this state. */
243*fb1b10abSAndroid Build Coastguard Worker       rate0 = tokens[next][0].rate;
244*fb1b10abSAndroid Build Coastguard Worker       rate1 = tokens[next][1].rate;
245*fb1b10abSAndroid Build Coastguard Worker 
246*fb1b10abSAndroid Build Coastguard Worker       if ((abs(x) * dequant_ptr[rc] > abs(coeff_ptr[rc])) &&
247*fb1b10abSAndroid Build Coastguard Worker           (abs(x) * dequant_ptr[rc] < abs(coeff_ptr[rc]) + dequant_ptr[rc])) {
248*fb1b10abSAndroid Build Coastguard Worker         shortcut = 1;
249*fb1b10abSAndroid Build Coastguard Worker       } else {
250*fb1b10abSAndroid Build Coastguard Worker         shortcut = 0;
251*fb1b10abSAndroid Build Coastguard Worker       }
252*fb1b10abSAndroid Build Coastguard Worker 
253*fb1b10abSAndroid Build Coastguard Worker       if (shortcut) {
254*fb1b10abSAndroid Build Coastguard Worker         sz = -(x < 0);
255*fb1b10abSAndroid Build Coastguard Worker         x -= 2 * sz + 1;
256*fb1b10abSAndroid Build Coastguard Worker       }
257*fb1b10abSAndroid Build Coastguard Worker 
258*fb1b10abSAndroid Build Coastguard Worker       /* Consider both possible successor states. */
259*fb1b10abSAndroid Build Coastguard Worker       if (!x) {
260*fb1b10abSAndroid Build Coastguard Worker         /* If we reduced this coefficient to zero, check to see if
261*fb1b10abSAndroid Build Coastguard Worker          *  we need to move the EOB back here.
262*fb1b10abSAndroid Build Coastguard Worker          */
263*fb1b10abSAndroid Build Coastguard Worker         t0 =
264*fb1b10abSAndroid Build Coastguard Worker             tokens[next][0].token == DCT_EOB_TOKEN ? DCT_EOB_TOKEN : ZERO_TOKEN;
265*fb1b10abSAndroid Build Coastguard Worker         t1 =
266*fb1b10abSAndroid Build Coastguard Worker             tokens[next][1].token == DCT_EOB_TOKEN ? DCT_EOB_TOKEN : ZERO_TOKEN;
267*fb1b10abSAndroid Build Coastguard Worker       } else {
268*fb1b10abSAndroid Build Coastguard Worker         t0 = t1 = (vp8_dct_value_tokens_ptr + x)->Token;
269*fb1b10abSAndroid Build Coastguard Worker       }
270*fb1b10abSAndroid Build Coastguard Worker       if (next < 16) {
271*fb1b10abSAndroid Build Coastguard Worker         band = vp8_coef_bands[i + 1];
272*fb1b10abSAndroid Build Coastguard Worker         if (t0 != DCT_EOB_TOKEN) {
273*fb1b10abSAndroid Build Coastguard Worker           pt = vp8_prev_token_class[t0];
274*fb1b10abSAndroid Build Coastguard Worker           rate0 += mb->token_costs[type][band][pt][tokens[next][0].token];
275*fb1b10abSAndroid Build Coastguard Worker         }
276*fb1b10abSAndroid Build Coastguard Worker         if (t1 != DCT_EOB_TOKEN) {
277*fb1b10abSAndroid Build Coastguard Worker           pt = vp8_prev_token_class[t1];
278*fb1b10abSAndroid Build Coastguard Worker           rate1 += mb->token_costs[type][band][pt][tokens[next][1].token];
279*fb1b10abSAndroid Build Coastguard Worker         }
280*fb1b10abSAndroid Build Coastguard Worker       }
281*fb1b10abSAndroid Build Coastguard Worker 
282*fb1b10abSAndroid Build Coastguard Worker       rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
283*fb1b10abSAndroid Build Coastguard Worker       rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
284*fb1b10abSAndroid Build Coastguard Worker       if (rd_cost0 == rd_cost1) {
285*fb1b10abSAndroid Build Coastguard Worker         rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
286*fb1b10abSAndroid Build Coastguard Worker         rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
287*fb1b10abSAndroid Build Coastguard Worker       }
288*fb1b10abSAndroid Build Coastguard Worker       /* And pick the best. */
289*fb1b10abSAndroid Build Coastguard Worker       best = rd_cost1 < rd_cost0;
290*fb1b10abSAndroid Build Coastguard Worker       base_bits = *(vp8_dct_value_cost_ptr + x);
291*fb1b10abSAndroid Build Coastguard Worker 
292*fb1b10abSAndroid Build Coastguard Worker       if (shortcut) {
293*fb1b10abSAndroid Build Coastguard Worker         dx -= (dequant_ptr[rc] + sz) ^ sz;
294*fb1b10abSAndroid Build Coastguard Worker         d2 = dx * dx;
295*fb1b10abSAndroid Build Coastguard Worker       }
296*fb1b10abSAndroid Build Coastguard Worker       tokens[i][1].rate = base_bits + (best ? rate1 : rate0);
297*fb1b10abSAndroid Build Coastguard Worker       tokens[i][1].error = d2 + (best ? error1 : error0);
298*fb1b10abSAndroid Build Coastguard Worker       tokens[i][1].next = next;
299*fb1b10abSAndroid Build Coastguard Worker       tokens[i][1].token = best ? t1 : t0;
300*fb1b10abSAndroid Build Coastguard Worker       tokens[i][1].qc = x;
301*fb1b10abSAndroid Build Coastguard Worker       best_mask[1] |= best << i;
302*fb1b10abSAndroid Build Coastguard Worker       /* Finally, make this the new head of the trellis. */
303*fb1b10abSAndroid Build Coastguard Worker       next = i;
304*fb1b10abSAndroid Build Coastguard Worker     }
305*fb1b10abSAndroid Build Coastguard Worker     /* There's no choice to make for a zero coefficient, so we don't
306*fb1b10abSAndroid Build Coastguard Worker      *  add a new trellis node, but we do need to update the costs.
307*fb1b10abSAndroid Build Coastguard Worker      */
308*fb1b10abSAndroid Build Coastguard Worker     else {
309*fb1b10abSAndroid Build Coastguard Worker       band = vp8_coef_bands[i + 1];
310*fb1b10abSAndroid Build Coastguard Worker       t0 = tokens[next][0].token;
311*fb1b10abSAndroid Build Coastguard Worker       t1 = tokens[next][1].token;
312*fb1b10abSAndroid Build Coastguard Worker       /* Update the cost of each path if we're past the EOB token. */
313*fb1b10abSAndroid Build Coastguard Worker       if (t0 != DCT_EOB_TOKEN) {
314*fb1b10abSAndroid Build Coastguard Worker         tokens[next][0].rate += mb->token_costs[type][band][0][t0];
315*fb1b10abSAndroid Build Coastguard Worker         tokens[next][0].token = ZERO_TOKEN;
316*fb1b10abSAndroid Build Coastguard Worker       }
317*fb1b10abSAndroid Build Coastguard Worker       if (t1 != DCT_EOB_TOKEN) {
318*fb1b10abSAndroid Build Coastguard Worker         tokens[next][1].rate += mb->token_costs[type][band][0][t1];
319*fb1b10abSAndroid Build Coastguard Worker         tokens[next][1].token = ZERO_TOKEN;
320*fb1b10abSAndroid Build Coastguard Worker       }
321*fb1b10abSAndroid Build Coastguard Worker       /* Don't update next, because we didn't add a new node. */
322*fb1b10abSAndroid Build Coastguard Worker     }
323*fb1b10abSAndroid Build Coastguard Worker   }
324*fb1b10abSAndroid Build Coastguard Worker 
325*fb1b10abSAndroid Build Coastguard Worker   /* Now pick the best path through the whole trellis. */
326*fb1b10abSAndroid Build Coastguard Worker   band = vp8_coef_bands[i + 1];
327*fb1b10abSAndroid Build Coastguard Worker   VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
328*fb1b10abSAndroid Build Coastguard Worker   rate0 = tokens[next][0].rate;
329*fb1b10abSAndroid Build Coastguard Worker   rate1 = tokens[next][1].rate;
330*fb1b10abSAndroid Build Coastguard Worker   error0 = tokens[next][0].error;
331*fb1b10abSAndroid Build Coastguard Worker   error1 = tokens[next][1].error;
332*fb1b10abSAndroid Build Coastguard Worker   t0 = tokens[next][0].token;
333*fb1b10abSAndroid Build Coastguard Worker   t1 = tokens[next][1].token;
334*fb1b10abSAndroid Build Coastguard Worker   rate0 += mb->token_costs[type][band][pt][t0];
335*fb1b10abSAndroid Build Coastguard Worker   rate1 += mb->token_costs[type][band][pt][t1];
336*fb1b10abSAndroid Build Coastguard Worker   rd_cost0 = RDCOST(rdmult, rddiv, rate0, error0);
337*fb1b10abSAndroid Build Coastguard Worker   rd_cost1 = RDCOST(rdmult, rddiv, rate1, error1);
338*fb1b10abSAndroid Build Coastguard Worker   if (rd_cost0 == rd_cost1) {
339*fb1b10abSAndroid Build Coastguard Worker     rd_cost0 = RDTRUNC(rdmult, rddiv, rate0, error0);
340*fb1b10abSAndroid Build Coastguard Worker     rd_cost1 = RDTRUNC(rdmult, rddiv, rate1, error1);
341*fb1b10abSAndroid Build Coastguard Worker   }
342*fb1b10abSAndroid Build Coastguard Worker   best = rd_cost1 < rd_cost0;
343*fb1b10abSAndroid Build Coastguard Worker   final_eob = i0 - 1;
344*fb1b10abSAndroid Build Coastguard Worker   for (i = next; i < eob; i = next) {
345*fb1b10abSAndroid Build Coastguard Worker     x = tokens[i][best].qc;
346*fb1b10abSAndroid Build Coastguard Worker     if (x) final_eob = i;
347*fb1b10abSAndroid Build Coastguard Worker     rc = vp8_default_zig_zag1d[i];
348*fb1b10abSAndroid Build Coastguard Worker     qcoeff_ptr[rc] = x;
349*fb1b10abSAndroid Build Coastguard Worker     dqcoeff_ptr[rc] = x * dequant_ptr[rc];
350*fb1b10abSAndroid Build Coastguard Worker     next = tokens[i][best].next;
351*fb1b10abSAndroid Build Coastguard Worker     best = (best_mask[best] >> i) & 1;
352*fb1b10abSAndroid Build Coastguard Worker   }
353*fb1b10abSAndroid Build Coastguard Worker   final_eob++;
354*fb1b10abSAndroid Build Coastguard Worker 
355*fb1b10abSAndroid Build Coastguard Worker   *a = *l = (final_eob != !type);
356*fb1b10abSAndroid Build Coastguard Worker   *d->eob = (char)final_eob;
357*fb1b10abSAndroid Build Coastguard Worker }
check_reset_2nd_coeffs(MACROBLOCKD * x,int type,ENTROPY_CONTEXT * a,ENTROPY_CONTEXT * l)358*fb1b10abSAndroid Build Coastguard Worker static void check_reset_2nd_coeffs(MACROBLOCKD *x, int type, ENTROPY_CONTEXT *a,
359*fb1b10abSAndroid Build Coastguard Worker                                    ENTROPY_CONTEXT *l) {
360*fb1b10abSAndroid Build Coastguard Worker   int sum = 0;
361*fb1b10abSAndroid Build Coastguard Worker   int i;
362*fb1b10abSAndroid Build Coastguard Worker   BLOCKD *bd = &x->block[24];
363*fb1b10abSAndroid Build Coastguard Worker 
364*fb1b10abSAndroid Build Coastguard Worker   if (bd->dequant[0] >= 35 && bd->dequant[1] >= 35) return;
365*fb1b10abSAndroid Build Coastguard Worker 
366*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < (*bd->eob); ++i) {
367*fb1b10abSAndroid Build Coastguard Worker     int coef = bd->dqcoeff[vp8_default_zig_zag1d[i]];
368*fb1b10abSAndroid Build Coastguard Worker     sum += (coef >= 0) ? coef : -coef;
369*fb1b10abSAndroid Build Coastguard Worker     if (sum >= 35) return;
370*fb1b10abSAndroid Build Coastguard Worker   }
371*fb1b10abSAndroid Build Coastguard Worker   /**************************************************************************
372*fb1b10abSAndroid Build Coastguard Worker   our inverse hadamard transform effectively is weighted sum of all 16 inputs
373*fb1b10abSAndroid Build Coastguard Worker   with weight either 1 or -1. It has a last stage scaling of (sum+3)>>3. And
374*fb1b10abSAndroid Build Coastguard Worker   dc only idct is (dc+4)>>3. So if all the sums are between -35 and 29, the
375*fb1b10abSAndroid Build Coastguard Worker   output after inverse wht and idct will be all zero. A sum of absolute value
376*fb1b10abSAndroid Build Coastguard Worker   smaller than 35 guarantees all 16 different (+1/-1) weighted sums in wht
377*fb1b10abSAndroid Build Coastguard Worker   fall between -35 and +35.
378*fb1b10abSAndroid Build Coastguard Worker   **************************************************************************/
379*fb1b10abSAndroid Build Coastguard Worker   if (sum < 35) {
380*fb1b10abSAndroid Build Coastguard Worker     for (i = 0; i < (*bd->eob); ++i) {
381*fb1b10abSAndroid Build Coastguard Worker       int rc = vp8_default_zig_zag1d[i];
382*fb1b10abSAndroid Build Coastguard Worker       bd->qcoeff[rc] = 0;
383*fb1b10abSAndroid Build Coastguard Worker       bd->dqcoeff[rc] = 0;
384*fb1b10abSAndroid Build Coastguard Worker     }
385*fb1b10abSAndroid Build Coastguard Worker     *bd->eob = 0;
386*fb1b10abSAndroid Build Coastguard Worker     *a = *l = (*bd->eob != !type);
387*fb1b10abSAndroid Build Coastguard Worker   }
388*fb1b10abSAndroid Build Coastguard Worker }
389*fb1b10abSAndroid Build Coastguard Worker 
optimize_mb(MACROBLOCK * x)390*fb1b10abSAndroid Build Coastguard Worker static void optimize_mb(MACROBLOCK *x) {
391*fb1b10abSAndroid Build Coastguard Worker   int b;
392*fb1b10abSAndroid Build Coastguard Worker   int type;
393*fb1b10abSAndroid Build Coastguard Worker   int has_2nd_order;
394*fb1b10abSAndroid Build Coastguard Worker 
395*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT_PLANES t_above, t_left;
396*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *ta;
397*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *tl;
398*fb1b10abSAndroid Build Coastguard Worker 
399*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
400*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
401*fb1b10abSAndroid Build Coastguard Worker 
402*fb1b10abSAndroid Build Coastguard Worker   ta = (ENTROPY_CONTEXT *)&t_above;
403*fb1b10abSAndroid Build Coastguard Worker   tl = (ENTROPY_CONTEXT *)&t_left;
404*fb1b10abSAndroid Build Coastguard Worker 
405*fb1b10abSAndroid Build Coastguard Worker   has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED &&
406*fb1b10abSAndroid Build Coastguard Worker                    x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
407*fb1b10abSAndroid Build Coastguard Worker   type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
408*fb1b10abSAndroid Build Coastguard Worker 
409*fb1b10abSAndroid Build Coastguard Worker   for (b = 0; b < 16; ++b) {
410*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, type, ta + vp8_block2above[b], tl + vp8_block2left[b]);
411*fb1b10abSAndroid Build Coastguard Worker   }
412*fb1b10abSAndroid Build Coastguard Worker 
413*fb1b10abSAndroid Build Coastguard Worker   for (b = 16; b < 24; ++b) {
414*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, PLANE_TYPE_UV, ta + vp8_block2above[b],
415*fb1b10abSAndroid Build Coastguard Worker                tl + vp8_block2left[b]);
416*fb1b10abSAndroid Build Coastguard Worker   }
417*fb1b10abSAndroid Build Coastguard Worker 
418*fb1b10abSAndroid Build Coastguard Worker   if (has_2nd_order) {
419*fb1b10abSAndroid Build Coastguard Worker     b = 24;
420*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, PLANE_TYPE_Y2, ta + vp8_block2above[b],
421*fb1b10abSAndroid Build Coastguard Worker                tl + vp8_block2left[b]);
422*fb1b10abSAndroid Build Coastguard Worker     check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2, ta + vp8_block2above[b],
423*fb1b10abSAndroid Build Coastguard Worker                            tl + vp8_block2left[b]);
424*fb1b10abSAndroid Build Coastguard Worker   }
425*fb1b10abSAndroid Build Coastguard Worker }
426*fb1b10abSAndroid Build Coastguard Worker 
vp8_optimize_mby(MACROBLOCK * x)427*fb1b10abSAndroid Build Coastguard Worker void vp8_optimize_mby(MACROBLOCK *x) {
428*fb1b10abSAndroid Build Coastguard Worker   int b;
429*fb1b10abSAndroid Build Coastguard Worker   int type;
430*fb1b10abSAndroid Build Coastguard Worker   int has_2nd_order;
431*fb1b10abSAndroid Build Coastguard Worker 
432*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT_PLANES t_above, t_left;
433*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *ta;
434*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *tl;
435*fb1b10abSAndroid Build Coastguard Worker 
436*fb1b10abSAndroid Build Coastguard Worker   if (!x->e_mbd.above_context) return;
437*fb1b10abSAndroid Build Coastguard Worker 
438*fb1b10abSAndroid Build Coastguard Worker   if (!x->e_mbd.left_context) return;
439*fb1b10abSAndroid Build Coastguard Worker 
440*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
441*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
442*fb1b10abSAndroid Build Coastguard Worker 
443*fb1b10abSAndroid Build Coastguard Worker   ta = (ENTROPY_CONTEXT *)&t_above;
444*fb1b10abSAndroid Build Coastguard Worker   tl = (ENTROPY_CONTEXT *)&t_left;
445*fb1b10abSAndroid Build Coastguard Worker 
446*fb1b10abSAndroid Build Coastguard Worker   has_2nd_order = (x->e_mbd.mode_info_context->mbmi.mode != B_PRED &&
447*fb1b10abSAndroid Build Coastguard Worker                    x->e_mbd.mode_info_context->mbmi.mode != SPLITMV);
448*fb1b10abSAndroid Build Coastguard Worker   type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
449*fb1b10abSAndroid Build Coastguard Worker 
450*fb1b10abSAndroid Build Coastguard Worker   for (b = 0; b < 16; ++b) {
451*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, type, ta + vp8_block2above[b], tl + vp8_block2left[b]);
452*fb1b10abSAndroid Build Coastguard Worker   }
453*fb1b10abSAndroid Build Coastguard Worker 
454*fb1b10abSAndroid Build Coastguard Worker   if (has_2nd_order) {
455*fb1b10abSAndroid Build Coastguard Worker     b = 24;
456*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, PLANE_TYPE_Y2, ta + vp8_block2above[b],
457*fb1b10abSAndroid Build Coastguard Worker                tl + vp8_block2left[b]);
458*fb1b10abSAndroid Build Coastguard Worker     check_reset_2nd_coeffs(&x->e_mbd, PLANE_TYPE_Y2, ta + vp8_block2above[b],
459*fb1b10abSAndroid Build Coastguard Worker                            tl + vp8_block2left[b]);
460*fb1b10abSAndroid Build Coastguard Worker   }
461*fb1b10abSAndroid Build Coastguard Worker }
462*fb1b10abSAndroid Build Coastguard Worker 
vp8_optimize_mbuv(MACROBLOCK * x)463*fb1b10abSAndroid Build Coastguard Worker void vp8_optimize_mbuv(MACROBLOCK *x) {
464*fb1b10abSAndroid Build Coastguard Worker   int b;
465*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT_PLANES t_above, t_left;
466*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *ta;
467*fb1b10abSAndroid Build Coastguard Worker   ENTROPY_CONTEXT *tl;
468*fb1b10abSAndroid Build Coastguard Worker 
469*fb1b10abSAndroid Build Coastguard Worker   if (!x->e_mbd.above_context) return;
470*fb1b10abSAndroid Build Coastguard Worker 
471*fb1b10abSAndroid Build Coastguard Worker   if (!x->e_mbd.left_context) return;
472*fb1b10abSAndroid Build Coastguard Worker 
473*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
474*fb1b10abSAndroid Build Coastguard Worker   memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
475*fb1b10abSAndroid Build Coastguard Worker 
476*fb1b10abSAndroid Build Coastguard Worker   ta = (ENTROPY_CONTEXT *)&t_above;
477*fb1b10abSAndroid Build Coastguard Worker   tl = (ENTROPY_CONTEXT *)&t_left;
478*fb1b10abSAndroid Build Coastguard Worker 
479*fb1b10abSAndroid Build Coastguard Worker   for (b = 16; b < 24; ++b) {
480*fb1b10abSAndroid Build Coastguard Worker     optimize_b(x, b, PLANE_TYPE_UV, ta + vp8_block2above[b],
481*fb1b10abSAndroid Build Coastguard Worker                tl + vp8_block2left[b]);
482*fb1b10abSAndroid Build Coastguard Worker   }
483*fb1b10abSAndroid Build Coastguard Worker }
484*fb1b10abSAndroid Build Coastguard Worker 
vp8_encode_inter16x16(MACROBLOCK * x)485*fb1b10abSAndroid Build Coastguard Worker void vp8_encode_inter16x16(MACROBLOCK *x) {
486*fb1b10abSAndroid Build Coastguard Worker   vp8_build_inter_predictors_mb(&x->e_mbd);
487*fb1b10abSAndroid Build Coastguard Worker 
488*fb1b10abSAndroid Build Coastguard Worker   vp8_subtract_mb(x);
489*fb1b10abSAndroid Build Coastguard Worker 
490*fb1b10abSAndroid Build Coastguard Worker   transform_mb(x);
491*fb1b10abSAndroid Build Coastguard Worker 
492*fb1b10abSAndroid Build Coastguard Worker   vp8_quantize_mb(x);
493*fb1b10abSAndroid Build Coastguard Worker 
494*fb1b10abSAndroid Build Coastguard Worker   if (x->optimize) optimize_mb(x);
495*fb1b10abSAndroid Build Coastguard Worker }
496*fb1b10abSAndroid Build Coastguard Worker 
497*fb1b10abSAndroid Build Coastguard Worker /* this funciton is used by first pass only */
vp8_encode_inter16x16y(MACROBLOCK * x)498*fb1b10abSAndroid Build Coastguard Worker void vp8_encode_inter16x16y(MACROBLOCK *x) {
499*fb1b10abSAndroid Build Coastguard Worker   BLOCK *b = &x->block[0];
500*fb1b10abSAndroid Build Coastguard Worker 
501*fb1b10abSAndroid Build Coastguard Worker   vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.dst.y_buffer,
502*fb1b10abSAndroid Build Coastguard Worker                                       x->e_mbd.dst.y_stride);
503*fb1b10abSAndroid Build Coastguard Worker 
504*fb1b10abSAndroid Build Coastguard Worker   vp8_subtract_mby(x->src_diff, *(b->base_src), b->src_stride,
505*fb1b10abSAndroid Build Coastguard Worker                    x->e_mbd.dst.y_buffer, x->e_mbd.dst.y_stride);
506*fb1b10abSAndroid Build Coastguard Worker 
507*fb1b10abSAndroid Build Coastguard Worker   transform_mby(x);
508*fb1b10abSAndroid Build Coastguard Worker 
509*fb1b10abSAndroid Build Coastguard Worker   vp8_quantize_mby(x);
510*fb1b10abSAndroid Build Coastguard Worker 
511*fb1b10abSAndroid Build Coastguard Worker   vp8_inverse_transform_mby(&x->e_mbd);
512*fb1b10abSAndroid Build Coastguard Worker }
513