Moved gf_active code to encoder only
[profile/ivi/libvpx.git] / vp8 / encoder / encodeframe.c
1 /*
2  *  Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11
12 #include "vpx_ports/config.h"
13 #include "encodemb.h"
14 #include "encodemv.h"
15 #include "common.h"
16 #include "onyx_int.h"
17 #include "extend.h"
18 #include "entropymode.h"
19 #include "quant_common.h"
20 #include "segmentation_common.h"
21 #include "setupintrarecon.h"
22 #include "encodeintra.h"
23 #include "reconinter.h"
24 #include "rdopt.h"
25 #include "pickinter.h"
26 #include "findnearmv.h"
27 #include "reconintra.h"
28 #include <stdio.h>
29 #include <limits.h>
30 #include "subpixel.h"
31 #include "vpx_ports/vpx_timer.h"
32
33 #if CONFIG_RUNTIME_CPU_DETECT
34 #define RTCD(x)     &cpi->common.rtcd.x
35 #define IF_RTCD(x)  (x)
36 #else
37 #define RTCD(x)     NULL
38 #define IF_RTCD(x)  NULL
39 #endif
40 extern void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ;
41
42 extern void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex);
43 extern void vp8_auto_select_speed(VP8_COMP *cpi);
44 extern void vp8cx_init_mbrthread_data(VP8_COMP *cpi,
45                                       MACROBLOCK *x,
46                                       MB_ROW_COMP *mbr_ei,
47                                       int mb_row,
48                                       int count);
49 void vp8_build_block_offsets(MACROBLOCK *x);
50 void vp8_setup_block_ptrs(MACROBLOCK *x);
51 int vp8cx_encode_inter_macroblock(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t, int recon_yoffset, int recon_uvoffset);
52 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t);
53
54 #ifdef MODE_STATS
55 unsigned int inter_y_modes[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
56 unsigned int inter_uv_modes[4] = {0, 0, 0, 0};
57 unsigned int inter_b_modes[15]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
58 unsigned int y_modes[5]   = {0, 0, 0, 0, 0};
59 unsigned int uv_modes[4]  = {0, 0, 0, 0};
60 unsigned int b_modes[14]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
61 #endif
62
63 static const int qrounding_factors[129] =
64 {
65     56, 56, 56, 56, 48, 48, 56, 56,
66     48, 48, 48, 48, 48, 48, 48, 48,
67     48, 48, 48, 48, 48, 48, 48, 48,
68     48, 48, 48, 48, 48, 48, 48, 48,
69     48, 48, 48, 48, 48, 48, 48, 48,
70     48, 48, 48, 48, 48, 48, 48, 48,
71     48, 48, 48, 48, 48, 48, 48, 48,
72     48, 48, 48, 48, 48, 48, 48, 48,
73     48, 48, 48, 48, 48, 48, 48, 48,
74     48, 48, 48, 48, 48, 48, 48, 48,
75     48, 48, 48, 48, 48, 48, 48, 48,
76     48, 48, 48, 48, 48, 48, 48, 48,
77     48, 48, 48, 48, 48, 48, 48, 48,
78     48, 48, 48, 48, 48, 48, 48, 48,
79     48, 48, 48, 48, 48, 48, 48, 48,
80     48, 48, 48, 48, 48, 48, 48, 48,
81     48,
82 };
83
84 static const int qzbin_factors[129] =
85 {
86     72, 72, 72, 72, 80, 80, 72, 72,
87     80, 80, 80, 80, 80, 80, 80, 80,
88     80, 80, 80, 80, 80, 80, 80, 80,
89     80, 80, 80, 80, 80, 80, 80, 80,
90     80, 80, 80, 80, 80, 80, 80, 80,
91     80, 80, 80, 80, 80, 80, 80, 80,
92     80, 80, 80, 80, 80, 80, 80, 80,
93     80, 80, 80, 80, 80, 80, 80, 80,
94     80, 80, 80, 80, 80, 80, 80, 80,
95     80, 80, 80, 80, 80, 80, 80, 80,
96     80, 80, 80, 80, 80, 80, 80, 80,
97     80, 80, 80, 80, 80, 80, 80, 80,
98     80, 80, 80, 80, 80, 80, 80, 80,
99     80, 80, 80, 80, 80, 80, 80, 80,
100     80, 80, 80, 80, 80, 80, 80, 80,
101     80, 80, 80, 80, 80, 80, 80, 80,
102     80,
103 };
104 //#define EXACT_QUANT
105 #ifdef EXACT_QUANT
106 static void vp8cx_invert_quant(short *quant, short *shift, short d)
107 {
108     unsigned t;
109     int l;
110     t = d;
111     for(l = 0; t > 1; l++)
112         t>>=1;
113     t = 1 + (1<<(16+l))/d;
114     *quant = (short)(t - (1<<16));
115     *shift = l;
116 }
117
118 void vp8cx_init_quantizer(VP8_COMP *cpi)
119 {
120     int r, c;
121     int i;
122     int quant_val;
123     int Q;
124
125     int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 44, 44};
126
127     for (Q = 0; Q < QINDEX_RANGE; Q++)
128     {
129         // dc values
130         quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
131         vp8cx_invert_quant(cpi->Y1quant[Q][0] + 0,
132                            cpi->Y1quant_shift[Q][0] + 0, quant_val);
133         cpi->Y1zbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
134         cpi->Y1round[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;
135         cpi->common.Y1dequant[Q][0][0] = quant_val;
136         cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
137
138         quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
139         vp8cx_invert_quant(cpi->Y2quant[Q][0] + 0,
140                            cpi->Y2quant_shift[Q][0] + 0, quant_val);
141         cpi->Y2zbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
142         cpi->Y2round[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;
143         cpi->common.Y2dequant[Q][0][0] = quant_val;
144         cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
145
146         quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
147         vp8cx_invert_quant(cpi->UVquant[Q][0] + 0,
148                            cpi->UVquant_shift[Q][0] + 0, quant_val);
149         cpi->UVzbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
150         cpi->UVround[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;
151         cpi->common.UVdequant[Q][0][0] = quant_val;
152         cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
153
154         // all the ac values = ;
155         for (i = 1; i < 16; i++)
156         {
157             int rc = vp8_default_zig_zag1d[i];
158             r = (rc >> 2);
159             c = (rc & 3);
160
161             quant_val = vp8_ac_yquant(Q);
162             vp8cx_invert_quant(cpi->Y1quant[Q][r] + c,
163                                cpi->Y1quant_shift[Q][r] + c, quant_val);
164             cpi->Y1zbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
165             cpi->Y1round[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;
166             cpi->common.Y1dequant[Q][r][c] = quant_val;
167             cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7;
168
169             quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
170             vp8cx_invert_quant(cpi->Y2quant[Q][r] + c,
171                                cpi->Y2quant_shift[Q][r] + c, quant_val);
172             cpi->Y2zbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
173             cpi->Y2round[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;
174             cpi->common.Y2dequant[Q][r][c] = quant_val;
175             cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7;
176
177             quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
178             vp8cx_invert_quant(cpi->UVquant[Q][r] + c,
179                                cpi->UVquant_shift[Q][r] + c, quant_val);
180             cpi->UVzbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
181             cpi->UVround[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;
182             cpi->common.UVdequant[Q][r][c] = quant_val;
183             cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7;
184         }
185     }
186 }
187 #else
188 void vp8cx_init_quantizer(VP8_COMP *cpi)\r
189 {\r
190     int r, c;\r
191     int i;\r
192     int quant_val;\r
193     int Q;\r
194 \r
195     int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 44, 44};\r
196 \r
197     for (Q = 0; Q < QINDEX_RANGE; Q++)\r
198     {\r
199         // dc values\r
200         quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);\r
201         cpi->Y1quant[Q][0][0] = (1 << 16) / quant_val;\r
202         cpi->Y1zbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;\r
203         cpi->Y1round[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;\r
204         cpi->common.Y1dequant[Q][0][0] = quant_val;\r
205         cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;\r
206 \r
207         quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);\r
208         cpi->Y2quant[Q][0][0] = (1 << 16) / quant_val;\r
209         cpi->Y2zbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;\r
210         cpi->Y2round[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;\r
211         cpi->common.Y2dequant[Q][0][0] = quant_val;\r
212         cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;\r
213 \r
214         quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);\r
215         cpi->UVquant[Q][0][0] = (1 << 16) / quant_val;\r
216         cpi->UVzbin[Q][0][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;\r
217         cpi->UVround[Q][0][0] = (qrounding_factors[Q] * quant_val) >> 7;\r
218         cpi->common.UVdequant[Q][0][0] = quant_val;\r
219         cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;\r
220 \r
221         // all the ac values = ;\r
222         for (i = 1; i < 16; i++)\r
223         {\r
224             int rc = vp8_default_zig_zag1d[i];\r
225             r = (rc >> 2);\r
226             c = (rc & 3);\r
227 \r
228             quant_val = vp8_ac_yquant(Q);\r
229             cpi->Y1quant[Q][r][c] = (1 << 16) / quant_val;\r
230             cpi->Y1zbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;\r
231             cpi->Y1round[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;\r
232             cpi->common.Y1dequant[Q][r][c] = quant_val;\r
233             cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7;\r
234 \r
235             quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);\r
236             cpi->Y2quant[Q][r][c] = (1 << 16) / quant_val;\r
237             cpi->Y2zbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;\r
238             cpi->Y2round[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;\r
239             cpi->common.Y2dequant[Q][r][c] = quant_val;\r
240             cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7;\r
241 \r
242             quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);\r
243             cpi->UVquant[Q][r][c] = (1 << 16) / quant_val;\r
244             cpi->UVzbin[Q][r][c] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;\r
245             cpi->UVround[Q][r][c] = (qrounding_factors[Q] * quant_val) >> 7;\r
246             cpi->common.UVdequant[Q][r][c] = quant_val;\r
247             cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7;\r
248         }\r
249     }\r
250 }\r
251 #endif
252 void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
253 {
254     int i;
255     int QIndex;
256     MACROBLOCKD *xd = &x->e_mbd;
257     MB_MODE_INFO *mbmi = &xd->mbmi;
258     int zbin_extra;
259
260     // Select the baseline MB Q index.
261     if (xd->segmentation_enabled)
262     {
263         // Abs Value
264         if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
265             QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id];
266
267         // Delta Value
268         else
269         {
270             QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][mbmi->segment_id];
271             QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0;    // Clamp to valid range
272         }
273     }
274     else
275         QIndex = cpi->common.base_qindex;
276
277     // Y
278     zbin_extra = (cpi->common.Y1dequant[QIndex][0][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
279
280     for (i = 0; i < 16; i++)
281     {
282         x->block[i].quant = cpi->Y1quant[QIndex];
283         x->block[i].quant_shift = cpi->Y1quant_shift[QIndex];
284         x->block[i].zbin = cpi->Y1zbin[QIndex];
285         x->block[i].round = cpi->Y1round[QIndex];
286         x->e_mbd.block[i].dequant = cpi->common.Y1dequant[QIndex];
287         x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex];
288         x->block[i].zbin_extra = (short)zbin_extra;
289     }
290
291     // UV
292     zbin_extra = (cpi->common.UVdequant[QIndex][0][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
293
294     for (i = 16; i < 24; i++)
295     {
296         x->block[i].quant = cpi->UVquant[QIndex];
297         x->block[i].quant_shift = cpi->UVquant_shift[QIndex];
298         x->block[i].zbin = cpi->UVzbin[QIndex];
299         x->block[i].round = cpi->UVround[QIndex];
300         x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex];
301         x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
302         x->block[i].zbin_extra = (short)zbin_extra;
303     }
304
305     // Y2
306     zbin_extra = (cpi->common.Y2dequant[QIndex][0][1] * ((cpi->zbin_over_quant / 2) + cpi->zbin_mode_boost)) >> 7;
307     x->block[24].quant = cpi->Y2quant[QIndex];
308     x->block[24].quant_shift = cpi->Y2quant_shift[QIndex];
309     x->block[24].zbin = cpi->Y2zbin[QIndex];
310     x->block[24].round = cpi->Y2round[QIndex];
311     x->e_mbd.block[24].dequant = cpi->common.Y2dequant[QIndex];
312     x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex];
313     x->block[24].zbin_extra = (short)zbin_extra;
314 }
315
316 void vp8cx_frame_init_quantizer(VP8_COMP *cpi)
317 {
318     // vp8cx_init_quantizer() is first called in vp8_create_compressor(). A check is added here so that vp8cx_init_quantizer() is only called
319     // when these values are not all zero.
320     if (cpi->common.y1dc_delta_q | cpi->common.y2dc_delta_q | cpi->common.uvdc_delta_q | cpi->common.y2ac_delta_q | cpi->common.uvac_delta_q)
321     {
322         vp8cx_init_quantizer(cpi);
323     }
324
325     // MB level quantizer setup
326     vp8cx_mb_init_quantizer(cpi, &cpi->mb);
327 }
328
329
330
331 static
332 void encode_mb_row(VP8_COMP *cpi,
333                    VP8_COMMON *cm,
334                    int mb_row,
335                    MACROBLOCK  *x,
336                    MACROBLOCKD *xd,
337                    TOKENEXTRA **tp,
338                    int *segment_counts,
339                    int *totalrate)
340 {
341     int i;
342     int recon_yoffset, recon_uvoffset;
343     int mb_col;
344     int ref_fb_idx = cm->lst_fb_idx;
345     int dst_fb_idx = cm->new_fb_idx;
346     int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
347     int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
348     int seg_map_index = (mb_row * cpi->common.mb_cols);
349
350
351     // reset above block coeffs
352     xd->above_context[Y1CONTEXT] = cm->above_context[Y1CONTEXT];
353     xd->above_context[UCONTEXT ] = cm->above_context[UCONTEXT ];
354     xd->above_context[VCONTEXT ] = cm->above_context[VCONTEXT ];
355     xd->above_context[Y2CONTEXT] = cm->above_context[Y2CONTEXT];
356
357     xd->up_available = (mb_row != 0);
358     recon_yoffset = (mb_row * recon_y_stride * 16);
359     recon_uvoffset = (mb_row * recon_uv_stride * 8);
360
361     cpi->tplist[mb_row].start = *tp;
362     //printf("Main mb_row = %d\n", mb_row);
363
364     // for each macroblock col in image
365     for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
366     {
367         // Distance of Mb to the various image edges.
368         // These specified to 8th pel as they are always compared to values that are in 1/8th pel units
369         xd->mb_to_left_edge = -((mb_col * 16) << 3);
370         xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
371         xd->mb_to_top_edge = -((mb_row * 16) << 3);
372         xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
373
374         // Set up limit values for motion vectors used to prevent them extending outside the UMV borders
375         x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
376         x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
377         x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
378         x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
379
380         xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
381         xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
382         xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
383         xd->left_available = (mb_col != 0);
384
385         // Is segmentation enabled
386         // MB level adjutment to quantizer
387         if (xd->segmentation_enabled)
388         {
389             // Code to set segment id in xd->mbmi.segment_id for current MB (with range checking)
390             if (cpi->segmentation_map[seg_map_index+mb_col] <= 3)
391                 xd->mbmi.segment_id = cpi->segmentation_map[seg_map_index+mb_col];
392             else
393                 xd->mbmi.segment_id = 0;
394
395             vp8cx_mb_init_quantizer(cpi, x);
396         }
397         else
398             xd->mbmi.segment_id = 0;         // Set to Segment 0 by default
399
400         x->active_ptr = cpi->active_map + seg_map_index + mb_col;
401
402         if (cm->frame_type == KEY_FRAME)
403         {
404             *totalrate += vp8cx_encode_intra_macro_block(cpi, x, tp);
405 #ifdef MODE_STATS
406             y_modes[xd->mbmi.mode] ++;
407 #endif
408         }
409         else
410         {
411             *totalrate += vp8cx_encode_inter_macroblock(cpi, x, tp, recon_yoffset, recon_uvoffset);
412
413 #ifdef MODE_STATS
414             inter_y_modes[xd->mbmi.mode] ++;
415
416             if (xd->mbmi.mode == SPLITMV)
417             {
418                 int b;
419
420                 for (b = 0; b < xd->mbmi.partition_count; b++)
421                 {
422                     inter_b_modes[xd->mbmi.partition_bmi[b].mode] ++;
423                 }
424             }
425
426 #endif
427
428             // Count of last ref frame 0,0 useage
429             if ((xd->mbmi.mode == ZEROMV) && (xd->mbmi.ref_frame == LAST_FRAME))
430                 cpi->inter_zz_count ++;
431
432             // Special case code for cyclic refresh
433             // If cyclic update enabled then copy xd->mbmi.segment_id; (which may have been updated based on mode
434             // during vp8cx_encode_inter_macroblock()) back into the global sgmentation map
435             if (cpi->cyclic_refresh_mode_enabled && xd->segmentation_enabled)
436             {
437                 cpi->segmentation_map[seg_map_index+mb_col] = xd->mbmi.segment_id;
438
439                 // If the block has been refreshed mark it as clean (the magnitude of the -ve influences how long it will be before we consider another refresh):
440                 // Else if it was coded (last frame 0,0) and has not already been refreshed then mark it as a candidate for cleanup next time (marked 0)
441                 // else mark it as dirty (1).
442                 if (xd->mbmi.segment_id)
443                     cpi->cyclic_refresh_map[seg_map_index+mb_col] = -1;
444                 else if ((xd->mbmi.mode == ZEROMV) && (xd->mbmi.ref_frame == LAST_FRAME))
445                 {
446                     if (cpi->cyclic_refresh_map[seg_map_index+mb_col] == 1)
447                         cpi->cyclic_refresh_map[seg_map_index+mb_col] = 0;
448                 }
449                 else
450                     cpi->cyclic_refresh_map[seg_map_index+mb_col] = 1;
451
452             }
453         }
454
455         cpi->tplist[mb_row].stop = *tp;
456
457         x->gf_active_ptr++;      // Increment pointer into gf useage flags structure for next mb
458
459         // store macroblock mode info into context array
460         vpx_memcpy(&xd->mode_info_context->mbmi, &xd->mbmi, sizeof(xd->mbmi));
461
462         for (i = 0; i < 16; i++)
463             vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi));
464
465         // adjust to the next column of macroblocks
466         x->src.y_buffer += 16;
467         x->src.u_buffer += 8;
468         x->src.v_buffer += 8;
469
470         recon_yoffset += 16;
471         recon_uvoffset += 8;
472
473         // Keep track of segment useage
474         segment_counts[xd->mbmi.segment_id] ++;
475
476         // skip to next mb
477         xd->mode_info_context++;
478
479         xd->above_context[Y1CONTEXT] += 4;
480         xd->above_context[UCONTEXT ] += 2;
481         xd->above_context[VCONTEXT ] += 2;
482         xd->above_context[Y2CONTEXT] ++;
483         cpi->current_mb_col_main = mb_col;
484     }
485
486     //extend the recon for intra prediction
487     vp8_extend_mb_row(
488         &cm->yv12_fb[dst_fb_idx],
489         xd->dst.y_buffer + 16,
490         xd->dst.u_buffer + 8,
491         xd->dst.v_buffer + 8);
492
493     // this is to account for the border
494     xd->mode_info_context++;
495 }
496
497
498
499
500
501 void vp8_encode_frame(VP8_COMP *cpi)
502 {
503     int mb_row;
504     MACROBLOCK *const x = & cpi->mb;
505     VP8_COMMON *const cm = & cpi->common;
506     MACROBLOCKD *const xd = & x->e_mbd;
507
508     int i;
509     TOKENEXTRA *tp = cpi->tok;
510     int segment_counts[MAX_MB_SEGMENTS];
511     int totalrate;
512
513     if (cm->frame_type != KEY_FRAME)
514     {
515         if (cm->mcomp_filter_type == SIXTAP)
516         {
517             xd->subpixel_predict     = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, sixtap4x4);
518             xd->subpixel_predict8x4      = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, sixtap8x4);
519             xd->subpixel_predict8x8      = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, sixtap8x8);
520             xd->subpixel_predict16x16    = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, sixtap16x16);
521         }
522         else
523         {
524             xd->subpixel_predict     = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, bilinear4x4);
525             xd->subpixel_predict8x4      = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, bilinear8x4);
526             xd->subpixel_predict8x8      = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, bilinear8x8);
527             xd->subpixel_predict16x16    = SUBPIX_INVOKE(&cpi->common.rtcd.subpix, bilinear16x16);
528         }
529     }
530
531     //else  // Key Frame
532     //{
533     // For key frames make sure the intra ref frame probability value
534     // is set to "all intra"
535     //cpi->prob_intra_coded = 255;
536     //}
537
538
539     x->gf_active_ptr = (signed char *)cpi->gf_active_flags;     // Point to base of GF active flags data structure
540
541     x->vector_range = 32;
542
543     // Count of MBs using the alternate Q if any
544     cpi->alt_qcount = 0;
545
546     // Reset frame count of inter 0,0 motion vector useage.
547     cpi->inter_zz_count = 0;
548
549     vpx_memset(segment_counts, 0, sizeof(segment_counts));
550
551     cpi->prediction_error = 0;
552     cpi->intra_error = 0;
553     cpi->skip_true_count = 0;
554     cpi->skip_false_count = 0;
555
556 #if 0
557     // Experimental code
558     cpi->frame_distortion = 0;
559     cpi->last_mb_distortion = 0;
560 #endif
561
562     totalrate = 0;
563
564     xd->mode_info = cm->mi - 1;
565
566     xd->mode_info_context = cm->mi;
567     xd->mode_info_stride = cm->mode_info_stride;
568
569     xd->frame_type = cm->frame_type;
570
571     xd->frames_since_golden = cm->frames_since_golden;
572     xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame;
573     vp8_zero(cpi->MVcount);
574     // vp8_zero( Contexts)
575     vp8_zero(cpi->coef_counts);
576
577     // reset intra mode contexts
578     if (cm->frame_type == KEY_FRAME)
579         vp8_init_mbmode_probs(cm);
580
581
582     vp8cx_frame_init_quantizer(cpi);
583
584     if (cpi->compressor_speed == 2)
585     {
586         if (cpi->oxcf.cpu_used < 0)
587             cpi->Speed = -(cpi->oxcf.cpu_used);
588         else
589             vp8_auto_select_speed(cpi);
590     }
591
592     vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
593     //vp8_initialize_rd_consts( cpi, vp8_dc_quant(cpi->avg_frame_qindex, cm->y1dc_delta_q) );
594     vp8cx_initialize_me_consts(cpi, cm->base_qindex);
595     //vp8cx_initialize_me_consts( cpi, cpi->avg_frame_qindex);
596
597     // Copy data over into macro block data sturctures.
598
599     x->src = * cpi->Source;
600     xd->pre = cm->yv12_fb[cm->lst_fb_idx];
601     xd->dst = cm->yv12_fb[cm->new_fb_idx];
602
603     // set up frame new frame for intra coded blocks
604
605     vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]);
606
607     vp8_build_block_offsets(x);
608
609     vp8_setup_block_dptrs(&x->e_mbd);
610
611     vp8_setup_block_ptrs(x);
612
613     x->rddiv = cpi->RDDIV;
614     x->rdmult = cpi->RDMULT;
615
616 #if 0
617     // Experimental rd code
618     // 2 Pass - Possibly set Rdmult based on last frame distortion + this frame target bits or other metrics
619     // such as cpi->rate_correction_factor that indicate relative complexity.
620     /*if ( cpi->pass == 2 && (cpi->last_frame_distortion > 0) && (cpi->target_bits_per_mb > 0) )
621     {
622         //x->rdmult = ((cpi->last_frame_distortion * 256)/cpi->common.MBs)/ cpi->target_bits_per_mb;
623         x->rdmult = (int)(cpi->RDMULT * cpi->rate_correction_factor);
624     }
625     else
626         x->rdmult = cpi->RDMULT; */
627     //x->rdmult = (int)(cpi->RDMULT * pow( (cpi->rate_correction_factor * 2.0), 0.75 ));
628 #endif
629
630     xd->mbmi.mode = DC_PRED;
631     xd->mbmi.uv_mode = DC_PRED;
632
633     xd->left_context = cm->left_context;
634
635     vp8_zero(cpi->count_mb_ref_frame_usage)
636     vp8_zero(cpi->ymode_count)
637     vp8_zero(cpi->uv_mode_count)
638
639     x->mvc = cm->fc.mvc;
640
641     // vp8_zero( entropy_stats)
642     {
643         ENTROPY_CONTEXT **p = cm->above_context;
644         const size_t L = cm->mb_cols;
645
646         vp8_zero_array(p [Y1CONTEXT], L * 4)
647         vp8_zero_array(p [ UCONTEXT], L * 2)
648         vp8_zero_array(p [ VCONTEXT], L * 2)
649         vp8_zero_array(p [Y2CONTEXT], L)
650     }
651
652
653     {
654         struct vpx_usec_timer  emr_timer;
655         vpx_usec_timer_start(&emr_timer);
656
657         if (!cpi->b_multi_threaded)
658         {
659             // for each macroblock row in image
660             for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
661             {
662
663                 vp8_zero(cm->left_context)
664
665                 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
666
667                 // adjust to the next row of mbs
668                 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
669                 x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
670                 x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
671             }
672
673             cpi->tok_count = tp - cpi->tok;
674
675         }
676         else
677         {
678 #if CONFIG_MULTITHREAD
679             vp8cx_init_mbrthread_data(cpi, x, cpi->mb_row_ei, 1,  cpi->encoding_thread_count);
680
681             for (mb_row = 0; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1))
682             {
683                 int i;
684                 cpi->current_mb_col_main = -1;
685
686                 for (i = 0; i < cpi->encoding_thread_count; i++)
687                 {
688                     if ((mb_row + i + 1) >= cm->mb_rows)
689                         break;
690
691                     cpi->mb_row_ei[i].mb_row = mb_row + i + 1;
692                     cpi->mb_row_ei[i].tp  = cpi->tok + (mb_row + i + 1) * (cm->mb_cols * 16 * 24);
693                     cpi->mb_row_ei[i].current_mb_col = -1;
694                     //SetEvent(cpi->h_event_mbrencoding[i]);
695                     sem_post(&cpi->h_event_mbrencoding[i]);
696                 }
697
698                 vp8_zero(cm->left_context)
699
700                 tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
701
702                 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
703
704                 // adjust to the next row of mbs
705                 x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
706                 x->src.u_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
707                 x->src.v_buffer +=  8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
708
709                 xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
710
711                 if (mb_row < cm->mb_rows - 1)
712                     //WaitForSingleObject(cpi->h_event_main, INFINITE);
713                     sem_wait(&cpi->h_event_main);
714             }
715
716             /*
717             for( ;mb_row<cm->mb_rows; mb_row ++)
718             {
719             vp8_zero( cm->left_context)
720
721             tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
722
723             encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
724             // adjust to the next row of mbs
725             x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
726             x->src.u_buffer +=  8 * x->src.uv_stride - 8 * cm->mb_cols;
727             x->src.v_buffer +=  8 * x->src.uv_stride - 8 * cm->mb_cols;
728
729             }
730             */
731             cpi->tok_count = 0;
732
733             for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
734             {
735                 cpi->tok_count += cpi->tplist[mb_row].stop - cpi->tplist[mb_row].start;
736             }
737
738             if (xd->segmentation_enabled)
739             {
740
741                 int i, j;
742
743                 if (xd->segmentation_enabled)
744                 {
745
746                     for (i = 0; i < cpi->encoding_thread_count; i++)
747                     {
748                         for (j = 0; j < 4; j++)
749                             segment_counts[j] += cpi->mb_row_ei[i].segment_counts[j];
750                     }
751                 }
752
753             }
754
755             for (i = 0; i < cpi->encoding_thread_count; i++)
756             {
757                 totalrate += cpi->mb_row_ei[i].totalrate;
758             }
759
760 #endif
761
762         }
763
764         vpx_usec_timer_mark(&emr_timer);
765         cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer);
766
767     }
768
769
770     // Work out the segment probabilites if segmentation is enabled
771     if (xd->segmentation_enabled)
772     {
773         int tot_count;
774         int i;
775
776         // Set to defaults
777         vpx_memset(xd->mb_segment_tree_probs, 255 , sizeof(xd->mb_segment_tree_probs));
778
779         tot_count = segment_counts[0] + segment_counts[1] + segment_counts[2] + segment_counts[3];
780
781         if (tot_count)
782         {
783             xd->mb_segment_tree_probs[0] = ((segment_counts[0] + segment_counts[1]) * 255) / tot_count;
784
785             tot_count = segment_counts[0] + segment_counts[1];
786
787             if (tot_count > 0)
788             {
789                 xd->mb_segment_tree_probs[1] = (segment_counts[0] * 255) / tot_count;
790             }
791
792             tot_count = segment_counts[2] + segment_counts[3];
793
794             if (tot_count > 0)
795                 xd->mb_segment_tree_probs[2] = (segment_counts[2] * 255) / tot_count;
796
797             // Zero probabilities not allowed
798             for (i = 0; i < MB_FEATURE_TREE_PROBS; i ++)
799             {
800                 if (xd->mb_segment_tree_probs[i] == 0)
801                     xd->mb_segment_tree_probs[i] = 1;
802             }
803         }
804     }
805
806     // 256 rate units to the bit
807     cpi->projected_frame_size = totalrate >> 8;   // projected_frame_size in units of BYTES
808
809     // Make a note of the percentage MBs coded Intra.
810     if (cm->frame_type == KEY_FRAME)
811     {
812         cpi->this_frame_percent_intra = 100;
813     }
814     else
815     {
816         int tot_modes;
817
818         tot_modes = cpi->count_mb_ref_frame_usage[INTRA_FRAME]
819                     + cpi->count_mb_ref_frame_usage[LAST_FRAME]
820                     + cpi->count_mb_ref_frame_usage[GOLDEN_FRAME]
821                     + cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
822
823         if (tot_modes)
824             cpi->this_frame_percent_intra = cpi->count_mb_ref_frame_usage[INTRA_FRAME] * 100 / tot_modes;
825
826     }
827
828 #if 0
829     {
830         int cnt = 0;
831         int flag[2] = {0, 0};
832
833         for (cnt = 0; cnt < MVPcount; cnt++)
834         {
835             if (cm->fc.pre_mvc[0][cnt] != cm->fc.mvc[0][cnt])
836             {
837                 flag[0] = 1;
838                 vpx_memcpy(cm->fc.pre_mvc[0], cm->fc.mvc[0], MVPcount);
839                 break;
840             }
841         }
842
843         for (cnt = 0; cnt < MVPcount; cnt++)
844         {
845             if (cm->fc.pre_mvc[1][cnt] != cm->fc.mvc[1][cnt])
846             {
847                 flag[1] = 1;
848                 vpx_memcpy(cm->fc.pre_mvc[1], cm->fc.mvc[1], MVPcount);
849                 break;
850             }
851         }
852
853         if (flag[0] || flag[1])
854             vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
855     }
856 #endif
857
858     // Adjust the projected reference frame useage probability numbers to reflect
859     // what we have just seen. This may be usefull when we make multiple itterations
860     // of the recode loop rather than continuing to use values from the previous frame.
861     if ((cm->frame_type != KEY_FRAME) && !cm->refresh_alt_ref_frame && !cm->refresh_golden_frame)
862     {
863         const int *const rfct = cpi->count_mb_ref_frame_usage;
864         const int rf_intra = rfct[INTRA_FRAME];
865         const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
866
867         if ((rf_intra + rf_inter) > 0)
868         {
869             cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
870
871             if (cpi->prob_intra_coded < 1)
872                 cpi->prob_intra_coded = 1;
873
874             if ((cm->frames_since_golden > 0) || cpi->source_alt_ref_active)
875             {
876                 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
877
878                 if (cpi->prob_last_coded < 1)
879                     cpi->prob_last_coded = 1;
880
881                 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
882                                      ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
883
884                 if (cpi->prob_gf_coded < 1)
885                     cpi->prob_gf_coded = 1;
886             }
887         }
888     }
889
890 #if 0
891     // Keep record of the total distortion this time around for future use
892     cpi->last_frame_distortion = cpi->frame_distortion;
893 #endif
894
895 }
896 void vp8_setup_block_ptrs(MACROBLOCK *x)
897 {
898     int r, c;
899     int i;
900
901     for (r = 0; r < 4; r++)
902     {
903         for (c = 0; c < 4; c++)
904         {
905             x->block[r*4+c].src_diff = x->src_diff + r * 4 * 16 + c * 4;
906         }
907     }
908
909     for (r = 0; r < 2; r++)
910     {
911         for (c = 0; c < 2; c++)
912         {
913             x->block[16 + r*2+c].src_diff = x->src_diff + 256 + r * 4 * 8 + c * 4;
914         }
915     }
916
917
918     for (r = 0; r < 2; r++)
919     {
920         for (c = 0; c < 2; c++)
921         {
922             x->block[20 + r*2+c].src_diff = x->src_diff + 320 + r * 4 * 8 + c * 4;
923         }
924     }
925
926     x->block[24].src_diff = x->src_diff + 384;
927
928
929     for (i = 0; i < 25; i++)
930     {
931         x->block[i].coeff = x->coeff + i * 16;
932     }
933 }
934
935 void vp8_build_block_offsets(MACROBLOCK *x)
936 {
937     int block = 0;
938     int br, bc;
939
940     vp8_build_block_doffsets(&x->e_mbd);
941
942     // y blocks
943     for (br = 0; br < 4; br++)
944     {
945         for (bc = 0; bc < 4; bc++)
946         {
947             BLOCK *this_block = &x->block[block];
948             this_block->base_src = &x->src.y_buffer;
949             this_block->src_stride = x->src.y_stride;
950             this_block->src = 4 * br * this_block->src_stride + 4 * bc;
951             ++block;
952         }
953     }
954
955     // u blocks
956     for (br = 0; br < 2; br++)
957     {
958         for (bc = 0; bc < 2; bc++)
959         {
960             BLOCK *this_block = &x->block[block];
961             this_block->base_src = &x->src.u_buffer;
962             this_block->src_stride = x->src.uv_stride;
963             this_block->src = 4 * br * this_block->src_stride + 4 * bc;
964             ++block;
965         }
966     }
967
968     // v blocks
969     for (br = 0; br < 2; br++)
970     {
971         for (bc = 0; bc < 2; bc++)
972         {
973             BLOCK *this_block = &x->block[block];
974             this_block->base_src = &x->src.v_buffer;
975             this_block->src_stride = x->src.uv_stride;
976             this_block->src = 4 * br * this_block->src_stride + 4 * bc;
977             ++block;
978         }
979     }
980 }
981
982 static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x)
983 {
984     const MACROBLOCKD *xd = & x->e_mbd;
985     const MB_PREDICTION_MODE m = xd->mbmi.mode;
986     const MB_PREDICTION_MODE uvm = xd->mbmi.uv_mode;
987
988 #ifdef MODE_STATS
989     const int is_key = cpi->common.frame_type == KEY_FRAME;
990
991     ++ (is_key ? uv_modes : inter_uv_modes)[uvm];
992
993     if (m == B_PRED)
994     {
995         unsigned int *const bct = is_key ? b_modes : inter_b_modes;
996
997         int b = 0;
998
999         do
1000         {
1001             ++ bct[xd->block[b].bmi.mode];
1002         }
1003         while (++b < 16);
1004     }
1005
1006 #endif
1007
1008     ++cpi->ymode_count[m];
1009     ++cpi->uv_mode_count[uvm];
1010
1011 }
1012 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
1013 {
1014     int Error4x4, Error16x16, error_uv;
1015     B_PREDICTION_MODE intra_bmodes[16];
1016     int rate4x4, rate16x16, rateuv;
1017     int dist4x4, dist16x16, distuv;
1018     int rate = 0;
1019     int rate4x4_tokenonly = 0;
1020     int rate16x16_tokenonly = 0;
1021     int rateuv_tokenonly = 0;
1022     int i;
1023
1024     x->e_mbd.mbmi.ref_frame = INTRA_FRAME;
1025
1026 #if !(CONFIG_REALTIME_ONLY)
1027
1028     if (cpi->sf.RD || cpi->compressor_speed != 2)
1029     {
1030         Error4x4 = vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate4x4, &rate4x4_tokenonly, &dist4x4);
1031
1032         //save the b modes for possible later use
1033         for (i = 0; i < 16; i++)
1034             intra_bmodes[i] = x->e_mbd.block[i].bmi.mode;
1035
1036         Error16x16 = vp8_rd_pick_intra16x16mby_mode(cpi, x, &rate16x16, &rate16x16_tokenonly, &dist16x16);
1037
1038         error_uv = vp8_rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv);
1039
1040         x->e_mbd.mbmi.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0;
1041
1042         vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1043         rate += rateuv;
1044
1045         if (Error4x4 < Error16x16)
1046         {
1047             rate += rate4x4;
1048             x->e_mbd.mbmi.mode = B_PRED;
1049
1050             // get back the intra block modes
1051             for (i = 0; i < 16; i++)
1052                 x->e_mbd.block[i].bmi.mode = intra_bmodes[i];
1053
1054             vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1055             cpi->prediction_error += Error4x4 ;
1056 #if 0
1057             // Experimental RD code
1058             cpi->frame_distortion += dist4x4;
1059 #endif
1060         }
1061         else
1062         {
1063             vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1064             rate += rate16x16;
1065
1066 #if 0
1067             // Experimental RD code
1068             cpi->prediction_error += Error16x16;
1069             cpi->frame_distortion += dist16x16;
1070 #endif
1071         }
1072
1073         sum_intra_stats(cpi, x);
1074
1075         vp8_tokenize_mb(cpi, &x->e_mbd, t);
1076     }
1077     else
1078 #endif
1079     {
1080
1081         int rate2, distortion2;
1082         MB_PREDICTION_MODE mode, best_mode = DC_PRED;
1083         int this_rd;
1084         Error16x16 = INT_MAX;
1085
1086         for (mode = DC_PRED; mode <= TM_PRED; mode ++)
1087         {
1088             x->e_mbd.mbmi.mode = mode;
1089             vp8_build_intra_predictors_mby_ptr(&x->e_mbd);
1090             distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff);
1091             rate2  = x->mbmode_cost[x->e_mbd.frame_type][mode];
1092             this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
1093
1094             if (Error16x16 > this_rd)
1095             {
1096                 Error16x16 = this_rd;
1097                 best_mode = mode;
1098             }
1099         }
1100
1101         vp8_pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate2, &distortion2);
1102
1103         if (distortion2 == INT_MAX)
1104             Error4x4 = INT_MAX;
1105         else
1106             Error4x4 = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
1107
1108         x->e_mbd.mbmi.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0;
1109
1110         if (Error4x4 < Error16x16)
1111         {
1112             x->e_mbd.mbmi.mode = B_PRED;
1113             vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1114             cpi->prediction_error += Error4x4;
1115         }
1116         else
1117         {
1118             x->e_mbd.mbmi.mode = best_mode;
1119             vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1120             cpi->prediction_error += Error16x16;
1121         }
1122
1123         vp8_pick_intra_mbuv_mode(x);
1124         vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1125         sum_intra_stats(cpi, x);
1126         vp8_tokenize_mb(cpi, &x->e_mbd, t);
1127     }
1128
1129     return rate;
1130 }
1131 #ifdef SPEEDSTATS
1132 extern int cnt_pm;
1133 #endif
1134
1135 extern void vp8_fix_contexts(VP8_COMP *cpi, MACROBLOCKD *x);
1136
1137 int vp8cx_encode_inter_macroblock
1138 (
1139     VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
1140     int recon_yoffset, int recon_uvoffset
1141 )
1142 {
1143     MACROBLOCKD *const xd = &x->e_mbd;
1144     int inter_error;
1145     int intra_error = 0;
1146     int rate;
1147     int distortion;
1148
1149     x->skip = 0;
1150
1151     if (xd->segmentation_enabled)
1152         x->encode_breakout = cpi->segment_encode_breakout[xd->mbmi.segment_id];
1153     else
1154         x->encode_breakout = cpi->oxcf.encode_breakout;
1155
1156 #if !(CONFIG_REALTIME_ONLY)
1157
1158     if (cpi->sf.RD)
1159     {
1160         inter_error = vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error);
1161     }
1162     else
1163 #endif
1164         inter_error = vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error);
1165
1166
1167     cpi->prediction_error += inter_error;
1168     cpi->intra_error += intra_error;
1169
1170 #if 0
1171     // Experimental RD code
1172     cpi->frame_distortion += distortion;
1173     cpi->last_mb_distortion = distortion;
1174 #endif
1175
1176     // MB level adjutment to quantizer setup
1177     if (xd->segmentation_enabled || cpi->zbin_mode_boost_enabled)
1178     {
1179         // If cyclic update enabled
1180         if (cpi->cyclic_refresh_mode_enabled)
1181         {
1182             // Clear segment_id back to 0 if not coded (last frame 0,0)
1183             if ((xd->mbmi.segment_id == 1) &&
1184                 ((xd->mbmi.ref_frame != LAST_FRAME) || (xd->mbmi.mode != ZEROMV)))
1185             {
1186                 xd->mbmi.segment_id = 0;
1187             }
1188         }
1189
1190         // Experimental code. Special case for gf and arf zeromv modes. Increase zbin size to supress noise
1191         if (cpi->zbin_mode_boost_enabled)
1192         {
1193             if ((xd->mbmi.mode == ZEROMV) && (xd->mbmi.ref_frame != LAST_FRAME))
1194                 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1195             else
1196                 cpi->zbin_mode_boost = 0;
1197         }
1198
1199         vp8cx_mb_init_quantizer(cpi,  x);
1200     }
1201
1202     cpi->count_mb_ref_frame_usage[xd->mbmi.ref_frame] ++;
1203
1204     if (xd->mbmi.ref_frame == INTRA_FRAME)
1205     {
1206         x->e_mbd.mbmi.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0;
1207
1208         vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1209
1210         if (xd->mbmi.mode == B_PRED)
1211         {
1212             vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1213         }
1214         else
1215         {
1216             vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1217         }
1218
1219         sum_intra_stats(cpi, x);
1220     }
1221     else
1222     {
1223         MV best_ref_mv;
1224         MV nearest, nearby;
1225         int mdcounts[4];
1226         int ref_fb_idx;
1227
1228         vp8_find_near_mvs(xd, xd->mode_info_context,
1229                           &nearest, &nearby, &best_ref_mv, mdcounts, xd->mbmi.ref_frame, cpi->common.ref_frame_sign_bias);
1230
1231         vp8_build_uvmvs(xd, cpi->common.full_pixel);
1232
1233         if (xd->mbmi.ref_frame == LAST_FRAME)
1234             ref_fb_idx = cpi->common.lst_fb_idx;
1235         else if (xd->mbmi.ref_frame == GOLDEN_FRAME)
1236             ref_fb_idx = cpi->common.gld_fb_idx;
1237         else
1238             ref_fb_idx = cpi->common.alt_fb_idx;
1239
1240         xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoffset;
1241         xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
1242         xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
1243
1244         if (xd->mbmi.mode == SPLITMV)
1245         {
1246             int i;
1247
1248             for (i = 0; i < 16; i++)
1249             {
1250                 if (xd->block[i].bmi.mode == NEW4X4)
1251                 {
1252                     cpi->MVcount[0][mv_max+((xd->block[i].bmi.mv.as_mv.row - best_ref_mv.row) >> 1)]++;
1253                     cpi->MVcount[1][mv_max+((xd->block[i].bmi.mv.as_mv.col - best_ref_mv.col) >> 1)]++;
1254                 }
1255             }
1256         }
1257         else if (xd->mbmi.mode == NEWMV)
1258         {
1259             cpi->MVcount[0][mv_max+((xd->block[0].bmi.mv.as_mv.row - best_ref_mv.row) >> 1)]++;
1260             cpi->MVcount[1][mv_max+((xd->block[0].bmi.mv.as_mv.col - best_ref_mv.col) >> 1)]++;
1261         }
1262
1263         if (!x->skip && !x->e_mbd.mbmi.force_no_skip)
1264         {
1265             vp8_encode_inter16x16(IF_RTCD(&cpi->rtcd), x);
1266
1267             // Clear mb_skip_coeff if mb_no_coeff_skip is not set
1268             if (!cpi->common.mb_no_coeff_skip)
1269                 xd->mbmi.mb_skip_coeff = 0;
1270
1271         }
1272         else
1273             vp8_stuff_inter16x16(x);
1274     }
1275
1276     if (!x->skip)
1277         vp8_tokenize_mb(cpi, xd, t);
1278     else
1279     {
1280         if (cpi->common.mb_no_coeff_skip)
1281         {
1282             if (xd->mbmi.mode != B_PRED && xd->mbmi.mode != SPLITMV)
1283                 xd->mbmi.dc_diff = 0;
1284             else
1285                 xd->mbmi.dc_diff = 1;
1286
1287             xd->mbmi.mb_skip_coeff = 1;
1288             cpi->skip_true_count ++;
1289             vp8_fix_contexts(cpi, xd);
1290         }
1291         else
1292         {
1293             vp8_stuff_mb(cpi, xd, t);
1294             xd->mbmi.mb_skip_coeff = 0;
1295             cpi->skip_false_count ++;
1296         }
1297     }
1298
1299     return rate;
1300 }