2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
12 #include "vpx_ports/config.h"
18 #include "entropymode.h"
19 #include "quant_common.h"
20 #include "segmentation.h"
21 #include "setupintrarecon.h"
22 #include "encodeintra.h"
23 #include "reconinter.h"
25 #include "pickinter.h"
26 #include "findnearmv.h"
27 #include "reconintra.h"
31 #include "vpx_ports/vpx_timer.h"
33 #if CONFIG_RUNTIME_CPU_DETECT
34 #define RTCD(x) &cpi->common.rtcd.x
35 #define IF_RTCD(x) (x)
38 #define IF_RTCD(x) NULL
40 extern void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) ;
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,
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);
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};
63 static const int qrounding_factors[129] =
65 48, 48, 48, 48, 48, 48, 48, 48,
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,
84 static const int qzbin_factors[129] =
86 84, 84, 84, 84, 84, 84, 84, 84,
87 84, 84, 84, 84, 84, 84, 84, 84,
88 84, 84, 84, 84, 84, 84, 84, 84,
89 84, 84, 84, 84, 84, 84, 84, 84,
90 84, 84, 84, 84, 84, 84, 84, 84,
91 84, 84, 84, 84, 84, 84, 84, 84,
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,
105 static const int qrounding_factors_y2[129] =
107 48, 48, 48, 48, 48, 48, 48, 48,
108 48, 48, 48, 48, 48, 48, 48, 48,
109 48, 48, 48, 48, 48, 48, 48, 48,
110 48, 48, 48, 48, 48, 48, 48, 48,
111 48, 48, 48, 48, 48, 48, 48, 48,
112 48, 48, 48, 48, 48, 48, 48, 48,
113 48, 48, 48, 48, 48, 48, 48, 48,
114 48, 48, 48, 48, 48, 48, 48, 48,
115 48, 48, 48, 48, 48, 48, 48, 48,
116 48, 48, 48, 48, 48, 48, 48, 48,
117 48, 48, 48, 48, 48, 48, 48, 48,
118 48, 48, 48, 48, 48, 48, 48, 48,
119 48, 48, 48, 48, 48, 48, 48, 48,
120 48, 48, 48, 48, 48, 48, 48, 48,
121 48, 48, 48, 48, 48, 48, 48, 48,
122 48, 48, 48, 48, 48, 48, 48, 48,
126 static const int qzbin_factors_y2[129] =
128 84, 84, 84, 84, 84, 84, 84, 84,
129 84, 84, 84, 84, 84, 84, 84, 84,
130 84, 84, 84, 84, 84, 84, 84, 84,
131 84, 84, 84, 84, 84, 84, 84, 84,
132 84, 84, 84, 84, 84, 84, 84, 84,
133 84, 84, 84, 84, 84, 84, 84, 84,
134 80, 80, 80, 80, 80, 80, 80, 80,
135 80, 80, 80, 80, 80, 80, 80, 80,
136 80, 80, 80, 80, 80, 80, 80, 80,
137 80, 80, 80, 80, 80, 80, 80, 80,
138 80, 80, 80, 80, 80, 80, 80, 80,
139 80, 80, 80, 80, 80, 80, 80, 80,
140 80, 80, 80, 80, 80, 80, 80, 80,
141 80, 80, 80, 80, 80, 80, 80, 80,
142 80, 80, 80, 80, 80, 80, 80, 80,
143 80, 80, 80, 80, 80, 80, 80, 80,
149 static void vp8cx_invert_quant(int improved_quant, short *quant,
150 short *shift, short d)
157 for(l = 0; t > 1; l++)
159 t = 1 + (1<<(16+l))/d;
160 *quant = (short)(t - (1<<16));
165 *quant = (1 << 16) / d;
170 void vp8cx_init_quantizer(VP8_COMP *cpi)
176 int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 44, 44};
178 for (Q = 0; Q < QINDEX_RANGE; Q++)
181 quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
182 cpi->Y1quant_fast[Q][0] = (1 << 16) / quant_val;
183 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + 0,
184 cpi->Y1quant_shift[Q] + 0, quant_val);
185 cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
186 cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
187 cpi->common.Y1dequant[Q][0] = quant_val;
188 cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
190 quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
191 cpi->Y2quant_fast[Q][0] = (1 << 16) / quant_val;
192 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + 0,
193 cpi->Y2quant_shift[Q] + 0, quant_val);
194 cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
195 cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
196 cpi->common.Y2dequant[Q][0] = quant_val;
197 cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
199 quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
200 cpi->UVquant_fast[Q][0] = (1 << 16) / quant_val;
201 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + 0,
202 cpi->UVquant_shift[Q] + 0, quant_val);
203 cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
204 cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
205 cpi->common.UVdequant[Q][0] = quant_val;
206 cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
208 // all the ac values = ;
209 for (i = 1; i < 16; i++)
211 int rc = vp8_default_zig_zag1d[i];
213 quant_val = vp8_ac_yquant(Q);
214 cpi->Y1quant_fast[Q][rc] = (1 << 16) / quant_val;
215 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y1quant[Q] + rc,
216 cpi->Y1quant_shift[Q] + rc, quant_val);
217 cpi->Y1zbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
218 cpi->Y1round[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
219 cpi->common.Y1dequant[Q][rc] = quant_val;
220 cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7;
222 quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
223 cpi->Y2quant_fast[Q][rc] = (1 << 16) / quant_val;
224 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->Y2quant[Q] + rc,
225 cpi->Y2quant_shift[Q] + rc, quant_val);
226 cpi->Y2zbin[Q][rc] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
227 cpi->Y2round[Q][rc] = (qrounding_factors_y2[Q] * quant_val) >> 7;
228 cpi->common.Y2dequant[Q][rc] = quant_val;
229 cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7;
231 quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
232 cpi->UVquant_fast[Q][rc] = (1 << 16) / quant_val;
233 vp8cx_invert_quant(cpi->sf.improved_quant, cpi->UVquant[Q] + rc,
234 cpi->UVquant_shift[Q] + rc, quant_val);
235 cpi->UVzbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
236 cpi->UVround[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
237 cpi->common.UVdequant[Q][rc] = quant_val;
238 cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7;
243 void vp8cx_init_quantizer(VP8_COMP *cpi)
249 int zbin_boost[16] = {0, 0, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40, 44, 44, 44};
251 for (Q = 0; Q < QINDEX_RANGE; Q++)
254 quant_val = vp8_dc_quant(Q, cpi->common.y1dc_delta_q);
255 cpi->Y1quant[Q][0] = (1 << 16) / quant_val;
256 cpi->Y1zbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
257 cpi->Y1round[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
258 cpi->common.Y1dequant[Q][0] = quant_val;
259 cpi->zrun_zbin_boost_y1[Q][0] = (quant_val * zbin_boost[0]) >> 7;
261 quant_val = vp8_dc2quant(Q, cpi->common.y2dc_delta_q);
262 cpi->Y2quant[Q][0] = (1 << 16) / quant_val;
263 cpi->Y2zbin[Q][0] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
264 cpi->Y2round[Q][0] = (qrounding_factors_y2[Q] * quant_val) >> 7;
265 cpi->common.Y2dequant[Q][0] = quant_val;
266 cpi->zrun_zbin_boost_y2[Q][0] = (quant_val * zbin_boost[0]) >> 7;
268 quant_val = vp8_dc_uv_quant(Q, cpi->common.uvdc_delta_q);
269 cpi->UVquant[Q][0] = (1 << 16) / quant_val;
270 cpi->UVzbin[Q][0] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;;
271 cpi->UVround[Q][0] = (qrounding_factors[Q] * quant_val) >> 7;
272 cpi->common.UVdequant[Q][0] = quant_val;
273 cpi->zrun_zbin_boost_uv[Q][0] = (quant_val * zbin_boost[0]) >> 7;
275 // all the ac values = ;
276 for (i = 1; i < 16; i++)
278 int rc = vp8_default_zig_zag1d[i];
280 quant_val = vp8_ac_yquant(Q);
281 cpi->Y1quant[Q][rc] = (1 << 16) / quant_val;
282 cpi->Y1zbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
283 cpi->Y1round[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
284 cpi->common.Y1dequant[Q][rc] = quant_val;
285 cpi->zrun_zbin_boost_y1[Q][i] = (quant_val * zbin_boost[i]) >> 7;
287 quant_val = vp8_ac2quant(Q, cpi->common.y2ac_delta_q);
288 cpi->Y2quant[Q][rc] = (1 << 16) / quant_val;
289 cpi->Y2zbin[Q][rc] = ((qzbin_factors_y2[Q] * quant_val) + 64) >> 7;
290 cpi->Y2round[Q][rc] = (qrounding_factors_y2[Q] * quant_val) >> 7;
291 cpi->common.Y2dequant[Q][rc] = quant_val;
292 cpi->zrun_zbin_boost_y2[Q][i] = (quant_val * zbin_boost[i]) >> 7;
294 quant_val = vp8_ac_uv_quant(Q, cpi->common.uvac_delta_q);
295 cpi->UVquant[Q][rc] = (1 << 16) / quant_val;
296 cpi->UVzbin[Q][rc] = ((qzbin_factors[Q] * quant_val) + 64) >> 7;
297 cpi->UVround[Q][rc] = (qrounding_factors[Q] * quant_val) >> 7;
298 cpi->common.UVdequant[Q][rc] = quant_val;
299 cpi->zrun_zbin_boost_uv[Q][i] = (quant_val * zbin_boost[i]) >> 7;
304 void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x)
308 MACROBLOCKD *xd = &x->e_mbd;
311 // Select the baseline MB Q index.
312 if (xd->segmentation_enabled)
315 if (xd->mb_segement_abs_delta == SEGMENT_ABSDATA)
317 QIndex = xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
321 QIndex = cpi->common.base_qindex + xd->segment_feature_data[MB_LVL_ALT_Q][xd->mode_info_context->mbmi.segment_id];
322 QIndex = (QIndex >= 0) ? ((QIndex <= MAXQ) ? QIndex : MAXQ) : 0; // Clamp to valid range
326 QIndex = cpi->common.base_qindex;
329 zbin_extra = (cpi->common.Y1dequant[QIndex][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
331 for (i = 0; i < 16; i++)
333 x->block[i].quant = cpi->Y1quant[QIndex];
334 x->block[i].quant_fast = cpi->Y1quant_fast[QIndex];
335 x->block[i].quant_shift = cpi->Y1quant_shift[QIndex];
336 x->block[i].zbin = cpi->Y1zbin[QIndex];
337 x->block[i].round = cpi->Y1round[QIndex];
338 x->e_mbd.block[i].dequant = cpi->common.Y1dequant[QIndex];
339 x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_y1[QIndex];
340 x->block[i].zbin_extra = (short)zbin_extra;
344 zbin_extra = (cpi->common.UVdequant[QIndex][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
346 for (i = 16; i < 24; i++)
348 x->block[i].quant = cpi->UVquant[QIndex];
349 x->block[i].quant_fast = cpi->UVquant_fast[QIndex];
350 x->block[i].quant_shift = cpi->UVquant_shift[QIndex];
351 x->block[i].zbin = cpi->UVzbin[QIndex];
352 x->block[i].round = cpi->UVround[QIndex];
353 x->e_mbd.block[i].dequant = cpi->common.UVdequant[QIndex];
354 x->block[i].zrun_zbin_boost = cpi->zrun_zbin_boost_uv[QIndex];
355 x->block[i].zbin_extra = (short)zbin_extra;
359 zbin_extra = (cpi->common.Y2dequant[QIndex][1] * ((cpi->zbin_over_quant / 2) + cpi->zbin_mode_boost)) >> 7;
360 x->block[24].quant_fast = cpi->Y2quant_fast[QIndex];
361 x->block[24].quant = cpi->Y2quant[QIndex];
362 x->block[24].quant_shift = cpi->Y2quant_shift[QIndex];
363 x->block[24].zbin = cpi->Y2zbin[QIndex];
364 x->block[24].round = cpi->Y2round[QIndex];
365 x->e_mbd.block[24].dequant = cpi->common.Y2dequant[QIndex];
366 x->block[24].zrun_zbin_boost = cpi->zrun_zbin_boost_y2[QIndex];
367 x->block[24].zbin_extra = (short)zbin_extra;
369 /* save this macroblock QIndex for vp8_update_zbin_extra() */
372 void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x)
375 int QIndex = x->q_index;
379 zbin_extra = (cpi->common.Y1dequant[QIndex][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
380 for (i = 0; i < 16; i++)
382 x->block[i].zbin_extra = (short)zbin_extra;
386 zbin_extra = (cpi->common.UVdequant[QIndex][1] * (cpi->zbin_over_quant + cpi->zbin_mode_boost)) >> 7;
387 for (i = 16; i < 24; i++)
389 x->block[i].zbin_extra = (short)zbin_extra;
393 zbin_extra = (cpi->common.Y2dequant[QIndex][1] * ((cpi->zbin_over_quant / 2) + cpi->zbin_mode_boost)) >> 7;
394 x->block[24].zbin_extra = (short)zbin_extra;
397 void vp8cx_frame_init_quantizer(VP8_COMP *cpi)
399 // Clear Zbin mode boost for default case
400 cpi->zbin_mode_boost = 0;
402 // vp8cx_init_quantizer() is first called in vp8_create_compressor(). A check is added here so that vp8cx_init_quantizer() is only called
403 // when these values are not all zero.
404 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)
406 vp8cx_init_quantizer(cpi);
409 // MB level quantizer setup
410 vp8cx_mb_init_quantizer(cpi, &cpi->mb);
414 /* activity_avg must be positive, or flat regions could get a zero weight
415 * (infinite lambda), which confounds analysis.
416 * This also avoids the need for divide by zero checks in
417 * vp8_activity_masking().
419 #define VP8_ACTIVITY_AVG_MIN (64)
421 /* This is used as a reference when computing the source variance for the
422 * purposes of activity masking.
423 * Eventually this should be replaced by custom no-reference routines,
424 * which will be faster.
426 static const unsigned char VP8_VAR_OFFS[16]=
428 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
431 unsigned int vp8_activity_masking(VP8_COMP *cpi, MACROBLOCK *x)
438 /* TODO: This could also be done over smaller areas (8x8), but that would
439 * require extensive changes elsewhere, as lambda is assumed to be fixed
440 * over an entire MB in most of the code.
441 * Another option is to compute four 8x8 variances, and pick a single
442 * lambda using a non-linear combination (e.g., the smallest, or second
445 VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16var)(x->src.y_buffer,
446 x->src.y_stride, VP8_VAR_OFFS, 0, &sse, &sum);
447 /* This requires a full 32 bits of precision. */
448 act = (sse<<8) - sum*sum;
449 /* Drop 4 to give us some headroom to work with. */
450 act = (act + 8) >> 4;
451 /* If the region is flat, lower the activity some more. */
453 act = act < 5<<12 ? act : 5<<12;
454 /* TODO: For non-flat regions, edge regions should receive less masking
455 * than textured regions, but identifying edge regions quickly and
456 * reliably enough is still a subject of experimentation.
457 * This will be most noticable near edges with a complex shape (e.g.,
458 * text), but the 4x4 transform size should make this less of a problem
459 * than it would be for an 8x8 transform.
461 /* Apply the masking to the RD multiplier. */
462 a = act + 4*cpi->activity_avg;
463 b = 4*act + cpi->activity_avg;
464 x->rdmult = (unsigned int)(((INT64)x->rdmult*b + (a>>1))/a);
471 void encode_mb_row(VP8_COMP *cpi,
480 INT64 activity_sum = 0;
482 int recon_yoffset, recon_uvoffset;
484 int ref_fb_idx = cm->lst_fb_idx;
485 int dst_fb_idx = cm->new_fb_idx;
486 int recon_y_stride = cm->yv12_fb[ref_fb_idx].y_stride;
487 int recon_uv_stride = cm->yv12_fb[ref_fb_idx].uv_stride;
488 int seg_map_index = (mb_row * cpi->common.mb_cols);
491 // reset above block coeffs
492 xd->above_context = cm->above_context;
494 xd->up_available = (mb_row != 0);
495 recon_yoffset = (mb_row * recon_y_stride * 16);
496 recon_uvoffset = (mb_row * recon_uv_stride * 8);
498 cpi->tplist[mb_row].start = *tp;
499 //printf("Main mb_row = %d\n", mb_row);
501 // Distance of Mb to the top & bottom edges, specified in 1/8th pel
502 // units as they are always compared to values that are in 1/8th pel units
503 xd->mb_to_top_edge = -((mb_row * 16) << 3);
504 xd->mb_to_bottom_edge = ((cm->mb_rows - 1 - mb_row) * 16) << 3;
506 // Set up limit values for vertical motion vector components
507 // to prevent them extending beyond the UMV borders
508 x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
509 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
510 + (VP8BORDERINPIXELS - 16);
512 // for each macroblock col in image
513 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
515 // Distance of Mb to the left & right edges, specified in
516 // 1/8th pel units as they are always compared to values
517 // that are in 1/8th pel units
518 xd->mb_to_left_edge = -((mb_col * 16) << 3);
519 xd->mb_to_right_edge = ((cm->mb_cols - 1 - mb_col) * 16) << 3;
521 // Set up limit values for horizontal motion vector components
522 // to prevent them extending beyond the UMV borders
523 x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
524 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
525 + (VP8BORDERINPIXELS - 16);
527 xd->dst.y_buffer = cm->yv12_fb[dst_fb_idx].y_buffer + recon_yoffset;
528 xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
529 xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
530 xd->left_available = (mb_col != 0);
532 x->rddiv = cpi->RDDIV;
533 x->rdmult = cpi->RDMULT;
535 if(cpi->oxcf.tuning == VP8_TUNE_SSIM)
536 activity_sum += vp8_activity_masking(cpi, x);
538 // Is segmentation enabled
539 // MB level adjutment to quantizer
540 if (xd->segmentation_enabled)
542 // Code to set segment id in xd->mbmi.segment_id for current MB (with range checking)
543 if (cpi->segmentation_map[seg_map_index+mb_col] <= 3)
544 xd->mode_info_context->mbmi.segment_id = cpi->segmentation_map[seg_map_index+mb_col];
546 xd->mode_info_context->mbmi.segment_id = 0;
548 vp8cx_mb_init_quantizer(cpi, x);
551 xd->mode_info_context->mbmi.segment_id = 0; // Set to Segment 0 by default
553 x->active_ptr = cpi->active_map + seg_map_index + mb_col;
555 if (cm->frame_type == KEY_FRAME)
557 *totalrate += vp8cx_encode_intra_macro_block(cpi, x, tp);
559 y_modes[xd->mbmi.mode] ++;
564 *totalrate += vp8cx_encode_inter_macroblock(cpi, x, tp, recon_yoffset, recon_uvoffset);
567 inter_y_modes[xd->mbmi.mode] ++;
569 if (xd->mbmi.mode == SPLITMV)
573 for (b = 0; b < xd->mbmi.partition_count; b++)
575 inter_b_modes[x->partition->bmi[b].mode] ++;
581 // Count of last ref frame 0,0 useage
582 if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
583 cpi->inter_zz_count ++;
585 // Special case code for cyclic refresh
586 // If cyclic update enabled then copy xd->mbmi.segment_id; (which may have been updated based on mode
587 // during vp8cx_encode_inter_macroblock()) back into the global sgmentation map
588 if (cpi->cyclic_refresh_mode_enabled && xd->segmentation_enabled)
590 cpi->segmentation_map[seg_map_index+mb_col] = xd->mode_info_context->mbmi.segment_id;
592 // 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):
593 // 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)
594 // else mark it as dirty (1).
595 if (xd->mode_info_context->mbmi.segment_id)
596 cpi->cyclic_refresh_map[seg_map_index+mb_col] = -1;
597 else if ((xd->mode_info_context->mbmi.mode == ZEROMV) && (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME))
599 if (cpi->cyclic_refresh_map[seg_map_index+mb_col] == 1)
600 cpi->cyclic_refresh_map[seg_map_index+mb_col] = 0;
603 cpi->cyclic_refresh_map[seg_map_index+mb_col] = 1;
608 cpi->tplist[mb_row].stop = *tp;
610 x->gf_active_ptr++; // Increment pointer into gf useage flags structure for next mb
612 for (i = 0; i < 16; i++)
613 vpx_memcpy(&xd->mode_info_context->bmi[i], &xd->block[i].bmi, sizeof(xd->block[i].bmi));
615 // adjust to the next column of macroblocks
616 x->src.y_buffer += 16;
617 x->src.u_buffer += 8;
618 x->src.v_buffer += 8;
623 // Keep track of segment useage
624 segment_counts[xd->mode_info_context->mbmi.segment_id] ++;
627 xd->mode_info_context++;
631 cpi->current_mb_col_main = mb_col;
634 //extend the recon for intra prediction
636 &cm->yv12_fb[dst_fb_idx],
637 xd->dst.y_buffer + 16,
638 xd->dst.u_buffer + 8,
639 xd->dst.v_buffer + 8);
641 // this is to account for the border
642 xd->mode_info_context++;
644 x->activity_sum += activity_sum;
651 void vp8_encode_frame(VP8_COMP *cpi)
654 MACROBLOCK *const x = & cpi->mb;
655 VP8_COMMON *const cm = & cpi->common;
656 MACROBLOCKD *const xd = & x->e_mbd;
658 TOKENEXTRA *tp = cpi->tok;
659 int segment_counts[MAX_MB_SEGMENTS];
662 // Functions setup for all frame types so we can use MC in AltRef
663 if (cm->mcomp_filter_type == SIXTAP)
665 xd->subpixel_predict = SUBPIX_INVOKE(
666 &cpi->common.rtcd.subpix, sixtap4x4);
667 xd->subpixel_predict8x4 = SUBPIX_INVOKE(
668 &cpi->common.rtcd.subpix, sixtap8x4);
669 xd->subpixel_predict8x8 = SUBPIX_INVOKE(
670 &cpi->common.rtcd.subpix, sixtap8x8);
671 xd->subpixel_predict16x16 = SUBPIX_INVOKE(
672 &cpi->common.rtcd.subpix, sixtap16x16);
676 xd->subpixel_predict = SUBPIX_INVOKE(
677 &cpi->common.rtcd.subpix, bilinear4x4);
678 xd->subpixel_predict8x4 = SUBPIX_INVOKE(
679 &cpi->common.rtcd.subpix, bilinear8x4);
680 xd->subpixel_predict8x8 = SUBPIX_INVOKE(
681 &cpi->common.rtcd.subpix, bilinear8x8);
682 xd->subpixel_predict16x16 = SUBPIX_INVOKE(
683 &cpi->common.rtcd.subpix, bilinear16x16);
686 x->gf_active_ptr = (signed char *)cpi->gf_active_flags; // Point to base of GF active flags data structure
688 x->vector_range = 32;
690 // Count of MBs using the alternate Q if any
693 // Reset frame count of inter 0,0 motion vector useage.
694 cpi->inter_zz_count = 0;
696 vpx_memset(segment_counts, 0, sizeof(segment_counts));
698 cpi->prediction_error = 0;
699 cpi->intra_error = 0;
700 cpi->skip_true_count = 0;
701 cpi->skip_false_count = 0;
705 cpi->frame_distortion = 0;
706 cpi->last_mb_distortion = 0;
711 x->partition_info = x->pi;
713 xd->mode_info_context = cm->mi;
714 xd->mode_info_stride = cm->mode_info_stride;
716 xd->frame_type = cm->frame_type;
718 xd->frames_since_golden = cm->frames_since_golden;
719 xd->frames_till_alt_ref_frame = cm->frames_till_alt_ref_frame;
720 vp8_zero(cpi->MVcount);
721 // vp8_zero( Contexts)
722 vp8_zero(cpi->coef_counts);
724 // reset intra mode contexts
725 if (cm->frame_type == KEY_FRAME)
726 vp8_init_mbmode_probs(cm);
729 vp8cx_frame_init_quantizer(cpi);
731 if (cpi->compressor_speed == 2)
733 if (cpi->oxcf.cpu_used < 0)
734 cpi->Speed = -(cpi->oxcf.cpu_used);
736 vp8_auto_select_speed(cpi);
739 vp8_initialize_rd_consts(cpi, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
740 vp8cx_initialize_me_consts(cpi, cm->base_qindex);
742 // Copy data over into macro block data sturctures.
744 x->src = * cpi->Source;
745 xd->pre = cm->yv12_fb[cm->lst_fb_idx];
746 xd->dst = cm->yv12_fb[cm->new_fb_idx];
748 // set up frame new frame for intra coded blocks
750 vp8_setup_intra_recon(&cm->yv12_fb[cm->new_fb_idx]);
752 vp8_build_block_offsets(x);
754 vp8_setup_block_dptrs(&x->e_mbd);
756 vp8_setup_block_ptrs(x);
760 xd->mode_info_context->mbmi.mode = DC_PRED;
761 xd->mode_info_context->mbmi.uv_mode = DC_PRED;
763 xd->left_context = &cm->left_context;
765 vp8_zero(cpi->count_mb_ref_frame_usage)
766 vp8_zero(cpi->ymode_count)
767 vp8_zero(cpi->uv_mode_count)
771 vpx_memset(cm->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES) * cm->mb_cols);
774 struct vpx_usec_timer emr_timer;
775 vpx_usec_timer_start(&emr_timer);
777 if (!cpi->b_multi_threaded)
779 // for each macroblock row in image
780 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
783 vp8_zero(cm->left_context)
785 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
787 // adjust to the next row of mbs
788 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
789 x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
790 x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
793 cpi->tok_count = tp - cpi->tok;
798 #if CONFIG_MULTITHREAD
801 vp8cx_init_mbrthread_data(cpi, x, cpi->mb_row_ei, 1, cpi->encoding_thread_count);
803 for (mb_row = 0; mb_row < cm->mb_rows; mb_row += (cpi->encoding_thread_count + 1))
805 cpi->current_mb_col_main = -1;
807 for (i = 0; i < cpi->encoding_thread_count; i++)
809 if ((mb_row + i + 1) >= cm->mb_rows)
812 cpi->mb_row_ei[i].mb_row = mb_row + i + 1;
813 cpi->mb_row_ei[i].tp = cpi->tok + (mb_row + i + 1) * (cm->mb_cols * 16 * 24);
814 cpi->mb_row_ei[i].current_mb_col = -1;
815 //SetEvent(cpi->h_event_mbrencoding[i]);
816 sem_post(&cpi->h_event_mbrencoding[i]);
819 vp8_zero(cm->left_context)
821 tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
823 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
825 // adjust to the next row of mbs
826 x->src.y_buffer += 16 * x->src.y_stride * (cpi->encoding_thread_count + 1) - 16 * cm->mb_cols;
827 x->src.u_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
828 x->src.v_buffer += 8 * x->src.uv_stride * (cpi->encoding_thread_count + 1) - 8 * cm->mb_cols;
830 xd->mode_info_context += xd->mode_info_stride * cpi->encoding_thread_count;
831 x->partition_info += xd->mode_info_stride * cpi->encoding_thread_count;
833 if (mb_row < cm->mb_rows - 1)
834 //WaitForSingleObject(cpi->h_event_main, INFINITE);
835 sem_wait(&cpi->h_event_main);
839 for( ;mb_row<cm->mb_rows; mb_row ++)
841 vp8_zero( cm->left_context)
843 tp = cpi->tok + mb_row * (cm->mb_cols * 16 * 24);
845 encode_mb_row(cpi, cm, mb_row, x, xd, &tp, segment_counts, &totalrate);
846 // adjust to the next row of mbs
847 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
848 x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
849 x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
855 for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++)
857 cpi->tok_count += cpi->tplist[mb_row].stop - cpi->tplist[mb_row].start;
860 if (xd->segmentation_enabled)
865 if (xd->segmentation_enabled)
868 for (i = 0; i < cpi->encoding_thread_count; i++)
870 for (j = 0; j < 4; j++)
871 segment_counts[j] += cpi->mb_row_ei[i].segment_counts[j];
877 for (i = 0; i < cpi->encoding_thread_count; i++)
879 totalrate += cpi->mb_row_ei[i].totalrate;
882 for (i = 0; i < cpi->encoding_thread_count; i++)
884 x->activity_sum += cpi->mb_row_ei[i].mb.activity_sum;
891 vpx_usec_timer_mark(&emr_timer);
892 cpi->time_encode_mb_row += vpx_usec_timer_elapsed(&emr_timer);
897 // Work out the segment probabilites if segmentation is enabled
898 if (xd->segmentation_enabled)
904 vpx_memset(xd->mb_segment_tree_probs, 255 , sizeof(xd->mb_segment_tree_probs));
906 tot_count = segment_counts[0] + segment_counts[1] + segment_counts[2] + segment_counts[3];
910 xd->mb_segment_tree_probs[0] = ((segment_counts[0] + segment_counts[1]) * 255) / tot_count;
912 tot_count = segment_counts[0] + segment_counts[1];
916 xd->mb_segment_tree_probs[1] = (segment_counts[0] * 255) / tot_count;
919 tot_count = segment_counts[2] + segment_counts[3];
922 xd->mb_segment_tree_probs[2] = (segment_counts[2] * 255) / tot_count;
924 // Zero probabilities not allowed
925 for (i = 0; i < MB_FEATURE_TREE_PROBS; i ++)
927 if (xd->mb_segment_tree_probs[i] == 0)
928 xd->mb_segment_tree_probs[i] = 1;
933 // 256 rate units to the bit
934 cpi->projected_frame_size = totalrate >> 8; // projected_frame_size in units of BYTES
936 // Make a note of the percentage MBs coded Intra.
937 if (cm->frame_type == KEY_FRAME)
939 cpi->this_frame_percent_intra = 100;
945 tot_modes = cpi->count_mb_ref_frame_usage[INTRA_FRAME]
946 + cpi->count_mb_ref_frame_usage[LAST_FRAME]
947 + cpi->count_mb_ref_frame_usage[GOLDEN_FRAME]
948 + cpi->count_mb_ref_frame_usage[ALTREF_FRAME];
951 cpi->this_frame_percent_intra = cpi->count_mb_ref_frame_usage[INTRA_FRAME] * 100 / tot_modes;
958 int flag[2] = {0, 0};
960 for (cnt = 0; cnt < MVPcount; cnt++)
962 if (cm->fc.pre_mvc[0][cnt] != cm->fc.mvc[0][cnt])
965 vpx_memcpy(cm->fc.pre_mvc[0], cm->fc.mvc[0], MVPcount);
970 for (cnt = 0; cnt < MVPcount; cnt++)
972 if (cm->fc.pre_mvc[1][cnt] != cm->fc.mvc[1][cnt])
975 vpx_memcpy(cm->fc.pre_mvc[1], cm->fc.mvc[1], MVPcount);
980 if (flag[0] || flag[1])
981 vp8_build_component_cost_table(cpi->mb.mvcost, cpi->mb.mvsadcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
985 // Adjust the projected reference frame useage probability numbers to reflect
986 // what we have just seen. This may be usefull when we make multiple itterations
987 // of the recode loop rather than continuing to use values from the previous frame.
988 if ((cm->frame_type != KEY_FRAME) && !cm->refresh_alt_ref_frame && !cm->refresh_golden_frame)
990 const int *const rfct = cpi->count_mb_ref_frame_usage;
991 const int rf_intra = rfct[INTRA_FRAME];
992 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
994 if ((rf_intra + rf_inter) > 0)
996 cpi->prob_intra_coded = (rf_intra * 255) / (rf_intra + rf_inter);
998 if (cpi->prob_intra_coded < 1)
999 cpi->prob_intra_coded = 1;
1001 if ((cm->frames_since_golden > 0) || cpi->source_alt_ref_active)
1003 cpi->prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
1005 if (cpi->prob_last_coded < 1)
1006 cpi->prob_last_coded = 1;
1008 cpi->prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
1009 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
1011 if (cpi->prob_gf_coded < 1)
1012 cpi->prob_gf_coded = 1;
1018 // Keep record of the total distortion this time around for future use
1019 cpi->last_frame_distortion = cpi->frame_distortion;
1022 /* Update the average activity for the next frame.
1023 * This is feed-forward for now; it could also be saved in two-pass, or
1024 * done during lookahead when that is eventually added.
1026 cpi->activity_avg = (unsigned int )(x->activity_sum/cpi->common.MBs);
1027 if (cpi->activity_avg < VP8_ACTIVITY_AVG_MIN)
1028 cpi->activity_avg = VP8_ACTIVITY_AVG_MIN;
1031 void vp8_setup_block_ptrs(MACROBLOCK *x)
1036 for (r = 0; r < 4; r++)
1038 for (c = 0; c < 4; c++)
1040 x->block[r*4+c].src_diff = x->src_diff + r * 4 * 16 + c * 4;
1044 for (r = 0; r < 2; r++)
1046 for (c = 0; c < 2; c++)
1048 x->block[16 + r*2+c].src_diff = x->src_diff + 256 + r * 4 * 8 + c * 4;
1053 for (r = 0; r < 2; r++)
1055 for (c = 0; c < 2; c++)
1057 x->block[20 + r*2+c].src_diff = x->src_diff + 320 + r * 4 * 8 + c * 4;
1061 x->block[24].src_diff = x->src_diff + 384;
1064 for (i = 0; i < 25; i++)
1066 x->block[i].coeff = x->coeff + i * 16;
1070 void vp8_build_block_offsets(MACROBLOCK *x)
1075 vp8_build_block_doffsets(&x->e_mbd);
1078 for (br = 0; br < 4; br++)
1080 for (bc = 0; bc < 4; bc++)
1082 BLOCK *this_block = &x->block[block];
1083 this_block->base_src = &x->src.y_buffer;
1084 this_block->src_stride = x->src.y_stride;
1085 this_block->src = 4 * br * this_block->src_stride + 4 * bc;
1091 for (br = 0; br < 2; br++)
1093 for (bc = 0; bc < 2; bc++)
1095 BLOCK *this_block = &x->block[block];
1096 this_block->base_src = &x->src.u_buffer;
1097 this_block->src_stride = x->src.uv_stride;
1098 this_block->src = 4 * br * this_block->src_stride + 4 * bc;
1104 for (br = 0; br < 2; br++)
1106 for (bc = 0; bc < 2; bc++)
1108 BLOCK *this_block = &x->block[block];
1109 this_block->base_src = &x->src.v_buffer;
1110 this_block->src_stride = x->src.uv_stride;
1111 this_block->src = 4 * br * this_block->src_stride + 4 * bc;
1117 static void sum_intra_stats(VP8_COMP *cpi, MACROBLOCK *x)
1119 const MACROBLOCKD *xd = & x->e_mbd;
1120 const MB_PREDICTION_MODE m = xd->mode_info_context->mbmi.mode;
1121 const MB_PREDICTION_MODE uvm = xd->mode_info_context->mbmi.uv_mode;
1124 const int is_key = cpi->common.frame_type == KEY_FRAME;
1126 ++ (is_key ? uv_modes : inter_uv_modes)[uvm];
1130 unsigned int *const bct = is_key ? b_modes : inter_b_modes;
1136 ++ bct[xd->block[b].bmi.mode];
1143 ++cpi->ymode_count[m];
1144 ++cpi->uv_mode_count[uvm];
1147 int vp8cx_encode_intra_macro_block(VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t)
1149 int Error4x4, Error16x16, error_uv;
1150 B_PREDICTION_MODE intra_bmodes[16];
1151 int rate4x4, rate16x16, rateuv;
1152 int dist4x4, dist16x16, distuv;
1154 int rate4x4_tokenonly = 0;
1155 int rate16x16_tokenonly = 0;
1156 int rateuv_tokenonly = 0;
1159 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
1161 #if !(CONFIG_REALTIME_ONLY)
1163 if (cpi->sf.RD || cpi->compressor_speed != 2)
1165 Error4x4 = vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate4x4, &rate4x4_tokenonly, &dist4x4);
1167 //save the b modes for possible later use
1168 for (i = 0; i < 16; i++)
1169 intra_bmodes[i] = x->e_mbd.block[i].bmi.mode;
1171 Error16x16 = vp8_rd_pick_intra16x16mby_mode(cpi, x, &rate16x16, &rate16x16_tokenonly, &dist16x16);
1173 error_uv = vp8_rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv);
1175 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1178 if (Error4x4 < Error16x16)
1181 x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
1183 // get back the intra block modes
1184 for (i = 0; i < 16; i++)
1185 x->e_mbd.block[i].bmi.mode = intra_bmodes[i];
1187 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1188 cpi->prediction_error += Error4x4 ;
1190 // Experimental RD code
1191 cpi->frame_distortion += dist4x4;
1196 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1200 // Experimental RD code
1201 cpi->prediction_error += Error16x16;
1202 cpi->frame_distortion += dist16x16;
1206 sum_intra_stats(cpi, x);
1208 vp8_tokenize_mb(cpi, &x->e_mbd, t);
1214 int rate2, distortion2;
1215 MB_PREDICTION_MODE mode, best_mode = DC_PRED;
1217 Error16x16 = INT_MAX;
1219 for (mode = DC_PRED; mode <= TM_PRED; mode ++)
1221 x->e_mbd.mode_info_context->mbmi.mode = mode;
1222 vp8_build_intra_predictors_mby_ptr(&x->e_mbd);
1223 distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff);
1224 rate2 = x->mbmode_cost[x->e_mbd.frame_type][mode];
1225 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
1227 if (Error16x16 > this_rd)
1229 Error16x16 = this_rd;
1234 vp8_pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate2, &distortion2);
1236 if (distortion2 == INT_MAX)
1239 Error4x4 = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2);
1241 if (Error4x4 < Error16x16)
1243 x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
1244 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1245 cpi->prediction_error += Error4x4;
1249 x->e_mbd.mode_info_context->mbmi.mode = best_mode;
1250 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1251 cpi->prediction_error += Error16x16;
1254 vp8_pick_intra_mbuv_mode(x);
1255 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1256 sum_intra_stats(cpi, x);
1257 vp8_tokenize_mb(cpi, &x->e_mbd, t);
1266 extern void vp8_fix_contexts(MACROBLOCKD *x);
1268 int vp8cx_encode_inter_macroblock
1270 VP8_COMP *cpi, MACROBLOCK *x, TOKENEXTRA **t,
1271 int recon_yoffset, int recon_uvoffset
1274 MACROBLOCKD *const xd = &x->e_mbd;
1276 int intra_error = 0;
1282 if (xd->segmentation_enabled)
1283 x->encode_breakout = cpi->segment_encode_breakout[xd->mode_info_context->mbmi.segment_id];
1285 x->encode_breakout = cpi->oxcf.encode_breakout;
1287 #if !(CONFIG_REALTIME_ONLY)
1291 int zbin_mode_boost_enabled = cpi->zbin_mode_boost_enabled;
1293 /* Are we using the fast quantizer for the mode selection? */
1294 if(cpi->sf.use_fastquant_for_pick)
1296 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, fastquantb);
1298 /* the fast quantizer does not use zbin_extra, so
1299 * do not recalculate */
1300 cpi->zbin_mode_boost_enabled = 0;
1302 inter_error = vp8_rd_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error);
1304 /* switch back to the regular quantizer for the encode */
1305 if (cpi->sf.improved_quant)
1307 cpi->mb.quantize_b = QUANTIZE_INVOKE(&cpi->rtcd.quantize, quantb);
1310 /* restore cpi->zbin_mode_boost_enabled */
1311 cpi->zbin_mode_boost_enabled = zbin_mode_boost_enabled;
1316 inter_error = vp8_pick_inter_mode(cpi, x, recon_yoffset, recon_uvoffset, &rate, &distortion, &intra_error);
1319 cpi->prediction_error += inter_error;
1320 cpi->intra_error += intra_error;
1323 // Experimental RD code
1324 cpi->frame_distortion += distortion;
1325 cpi->last_mb_distortion = distortion;
1328 // MB level adjutment to quantizer setup
1329 if (xd->segmentation_enabled)
1331 // If cyclic update enabled
1332 if (cpi->cyclic_refresh_mode_enabled)
1334 // Clear segment_id back to 0 if not coded (last frame 0,0)
1335 if ((xd->mode_info_context->mbmi.segment_id == 1) &&
1336 ((xd->mode_info_context->mbmi.ref_frame != LAST_FRAME) || (xd->mode_info_context->mbmi.mode != ZEROMV)))
1338 xd->mode_info_context->mbmi.segment_id = 0;
1340 /* segment_id changed, so update */
1341 vp8cx_mb_init_quantizer(cpi, x);
1347 // Experimental code. Special case for gf and arf zeromv modes. Increase zbin size to supress noise
1348 if (cpi->zbin_mode_boost_enabled)
1350 if ( xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME )
1351 cpi->zbin_mode_boost = 0;
1354 if (xd->mode_info_context->mbmi.mode == ZEROMV)
1356 if (xd->mode_info_context->mbmi.ref_frame != LAST_FRAME)
1357 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1359 cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
1361 else if (xd->mode_info_context->mbmi.mode == SPLITMV)
1362 cpi->zbin_mode_boost = 0;
1364 cpi->zbin_mode_boost = MV_ZBIN_BOOST;
1368 cpi->zbin_mode_boost = 0;
1370 vp8_update_zbin_extra(cpi, x);
1373 cpi->count_mb_ref_frame_usage[xd->mode_info_context->mbmi.ref_frame] ++;
1375 if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME)
1377 vp8_encode_intra16x16mbuv(IF_RTCD(&cpi->rtcd), x);
1379 if (xd->mode_info_context->mbmi.mode == B_PRED)
1381 vp8_encode_intra4x4mby(IF_RTCD(&cpi->rtcd), x);
1385 vp8_encode_intra16x16mby(IF_RTCD(&cpi->rtcd), x);
1388 sum_intra_stats(cpi, x);
1397 vp8_find_near_mvs(xd, xd->mode_info_context,
1398 &nearest, &nearby, &best_ref_mv, mdcounts, xd->mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias);
1400 vp8_build_uvmvs(xd, cpi->common.full_pixel);
1402 if (xd->mode_info_context->mbmi.ref_frame == LAST_FRAME)
1403 ref_fb_idx = cpi->common.lst_fb_idx;
1404 else if (xd->mode_info_context->mbmi.ref_frame == GOLDEN_FRAME)
1405 ref_fb_idx = cpi->common.gld_fb_idx;
1407 ref_fb_idx = cpi->common.alt_fb_idx;
1409 xd->pre.y_buffer = cpi->common.yv12_fb[ref_fb_idx].y_buffer + recon_yoffset;
1410 xd->pre.u_buffer = cpi->common.yv12_fb[ref_fb_idx].u_buffer + recon_uvoffset;
1411 xd->pre.v_buffer = cpi->common.yv12_fb[ref_fb_idx].v_buffer + recon_uvoffset;
1413 if (xd->mode_info_context->mbmi.mode == SPLITMV)
1417 for (i = 0; i < 16; i++)
1419 if (xd->block[i].bmi.mode == NEW4X4)
1421 cpi->MVcount[0][mv_max+((xd->block[i].bmi.mv.as_mv.row - best_ref_mv.row) >> 1)]++;
1422 cpi->MVcount[1][mv_max+((xd->block[i].bmi.mv.as_mv.col - best_ref_mv.col) >> 1)]++;
1426 else if (xd->mode_info_context->mbmi.mode == NEWMV)
1428 cpi->MVcount[0][mv_max+((xd->block[0].bmi.mv.as_mv.row - best_ref_mv.row) >> 1)]++;
1429 cpi->MVcount[1][mv_max+((xd->block[0].bmi.mv.as_mv.col - best_ref_mv.col) >> 1)]++;
1432 if (!x->skip && !x->e_mbd.mode_info_context->mbmi.force_no_skip)
1434 vp8_encode_inter16x16(IF_RTCD(&cpi->rtcd), x);
1436 // Clear mb_skip_coeff if mb_no_coeff_skip is not set
1437 if (!cpi->common.mb_no_coeff_skip)
1438 xd->mode_info_context->mbmi.mb_skip_coeff = 0;
1442 vp8_stuff_inter16x16(x);
1446 vp8_tokenize_mb(cpi, xd, t);
1449 if (cpi->common.mb_no_coeff_skip)
1451 if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV)
1452 xd->mode_info_context->mbmi.dc_diff = 0;
1454 xd->mode_info_context->mbmi.dc_diff = 1;
1456 xd->mode_info_context->mbmi.mb_skip_coeff = 1;
1457 cpi->skip_true_count ++;
1458 vp8_fix_contexts(xd);
1462 vp8_stuff_mb(cpi, xd, t);
1463 xd->mode_info_context->mbmi.mb_skip_coeff = 0;
1464 cpi->skip_false_count ++;