|
1 /* |
|
2 * Copyright (c) 2010 The WebM 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 <stdio.h> |
|
13 #include <math.h> |
|
14 #include <limits.h> |
|
15 #include <assert.h> |
|
16 #include "vpx_config.h" |
|
17 #include "vp8_rtcd.h" |
|
18 #include "vp8/common/pragmas.h" |
|
19 #include "tokenize.h" |
|
20 #include "treewriter.h" |
|
21 #include "onyx_int.h" |
|
22 #include "modecosts.h" |
|
23 #include "encodeintra.h" |
|
24 #include "pickinter.h" |
|
25 #include "vp8/common/entropymode.h" |
|
26 #include "vp8/common/reconinter.h" |
|
27 #include "vp8/common/reconintra4x4.h" |
|
28 #include "vp8/common/findnearmv.h" |
|
29 #include "vp8/common/quant_common.h" |
|
30 #include "encodemb.h" |
|
31 #include "quantize.h" |
|
32 #include "vp8/common/variance.h" |
|
33 #include "mcomp.h" |
|
34 #include "rdopt.h" |
|
35 #include "vpx_mem/vpx_mem.h" |
|
36 #include "vp8/common/systemdependent.h" |
|
37 #if CONFIG_TEMPORAL_DENOISING |
|
38 #include "denoising.h" |
|
39 #endif |
|
40 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); |
|
41 |
|
42 #define MAXF(a,b) (((a) > (b)) ? (a) : (b)) |
|
43 |
|
44 typedef struct rate_distortion_struct |
|
45 { |
|
46 int rate2; |
|
47 int rate_y; |
|
48 int rate_uv; |
|
49 int distortion2; |
|
50 int distortion_uv; |
|
51 } RATE_DISTORTION; |
|
52 |
|
53 typedef struct best_mode_struct |
|
54 { |
|
55 int yrd; |
|
56 int rd; |
|
57 int intra_rd; |
|
58 MB_MODE_INFO mbmode; |
|
59 union b_mode_info bmodes[16]; |
|
60 PARTITION_INFO partition; |
|
61 } BEST_MODE; |
|
62 |
|
63 static const int auto_speed_thresh[17] = |
|
64 { |
|
65 1000, |
|
66 200, |
|
67 150, |
|
68 130, |
|
69 150, |
|
70 125, |
|
71 120, |
|
72 115, |
|
73 115, |
|
74 115, |
|
75 115, |
|
76 115, |
|
77 115, |
|
78 115, |
|
79 115, |
|
80 115, |
|
81 105 |
|
82 }; |
|
83 |
|
84 const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES] = |
|
85 { |
|
86 ZEROMV, |
|
87 DC_PRED, |
|
88 |
|
89 NEARESTMV, |
|
90 NEARMV, |
|
91 |
|
92 ZEROMV, |
|
93 NEARESTMV, |
|
94 |
|
95 ZEROMV, |
|
96 NEARESTMV, |
|
97 |
|
98 NEARMV, |
|
99 NEARMV, |
|
100 |
|
101 V_PRED, |
|
102 H_PRED, |
|
103 TM_PRED, |
|
104 |
|
105 NEWMV, |
|
106 NEWMV, |
|
107 NEWMV, |
|
108 |
|
109 SPLITMV, |
|
110 SPLITMV, |
|
111 SPLITMV, |
|
112 |
|
113 B_PRED, |
|
114 }; |
|
115 |
|
116 /* This table determines the search order in reference frame priority order, |
|
117 * which may not necessarily match INTRA,LAST,GOLDEN,ARF |
|
118 */ |
|
119 const int vp8_ref_frame_order[MAX_MODES] = |
|
120 { |
|
121 1, |
|
122 0, |
|
123 |
|
124 1, |
|
125 1, |
|
126 |
|
127 2, |
|
128 2, |
|
129 |
|
130 3, |
|
131 3, |
|
132 |
|
133 2, |
|
134 3, |
|
135 |
|
136 0, |
|
137 0, |
|
138 0, |
|
139 |
|
140 1, |
|
141 2, |
|
142 3, |
|
143 |
|
144 1, |
|
145 2, |
|
146 3, |
|
147 |
|
148 0, |
|
149 }; |
|
150 |
|
151 static void fill_token_costs( |
|
152 int c[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], |
|
153 const vp8_prob p[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES] |
|
154 ) |
|
155 { |
|
156 int i, j, k; |
|
157 |
|
158 |
|
159 for (i = 0; i < BLOCK_TYPES; i++) |
|
160 for (j = 0; j < COEF_BANDS; j++) |
|
161 for (k = 0; k < PREV_COEF_CONTEXTS; k++) |
|
162 |
|
163 /* check for pt=0 and band > 1 if block type 0 |
|
164 * and 0 if blocktype 1 |
|
165 */ |
|
166 if (k == 0 && j > (i == 0)) |
|
167 vp8_cost_tokens2(c[i][j][k], p [i][j][k], vp8_coef_tree, 2); |
|
168 else |
|
169 vp8_cost_tokens(c[i][j][k], p [i][j][k], vp8_coef_tree); |
|
170 } |
|
171 |
|
172 static const int rd_iifactor[32] = |
|
173 { |
|
174 4, 4, 3, 2, 1, 0, 0, 0, |
|
175 0, 0, 0, 0, 0, 0, 0, 0, |
|
176 0, 0, 0, 0, 0, 0, 0, 0, |
|
177 0, 0, 0, 0, 0, 0, 0, 0 |
|
178 }; |
|
179 |
|
180 /* values are now correlated to quantizer */ |
|
181 static const int sad_per_bit16lut[QINDEX_RANGE] = |
|
182 { |
|
183 2, 2, 2, 2, 2, 2, 2, 2, |
|
184 2, 2, 2, 2, 2, 2, 2, 2, |
|
185 3, 3, 3, 3, 3, 3, 3, 3, |
|
186 3, 3, 3, 3, 3, 3, 4, 4, |
|
187 4, 4, 4, 4, 4, 4, 4, 4, |
|
188 4, 4, 5, 5, 5, 5, 5, 5, |
|
189 5, 5, 5, 5, 5, 5, 6, 6, |
|
190 6, 6, 6, 6, 6, 6, 6, 6, |
|
191 6, 6, 7, 7, 7, 7, 7, 7, |
|
192 7, 7, 7, 7, 7, 7, 8, 8, |
|
193 8, 8, 8, 8, 8, 8, 8, 8, |
|
194 8, 8, 9, 9, 9, 9, 9, 9, |
|
195 9, 9, 9, 9, 9, 9, 10, 10, |
|
196 10, 10, 10, 10, 10, 10, 11, 11, |
|
197 11, 11, 11, 11, 12, 12, 12, 12, |
|
198 12, 12, 13, 13, 13, 13, 14, 14 |
|
199 }; |
|
200 static const int sad_per_bit4lut[QINDEX_RANGE] = |
|
201 { |
|
202 2, 2, 2, 2, 2, 2, 3, 3, |
|
203 3, 3, 3, 3, 3, 3, 3, 3, |
|
204 3, 3, 3, 3, 4, 4, 4, 4, |
|
205 4, 4, 4, 4, 4, 4, 5, 5, |
|
206 5, 5, 5, 5, 6, 6, 6, 6, |
|
207 6, 6, 6, 6, 6, 6, 6, 6, |
|
208 7, 7, 7, 7, 7, 7, 7, 7, |
|
209 7, 7, 7, 7, 7, 8, 8, 8, |
|
210 8, 8, 9, 9, 9, 9, 9, 9, |
|
211 10, 10, 10, 10, 10, 10, 10, 10, |
|
212 11, 11, 11, 11, 11, 11, 11, 11, |
|
213 12, 12, 12, 12, 12, 12, 12, 12, |
|
214 13, 13, 13, 13, 13, 13, 13, 14, |
|
215 14, 14, 14, 14, 15, 15, 15, 15, |
|
216 16, 16, 16, 16, 17, 17, 17, 18, |
|
217 18, 18, 19, 19, 19, 20, 20, 20, |
|
218 }; |
|
219 |
|
220 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) |
|
221 { |
|
222 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; |
|
223 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; |
|
224 } |
|
225 |
|
226 void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue) |
|
227 { |
|
228 int q; |
|
229 int i; |
|
230 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; |
|
231 double rdconst = 2.80; |
|
232 |
|
233 vp8_clear_system_state(); |
|
234 |
|
235 /* Further tests required to see if optimum is different |
|
236 * for key frames, golden frames and arf frames. |
|
237 */ |
|
238 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); |
|
239 |
|
240 /* Extend rate multiplier along side quantizer zbin increases */ |
|
241 if (cpi->mb.zbin_over_quant > 0) |
|
242 { |
|
243 double oq_factor; |
|
244 double modq; |
|
245 |
|
246 /* Experimental code using the same basic equation as used for Q above |
|
247 * The units of cpi->mb.zbin_over_quant are 1/128 of Q bin size |
|
248 */ |
|
249 oq_factor = 1.0 + ((double)0.0015625 * cpi->mb.zbin_over_quant); |
|
250 modq = (int)((double)capped_q * oq_factor); |
|
251 cpi->RDMULT = (int)(rdconst * (modq * modq)); |
|
252 } |
|
253 |
|
254 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) |
|
255 { |
|
256 if (cpi->twopass.next_iiratio > 31) |
|
257 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; |
|
258 else |
|
259 cpi->RDMULT += |
|
260 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; |
|
261 } |
|
262 |
|
263 cpi->mb.errorperbit = (cpi->RDMULT / 110); |
|
264 cpi->mb.errorperbit += (cpi->mb.errorperbit==0); |
|
265 |
|
266 vp8_set_speed_features(cpi); |
|
267 |
|
268 for (i = 0; i < MAX_MODES; i++) |
|
269 { |
|
270 x->mode_test_hit_counts[i] = 0; |
|
271 } |
|
272 |
|
273 q = (int)pow(Qvalue, 1.25); |
|
274 |
|
275 if (q < 8) |
|
276 q = 8; |
|
277 |
|
278 if (cpi->RDMULT > 1000) |
|
279 { |
|
280 cpi->RDDIV = 1; |
|
281 cpi->RDMULT /= 100; |
|
282 |
|
283 for (i = 0; i < MAX_MODES; i++) |
|
284 { |
|
285 if (cpi->sf.thresh_mult[i] < INT_MAX) |
|
286 { |
|
287 x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100; |
|
288 } |
|
289 else |
|
290 { |
|
291 x->rd_threshes[i] = INT_MAX; |
|
292 } |
|
293 |
|
294 cpi->rd_baseline_thresh[i] = x->rd_threshes[i]; |
|
295 } |
|
296 } |
|
297 else |
|
298 { |
|
299 cpi->RDDIV = 100; |
|
300 |
|
301 for (i = 0; i < MAX_MODES; i++) |
|
302 { |
|
303 if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) |
|
304 { |
|
305 x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q; |
|
306 } |
|
307 else |
|
308 { |
|
309 x->rd_threshes[i] = INT_MAX; |
|
310 } |
|
311 |
|
312 cpi->rd_baseline_thresh[i] = x->rd_threshes[i]; |
|
313 } |
|
314 } |
|
315 |
|
316 { |
|
317 /* build token cost array for the type of frame we have now */ |
|
318 FRAME_CONTEXT *l = &cpi->lfc_n; |
|
319 |
|
320 if(cpi->common.refresh_alt_ref_frame) |
|
321 l = &cpi->lfc_a; |
|
322 else if(cpi->common.refresh_golden_frame) |
|
323 l = &cpi->lfc_g; |
|
324 |
|
325 fill_token_costs( |
|
326 cpi->mb.token_costs, |
|
327 (const vp8_prob( *)[8][3][11]) l->coef_probs |
|
328 ); |
|
329 /* |
|
330 fill_token_costs( |
|
331 cpi->mb.token_costs, |
|
332 (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs); |
|
333 */ |
|
334 |
|
335 |
|
336 /* TODO make these mode costs depend on last,alt or gold too. (jbb) */ |
|
337 vp8_init_mode_costs(cpi); |
|
338 } |
|
339 |
|
340 } |
|
341 |
|
342 void vp8_auto_select_speed(VP8_COMP *cpi) |
|
343 { |
|
344 int milliseconds_for_compress = (int)(1000000 / cpi->framerate); |
|
345 |
|
346 milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16; |
|
347 |
|
348 #if 0 |
|
349 |
|
350 if (0) |
|
351 { |
|
352 FILE *f; |
|
353 |
|
354 f = fopen("speed.stt", "a"); |
|
355 fprintf(f, " %8ld %10ld %10ld %10ld\n", |
|
356 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time); |
|
357 fclose(f); |
|
358 } |
|
359 |
|
360 #endif |
|
361 |
|
362 if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_time - cpi->avg_pick_mode_time) < milliseconds_for_compress) |
|
363 { |
|
364 if (cpi->avg_pick_mode_time == 0) |
|
365 { |
|
366 cpi->Speed = 4; |
|
367 } |
|
368 else |
|
369 { |
|
370 if (milliseconds_for_compress * 100 < cpi->avg_encode_time * 95) |
|
371 { |
|
372 cpi->Speed += 2; |
|
373 cpi->avg_pick_mode_time = 0; |
|
374 cpi->avg_encode_time = 0; |
|
375 |
|
376 if (cpi->Speed > 16) |
|
377 { |
|
378 cpi->Speed = 16; |
|
379 } |
|
380 } |
|
381 |
|
382 if (milliseconds_for_compress * 100 > cpi->avg_encode_time * auto_speed_thresh[cpi->Speed]) |
|
383 { |
|
384 cpi->Speed -= 1; |
|
385 cpi->avg_pick_mode_time = 0; |
|
386 cpi->avg_encode_time = 0; |
|
387 |
|
388 /* In real-time mode, cpi->speed is in [4, 16]. */ |
|
389 if (cpi->Speed < 4) |
|
390 { |
|
391 cpi->Speed = 4; |
|
392 } |
|
393 } |
|
394 } |
|
395 } |
|
396 else |
|
397 { |
|
398 cpi->Speed += 4; |
|
399 |
|
400 if (cpi->Speed > 16) |
|
401 cpi->Speed = 16; |
|
402 |
|
403 |
|
404 cpi->avg_pick_mode_time = 0; |
|
405 cpi->avg_encode_time = 0; |
|
406 } |
|
407 } |
|
408 |
|
409 int vp8_block_error_c(short *coeff, short *dqcoeff) |
|
410 { |
|
411 int i; |
|
412 int error = 0; |
|
413 |
|
414 for (i = 0; i < 16; i++) |
|
415 { |
|
416 int this_diff = coeff[i] - dqcoeff[i]; |
|
417 error += this_diff * this_diff; |
|
418 } |
|
419 |
|
420 return error; |
|
421 } |
|
422 |
|
423 int vp8_mbblock_error_c(MACROBLOCK *mb, int dc) |
|
424 { |
|
425 BLOCK *be; |
|
426 BLOCKD *bd; |
|
427 int i, j; |
|
428 int berror, error = 0; |
|
429 |
|
430 for (i = 0; i < 16; i++) |
|
431 { |
|
432 be = &mb->block[i]; |
|
433 bd = &mb->e_mbd.block[i]; |
|
434 |
|
435 berror = 0; |
|
436 |
|
437 for (j = dc; j < 16; j++) |
|
438 { |
|
439 int this_diff = be->coeff[j] - bd->dqcoeff[j]; |
|
440 berror += this_diff * this_diff; |
|
441 } |
|
442 |
|
443 error += berror; |
|
444 } |
|
445 |
|
446 return error; |
|
447 } |
|
448 |
|
449 int vp8_mbuverror_c(MACROBLOCK *mb) |
|
450 { |
|
451 |
|
452 BLOCK *be; |
|
453 BLOCKD *bd; |
|
454 |
|
455 |
|
456 int i; |
|
457 int error = 0; |
|
458 |
|
459 for (i = 16; i < 24; i++) |
|
460 { |
|
461 be = &mb->block[i]; |
|
462 bd = &mb->e_mbd.block[i]; |
|
463 |
|
464 error += vp8_block_error_c(be->coeff, bd->dqcoeff); |
|
465 } |
|
466 |
|
467 return error; |
|
468 } |
|
469 |
|
470 int VP8_UVSSE(MACROBLOCK *x) |
|
471 { |
|
472 unsigned char *uptr, *vptr; |
|
473 unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src); |
|
474 unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src); |
|
475 int uv_stride = x->block[16].src_stride; |
|
476 |
|
477 unsigned int sse1 = 0; |
|
478 unsigned int sse2 = 0; |
|
479 int mv_row = x->e_mbd.mode_info_context->mbmi.mv.as_mv.row; |
|
480 int mv_col = x->e_mbd.mode_info_context->mbmi.mv.as_mv.col; |
|
481 int offset; |
|
482 int pre_stride = x->e_mbd.pre.uv_stride; |
|
483 |
|
484 if (mv_row < 0) |
|
485 mv_row -= 1; |
|
486 else |
|
487 mv_row += 1; |
|
488 |
|
489 if (mv_col < 0) |
|
490 mv_col -= 1; |
|
491 else |
|
492 mv_col += 1; |
|
493 |
|
494 mv_row /= 2; |
|
495 mv_col /= 2; |
|
496 |
|
497 offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); |
|
498 uptr = x->e_mbd.pre.u_buffer + offset; |
|
499 vptr = x->e_mbd.pre.v_buffer + offset; |
|
500 |
|
501 if ((mv_row | mv_col) & 7) |
|
502 { |
|
503 vp8_sub_pixel_variance8x8(uptr, pre_stride, |
|
504 mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2); |
|
505 vp8_sub_pixel_variance8x8(vptr, pre_stride, |
|
506 mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1); |
|
507 sse2 += sse1; |
|
508 } |
|
509 else |
|
510 { |
|
511 vp8_variance8x8(uptr, pre_stride, |
|
512 upred_ptr, uv_stride, &sse2); |
|
513 vp8_variance8x8(vptr, pre_stride, |
|
514 vpred_ptr, uv_stride, &sse1); |
|
515 sse2 += sse1; |
|
516 } |
|
517 return sse2; |
|
518 |
|
519 } |
|
520 |
|
521 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) |
|
522 { |
|
523 int c = !type; /* start at coef 0, unless Y with Y2 */ |
|
524 int eob = (int)(*b->eob); |
|
525 int pt ; /* surrounding block/prev coef predictor */ |
|
526 int cost = 0; |
|
527 short *qcoeff_ptr = b->qcoeff; |
|
528 |
|
529 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); |
|
530 |
|
531 # define QC( I) ( qcoeff_ptr [vp8_default_zig_zag1d[I]] ) |
|
532 |
|
533 for (; c < eob; c++) |
|
534 { |
|
535 int v = QC(c); |
|
536 int t = vp8_dct_value_tokens_ptr[v].Token; |
|
537 cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [t]; |
|
538 cost += vp8_dct_value_cost_ptr[v]; |
|
539 pt = vp8_prev_token_class[t]; |
|
540 } |
|
541 |
|
542 # undef QC |
|
543 |
|
544 if (c < 16) |
|
545 cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [DCT_EOB_TOKEN]; |
|
546 |
|
547 pt = (c != !type); /* is eob first coefficient; */ |
|
548 *a = *l = pt; |
|
549 |
|
550 return cost; |
|
551 } |
|
552 |
|
553 static int vp8_rdcost_mby(MACROBLOCK *mb) |
|
554 { |
|
555 int cost = 0; |
|
556 int b; |
|
557 MACROBLOCKD *x = &mb->e_mbd; |
|
558 ENTROPY_CONTEXT_PLANES t_above, t_left; |
|
559 ENTROPY_CONTEXT *ta; |
|
560 ENTROPY_CONTEXT *tl; |
|
561 |
|
562 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
563 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
564 |
|
565 ta = (ENTROPY_CONTEXT *)&t_above; |
|
566 tl = (ENTROPY_CONTEXT *)&t_left; |
|
567 |
|
568 for (b = 0; b < 16; b++) |
|
569 cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC, |
|
570 ta + vp8_block2above[b], tl + vp8_block2left[b]); |
|
571 |
|
572 cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2, |
|
573 ta + vp8_block2above[24], tl + vp8_block2left[24]); |
|
574 |
|
575 return cost; |
|
576 } |
|
577 |
|
578 static void macro_block_yrd( MACROBLOCK *mb, |
|
579 int *Rate, |
|
580 int *Distortion) |
|
581 { |
|
582 int b; |
|
583 MACROBLOCKD *const x = &mb->e_mbd; |
|
584 BLOCK *const mb_y2 = mb->block + 24; |
|
585 BLOCKD *const x_y2 = x->block + 24; |
|
586 short *Y2DCPtr = mb_y2->src_diff; |
|
587 BLOCK *beptr; |
|
588 int d; |
|
589 |
|
590 vp8_subtract_mby( mb->src_diff, *(mb->block[0].base_src), |
|
591 mb->block[0].src_stride, mb->e_mbd.predictor, 16); |
|
592 |
|
593 /* Fdct and building the 2nd order block */ |
|
594 for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) |
|
595 { |
|
596 mb->short_fdct8x4(beptr->src_diff, beptr->coeff, 32); |
|
597 *Y2DCPtr++ = beptr->coeff[0]; |
|
598 *Y2DCPtr++ = beptr->coeff[16]; |
|
599 } |
|
600 |
|
601 /* 2nd order fdct */ |
|
602 mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8); |
|
603 |
|
604 /* Quantization */ |
|
605 for (b = 0; b < 16; b++) |
|
606 { |
|
607 mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]); |
|
608 } |
|
609 |
|
610 /* DC predication and Quantization of 2nd Order block */ |
|
611 mb->quantize_b(mb_y2, x_y2); |
|
612 |
|
613 /* Distortion */ |
|
614 d = vp8_mbblock_error(mb, 1) << 2; |
|
615 d += vp8_block_error(mb_y2->coeff, x_y2->dqcoeff); |
|
616 |
|
617 *Distortion = (d >> 4); |
|
618 |
|
619 /* rate */ |
|
620 *Rate = vp8_rdcost_mby(mb); |
|
621 } |
|
622 |
|
623 static void copy_predictor(unsigned char *dst, const unsigned char *predictor) |
|
624 { |
|
625 const unsigned int *p = (const unsigned int *)predictor; |
|
626 unsigned int *d = (unsigned int *)dst; |
|
627 d[0] = p[0]; |
|
628 d[4] = p[4]; |
|
629 d[8] = p[8]; |
|
630 d[12] = p[12]; |
|
631 } |
|
632 static int rd_pick_intra4x4block( |
|
633 MACROBLOCK *x, |
|
634 BLOCK *be, |
|
635 BLOCKD *b, |
|
636 B_PREDICTION_MODE *best_mode, |
|
637 const int *bmode_costs, |
|
638 ENTROPY_CONTEXT *a, |
|
639 ENTROPY_CONTEXT *l, |
|
640 |
|
641 int *bestrate, |
|
642 int *bestratey, |
|
643 int *bestdistortion) |
|
644 { |
|
645 B_PREDICTION_MODE mode; |
|
646 int best_rd = INT_MAX; |
|
647 int rate = 0; |
|
648 int distortion; |
|
649 |
|
650 ENTROPY_CONTEXT ta = *a, tempa = *a; |
|
651 ENTROPY_CONTEXT tl = *l, templ = *l; |
|
652 /* |
|
653 * The predictor buffer is a 2d buffer with a stride of 16. Create |
|
654 * a temp buffer that meets the stride requirements, but we are only |
|
655 * interested in the left 4x4 block |
|
656 * */ |
|
657 DECLARE_ALIGNED_ARRAY(16, unsigned char, best_predictor, 16*4); |
|
658 DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); |
|
659 int dst_stride = x->e_mbd.dst.y_stride; |
|
660 unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; |
|
661 |
|
662 unsigned char *Above = dst - dst_stride; |
|
663 unsigned char *yleft = dst - 1; |
|
664 unsigned char top_left = Above[-1]; |
|
665 |
|
666 for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) |
|
667 { |
|
668 int this_rd; |
|
669 int ratey; |
|
670 |
|
671 rate = bmode_costs[mode]; |
|
672 |
|
673 vp8_intra4x4_predict(Above, yleft, dst_stride, mode, |
|
674 b->predictor, 16, top_left); |
|
675 vp8_subtract_b(be, b, 16); |
|
676 x->short_fdct4x4(be->src_diff, be->coeff, 32); |
|
677 x->quantize_b(be, b); |
|
678 |
|
679 tempa = ta; |
|
680 templ = tl; |
|
681 |
|
682 ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); |
|
683 rate += ratey; |
|
684 distortion = vp8_block_error(be->coeff, b->dqcoeff) >> 2; |
|
685 |
|
686 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
|
687 |
|
688 if (this_rd < best_rd) |
|
689 { |
|
690 *bestrate = rate; |
|
691 *bestratey = ratey; |
|
692 *bestdistortion = distortion; |
|
693 best_rd = this_rd; |
|
694 *best_mode = mode; |
|
695 *a = tempa; |
|
696 *l = templ; |
|
697 copy_predictor(best_predictor, b->predictor); |
|
698 vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); |
|
699 } |
|
700 } |
|
701 b->bmi.as_mode = *best_mode; |
|
702 |
|
703 vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride); |
|
704 |
|
705 return best_rd; |
|
706 } |
|
707 |
|
708 static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, |
|
709 int *rate_y, int *Distortion, int best_rd) |
|
710 { |
|
711 MACROBLOCKD *const xd = &mb->e_mbd; |
|
712 int i; |
|
713 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; |
|
714 int distortion = 0; |
|
715 int tot_rate_y = 0; |
|
716 int64_t total_rd = 0; |
|
717 ENTROPY_CONTEXT_PLANES t_above, t_left; |
|
718 ENTROPY_CONTEXT *ta; |
|
719 ENTROPY_CONTEXT *tl; |
|
720 const int *bmode_costs; |
|
721 |
|
722 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
723 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
724 |
|
725 ta = (ENTROPY_CONTEXT *)&t_above; |
|
726 tl = (ENTROPY_CONTEXT *)&t_left; |
|
727 |
|
728 intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); |
|
729 |
|
730 bmode_costs = mb->inter_bmode_costs; |
|
731 |
|
732 for (i = 0; i < 16; i++) |
|
733 { |
|
734 MODE_INFO *const mic = xd->mode_info_context; |
|
735 const int mis = xd->mode_info_stride; |
|
736 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); |
|
737 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_IS_SAFE(d); |
|
738 |
|
739 if (mb->e_mbd.frame_type == KEY_FRAME) |
|
740 { |
|
741 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); |
|
742 const B_PREDICTION_MODE L = left_block_mode(mic, i); |
|
743 |
|
744 bmode_costs = mb->bmode_costs[A][L]; |
|
745 } |
|
746 |
|
747 total_rd += rd_pick_intra4x4block( |
|
748 mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, |
|
749 ta + vp8_block2above[i], |
|
750 tl + vp8_block2left[i], &r, &ry, &d); |
|
751 |
|
752 cost += r; |
|
753 distortion += d; |
|
754 tot_rate_y += ry; |
|
755 |
|
756 mic->bmi[i].as_mode = best_mode; |
|
757 |
|
758 if(total_rd >= (int64_t)best_rd) |
|
759 break; |
|
760 } |
|
761 |
|
762 if(total_rd >= (int64_t)best_rd) |
|
763 return INT_MAX; |
|
764 |
|
765 *Rate = cost; |
|
766 *rate_y = tot_rate_y; |
|
767 *Distortion = distortion; |
|
768 |
|
769 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); |
|
770 } |
|
771 |
|
772 |
|
773 static int rd_pick_intra16x16mby_mode(MACROBLOCK *x, |
|
774 int *Rate, |
|
775 int *rate_y, |
|
776 int *Distortion) |
|
777 { |
|
778 MB_PREDICTION_MODE mode; |
|
779 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
|
780 int rate, ratey; |
|
781 int distortion; |
|
782 int best_rd = INT_MAX; |
|
783 int this_rd; |
|
784 MACROBLOCKD *xd = &x->e_mbd; |
|
785 |
|
786 /* Y Search for 16x16 intra prediction mode */ |
|
787 for (mode = DC_PRED; mode <= TM_PRED; mode++) |
|
788 { |
|
789 xd->mode_info_context->mbmi.mode = mode; |
|
790 |
|
791 vp8_build_intra_predictors_mby_s(xd, |
|
792 xd->dst.y_buffer - xd->dst.y_stride, |
|
793 xd->dst.y_buffer - 1, |
|
794 xd->dst.y_stride, |
|
795 xd->predictor, |
|
796 16); |
|
797 |
|
798 macro_block_yrd(x, &ratey, &distortion); |
|
799 rate = ratey + x->mbmode_cost[xd->frame_type] |
|
800 [xd->mode_info_context->mbmi.mode]; |
|
801 |
|
802 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
|
803 |
|
804 if (this_rd < best_rd) |
|
805 { |
|
806 mode_selected = mode; |
|
807 best_rd = this_rd; |
|
808 *Rate = rate; |
|
809 *rate_y = ratey; |
|
810 *Distortion = distortion; |
|
811 } |
|
812 } |
|
813 |
|
814 xd->mode_info_context->mbmi.mode = mode_selected; |
|
815 return best_rd; |
|
816 } |
|
817 |
|
818 static int rd_cost_mbuv(MACROBLOCK *mb) |
|
819 { |
|
820 int b; |
|
821 int cost = 0; |
|
822 MACROBLOCKD *x = &mb->e_mbd; |
|
823 ENTROPY_CONTEXT_PLANES t_above, t_left; |
|
824 ENTROPY_CONTEXT *ta; |
|
825 ENTROPY_CONTEXT *tl; |
|
826 |
|
827 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
828 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
829 |
|
830 ta = (ENTROPY_CONTEXT *)&t_above; |
|
831 tl = (ENTROPY_CONTEXT *)&t_left; |
|
832 |
|
833 for (b = 16; b < 24; b++) |
|
834 cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV, |
|
835 ta + vp8_block2above[b], tl + vp8_block2left[b]); |
|
836 |
|
837 return cost; |
|
838 } |
|
839 |
|
840 |
|
841 static int rd_inter16x16_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, |
|
842 int *distortion, int fullpixel) |
|
843 { |
|
844 vp8_build_inter16x16_predictors_mbuv(&x->e_mbd); |
|
845 vp8_subtract_mbuv(x->src_diff, |
|
846 x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, |
|
847 &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8); |
|
848 |
|
849 vp8_transform_mbuv(x); |
|
850 vp8_quantize_mbuv(x); |
|
851 |
|
852 *rate = rd_cost_mbuv(x); |
|
853 *distortion = vp8_mbuverror(x) / 4; |
|
854 |
|
855 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); |
|
856 } |
|
857 |
|
858 static int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, |
|
859 int *distortion, int fullpixel) |
|
860 { |
|
861 vp8_build_inter4x4_predictors_mbuv(&x->e_mbd); |
|
862 vp8_subtract_mbuv(x->src_diff, |
|
863 x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, |
|
864 &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8); |
|
865 |
|
866 vp8_transform_mbuv(x); |
|
867 vp8_quantize_mbuv(x); |
|
868 |
|
869 *rate = rd_cost_mbuv(x); |
|
870 *distortion = vp8_mbuverror(x) / 4; |
|
871 |
|
872 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); |
|
873 } |
|
874 |
|
875 static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate, |
|
876 int *rate_tokenonly, int *distortion) |
|
877 { |
|
878 MB_PREDICTION_MODE mode; |
|
879 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); |
|
880 int best_rd = INT_MAX; |
|
881 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); |
|
882 int rate_to; |
|
883 MACROBLOCKD *xd = &x->e_mbd; |
|
884 |
|
885 for (mode = DC_PRED; mode <= TM_PRED; mode++) |
|
886 { |
|
887 int this_rate; |
|
888 int this_distortion; |
|
889 int this_rd; |
|
890 |
|
891 xd->mode_info_context->mbmi.uv_mode = mode; |
|
892 |
|
893 vp8_build_intra_predictors_mbuv_s(xd, |
|
894 xd->dst.u_buffer - xd->dst.uv_stride, |
|
895 xd->dst.v_buffer - xd->dst.uv_stride, |
|
896 xd->dst.u_buffer - 1, |
|
897 xd->dst.v_buffer - 1, |
|
898 xd->dst.uv_stride, |
|
899 &xd->predictor[256], &xd->predictor[320], |
|
900 8); |
|
901 |
|
902 |
|
903 vp8_subtract_mbuv(x->src_diff, |
|
904 x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, |
|
905 &xd->predictor[256], &xd->predictor[320], 8); |
|
906 vp8_transform_mbuv(x); |
|
907 vp8_quantize_mbuv(x); |
|
908 |
|
909 rate_to = rd_cost_mbuv(x); |
|
910 this_rate = rate_to + x->intra_uv_mode_cost[xd->frame_type][xd->mode_info_context->mbmi.uv_mode]; |
|
911 |
|
912 this_distortion = vp8_mbuverror(x) / 4; |
|
913 |
|
914 this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion); |
|
915 |
|
916 if (this_rd < best_rd) |
|
917 { |
|
918 best_rd = this_rd; |
|
919 d = this_distortion; |
|
920 r = this_rate; |
|
921 *rate_tokenonly = rate_to; |
|
922 mode_selected = mode; |
|
923 } |
|
924 } |
|
925 |
|
926 *rate = r; |
|
927 *distortion = d; |
|
928 |
|
929 xd->mode_info_context->mbmi.uv_mode = mode_selected; |
|
930 } |
|
931 |
|
932 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) |
|
933 { |
|
934 vp8_prob p [VP8_MVREFS-1]; |
|
935 assert(NEARESTMV <= m && m <= SPLITMV); |
|
936 vp8_mv_ref_probs(p, near_mv_ref_ct); |
|
937 return vp8_cost_token(vp8_mv_ref_tree, p, |
|
938 vp8_mv_ref_encoding_array + (m - NEARESTMV)); |
|
939 } |
|
940 |
|
941 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) |
|
942 { |
|
943 x->e_mbd.mode_info_context->mbmi.mode = mb; |
|
944 x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int; |
|
945 } |
|
946 |
|
947 static int labels2mode( |
|
948 MACROBLOCK *x, |
|
949 int const *labelings, int which_label, |
|
950 B_PREDICTION_MODE this_mode, |
|
951 int_mv *this_mv, int_mv *best_ref_mv, |
|
952 int *mvcost[2] |
|
953 ) |
|
954 { |
|
955 MACROBLOCKD *const xd = & x->e_mbd; |
|
956 MODE_INFO *const mic = xd->mode_info_context; |
|
957 const int mis = xd->mode_info_stride; |
|
958 |
|
959 int cost = 0; |
|
960 int thismvcost = 0; |
|
961 |
|
962 /* We have to be careful retrieving previously-encoded motion vectors. |
|
963 Ones from this macroblock have to be pulled from the BLOCKD array |
|
964 as they have not yet made it to the bmi array in our MB_MODE_INFO. */ |
|
965 |
|
966 int i = 0; |
|
967 |
|
968 do |
|
969 { |
|
970 BLOCKD *const d = xd->block + i; |
|
971 const int row = i >> 2, col = i & 3; |
|
972 |
|
973 B_PREDICTION_MODE m; |
|
974 |
|
975 if (labelings[i] != which_label) |
|
976 continue; |
|
977 |
|
978 if (col && labelings[i] == labelings[i-1]) |
|
979 m = LEFT4X4; |
|
980 else if (row && labelings[i] == labelings[i-4]) |
|
981 m = ABOVE4X4; |
|
982 else |
|
983 { |
|
984 /* the only time we should do costing for new motion vector |
|
985 * or mode is when we are on a new label (jbb May 08, 2007) |
|
986 */ |
|
987 switch (m = this_mode) |
|
988 { |
|
989 case NEW4X4 : |
|
990 thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102); |
|
991 break; |
|
992 case LEFT4X4: |
|
993 this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i); |
|
994 break; |
|
995 case ABOVE4X4: |
|
996 this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis); |
|
997 break; |
|
998 case ZERO4X4: |
|
999 this_mv->as_int = 0; |
|
1000 break; |
|
1001 default: |
|
1002 break; |
|
1003 } |
|
1004 |
|
1005 if (m == ABOVE4X4) /* replace above with left if same */ |
|
1006 { |
|
1007 int_mv left_mv; |
|
1008 |
|
1009 left_mv.as_int = col ? d[-1].bmi.mv.as_int : |
|
1010 left_block_mv(mic, i); |
|
1011 |
|
1012 if (left_mv.as_int == this_mv->as_int) |
|
1013 m = LEFT4X4; |
|
1014 } |
|
1015 |
|
1016 cost = x->inter_bmode_costs[ m]; |
|
1017 } |
|
1018 |
|
1019 d->bmi.mv.as_int = this_mv->as_int; |
|
1020 |
|
1021 x->partition_info->bmi[i].mode = m; |
|
1022 x->partition_info->bmi[i].mv.as_int = this_mv->as_int; |
|
1023 |
|
1024 } |
|
1025 while (++i < 16); |
|
1026 |
|
1027 cost += thismvcost ; |
|
1028 return cost; |
|
1029 } |
|
1030 |
|
1031 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, |
|
1032 int which_label, ENTROPY_CONTEXT *ta, |
|
1033 ENTROPY_CONTEXT *tl) |
|
1034 { |
|
1035 int cost = 0; |
|
1036 int b; |
|
1037 MACROBLOCKD *x = &mb->e_mbd; |
|
1038 |
|
1039 for (b = 0; b < 16; b++) |
|
1040 if (labels[ b] == which_label) |
|
1041 cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC, |
|
1042 ta + vp8_block2above[b], |
|
1043 tl + vp8_block2left[b]); |
|
1044 |
|
1045 return cost; |
|
1046 |
|
1047 } |
|
1048 static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x, int const *labels, int which_label) |
|
1049 { |
|
1050 int i; |
|
1051 unsigned int distortion = 0; |
|
1052 int pre_stride = x->e_mbd.pre.y_stride; |
|
1053 unsigned char *base_pre = x->e_mbd.pre.y_buffer; |
|
1054 |
|
1055 |
|
1056 for (i = 0; i < 16; i++) |
|
1057 { |
|
1058 if (labels[i] == which_label) |
|
1059 { |
|
1060 BLOCKD *bd = &x->e_mbd.block[i]; |
|
1061 BLOCK *be = &x->block[i]; |
|
1062 |
|
1063 vp8_build_inter_predictors_b(bd, 16, base_pre, pre_stride, x->e_mbd.subpixel_predict); |
|
1064 vp8_subtract_b(be, bd, 16); |
|
1065 x->short_fdct4x4(be->src_diff, be->coeff, 32); |
|
1066 x->quantize_b(be, bd); |
|
1067 |
|
1068 distortion += vp8_block_error(be->coeff, bd->dqcoeff); |
|
1069 } |
|
1070 } |
|
1071 |
|
1072 return distortion; |
|
1073 } |
|
1074 |
|
1075 |
|
1076 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; |
|
1077 |
|
1078 |
|
1079 typedef struct |
|
1080 { |
|
1081 int_mv *ref_mv; |
|
1082 int_mv mvp; |
|
1083 |
|
1084 int segment_rd; |
|
1085 int segment_num; |
|
1086 int r; |
|
1087 int d; |
|
1088 int segment_yrate; |
|
1089 B_PREDICTION_MODE modes[16]; |
|
1090 int_mv mvs[16]; |
|
1091 unsigned char eobs[16]; |
|
1092 |
|
1093 int mvthresh; |
|
1094 int *mdcounts; |
|
1095 |
|
1096 int_mv sv_mvp[4]; /* save 4 mvp from 8x8 */ |
|
1097 int sv_istep[2]; /* save 2 initial step_param for 16x8/8x16 */ |
|
1098 |
|
1099 } BEST_SEG_INFO; |
|
1100 |
|
1101 |
|
1102 static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, |
|
1103 BEST_SEG_INFO *bsi, unsigned int segmentation) |
|
1104 { |
|
1105 int i; |
|
1106 int const *labels; |
|
1107 int br = 0; |
|
1108 int bd = 0; |
|
1109 B_PREDICTION_MODE this_mode; |
|
1110 |
|
1111 |
|
1112 int label_count; |
|
1113 int this_segment_rd = 0; |
|
1114 int label_mv_thresh; |
|
1115 int rate = 0; |
|
1116 int sbr = 0; |
|
1117 int sbd = 0; |
|
1118 int segmentyrate = 0; |
|
1119 |
|
1120 vp8_variance_fn_ptr_t *v_fn_ptr; |
|
1121 |
|
1122 ENTROPY_CONTEXT_PLANES t_above, t_left; |
|
1123 ENTROPY_CONTEXT *ta; |
|
1124 ENTROPY_CONTEXT *tl; |
|
1125 ENTROPY_CONTEXT_PLANES t_above_b, t_left_b; |
|
1126 ENTROPY_CONTEXT *ta_b; |
|
1127 ENTROPY_CONTEXT *tl_b; |
|
1128 |
|
1129 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1130 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1131 |
|
1132 ta = (ENTROPY_CONTEXT *)&t_above; |
|
1133 tl = (ENTROPY_CONTEXT *)&t_left; |
|
1134 ta_b = (ENTROPY_CONTEXT *)&t_above_b; |
|
1135 tl_b = (ENTROPY_CONTEXT *)&t_left_b; |
|
1136 |
|
1137 br = 0; |
|
1138 bd = 0; |
|
1139 |
|
1140 v_fn_ptr = &cpi->fn_ptr[segmentation]; |
|
1141 labels = vp8_mbsplits[segmentation]; |
|
1142 label_count = vp8_mbsplit_count[segmentation]; |
|
1143 |
|
1144 /* 64 makes this threshold really big effectively making it so that we |
|
1145 * very rarely check mvs on segments. setting this to 1 would make mv |
|
1146 * thresh roughly equal to what it is for macroblocks |
|
1147 */ |
|
1148 label_mv_thresh = 1 * bsi->mvthresh / label_count ; |
|
1149 |
|
1150 /* Segmentation method overheads */ |
|
1151 rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + segmentation); |
|
1152 rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); |
|
1153 this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); |
|
1154 br += rate; |
|
1155 |
|
1156 for (i = 0; i < label_count; i++) |
|
1157 { |
|
1158 int_mv mode_mv[B_MODE_COUNT]; |
|
1159 int best_label_rd = INT_MAX; |
|
1160 B_PREDICTION_MODE mode_selected = ZERO4X4; |
|
1161 int bestlabelyrate = 0; |
|
1162 |
|
1163 /* search for the best motion vector on this segment */ |
|
1164 for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) |
|
1165 { |
|
1166 int this_rd; |
|
1167 int distortion; |
|
1168 int labelyrate; |
|
1169 ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; |
|
1170 ENTROPY_CONTEXT *ta_s; |
|
1171 ENTROPY_CONTEXT *tl_s; |
|
1172 |
|
1173 vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1174 vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1175 |
|
1176 ta_s = (ENTROPY_CONTEXT *)&t_above_s; |
|
1177 tl_s = (ENTROPY_CONTEXT *)&t_left_s; |
|
1178 |
|
1179 if (this_mode == NEW4X4) |
|
1180 { |
|
1181 int sseshift; |
|
1182 int num00; |
|
1183 int step_param = 0; |
|
1184 int further_steps; |
|
1185 int n; |
|
1186 int thissme; |
|
1187 int bestsme = INT_MAX; |
|
1188 int_mv temp_mv; |
|
1189 BLOCK *c; |
|
1190 BLOCKD *e; |
|
1191 |
|
1192 /* Is the best so far sufficiently good that we cant justify |
|
1193 * doing a new motion search. |
|
1194 */ |
|
1195 if (best_label_rd < label_mv_thresh) |
|
1196 break; |
|
1197 |
|
1198 if(cpi->compressor_speed) |
|
1199 { |
|
1200 if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8) |
|
1201 { |
|
1202 bsi->mvp.as_int = bsi->sv_mvp[i].as_int; |
|
1203 if (i==1 && segmentation == BLOCK_16X8) |
|
1204 bsi->mvp.as_int = bsi->sv_mvp[2].as_int; |
|
1205 |
|
1206 step_param = bsi->sv_istep[i]; |
|
1207 } |
|
1208 |
|
1209 /* use previous block's result as next block's MV |
|
1210 * predictor. |
|
1211 */ |
|
1212 if (segmentation == BLOCK_4X4 && i>0) |
|
1213 { |
|
1214 bsi->mvp.as_int = x->e_mbd.block[i-1].bmi.mv.as_int; |
|
1215 if (i==4 || i==8 || i==12) |
|
1216 bsi->mvp.as_int = x->e_mbd.block[i-4].bmi.mv.as_int; |
|
1217 step_param = 2; |
|
1218 } |
|
1219 } |
|
1220 |
|
1221 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
|
1222 |
|
1223 { |
|
1224 int sadpb = x->sadperbit4; |
|
1225 int_mv mvp_full; |
|
1226 |
|
1227 mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3; |
|
1228 mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3; |
|
1229 |
|
1230 /* find first label */ |
|
1231 n = vp8_mbsplit_offset[segmentation][i]; |
|
1232 |
|
1233 c = &x->block[n]; |
|
1234 e = &x->e_mbd.block[n]; |
|
1235 |
|
1236 { |
|
1237 bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full, |
|
1238 &mode_mv[NEW4X4], step_param, |
|
1239 sadpb, &num00, v_fn_ptr, |
|
1240 x->mvcost, bsi->ref_mv); |
|
1241 |
|
1242 n = num00; |
|
1243 num00 = 0; |
|
1244 |
|
1245 while (n < further_steps) |
|
1246 { |
|
1247 n++; |
|
1248 |
|
1249 if (num00) |
|
1250 num00--; |
|
1251 else |
|
1252 { |
|
1253 thissme = cpi->diamond_search_sad(x, c, e, |
|
1254 &mvp_full, &temp_mv, |
|
1255 step_param + n, sadpb, |
|
1256 &num00, v_fn_ptr, |
|
1257 x->mvcost, bsi->ref_mv); |
|
1258 |
|
1259 if (thissme < bestsme) |
|
1260 { |
|
1261 bestsme = thissme; |
|
1262 mode_mv[NEW4X4].as_int = temp_mv.as_int; |
|
1263 } |
|
1264 } |
|
1265 } |
|
1266 } |
|
1267 |
|
1268 sseshift = segmentation_to_sseshift[segmentation]; |
|
1269 |
|
1270 /* Should we do a full search (best quality only) */ |
|
1271 if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) |
|
1272 { |
|
1273 /* Check if mvp_full is within the range. */ |
|
1274 vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); |
|
1275 |
|
1276 thissme = cpi->full_search_sad(x, c, e, &mvp_full, |
|
1277 sadpb, 16, v_fn_ptr, |
|
1278 x->mvcost, bsi->ref_mv); |
|
1279 |
|
1280 if (thissme < bestsme) |
|
1281 { |
|
1282 bestsme = thissme; |
|
1283 mode_mv[NEW4X4].as_int = e->bmi.mv.as_int; |
|
1284 } |
|
1285 else |
|
1286 { |
|
1287 /* The full search result is actually worse so |
|
1288 * re-instate the previous best vector |
|
1289 */ |
|
1290 e->bmi.mv.as_int = mode_mv[NEW4X4].as_int; |
|
1291 } |
|
1292 } |
|
1293 } |
|
1294 |
|
1295 if (bestsme < INT_MAX) |
|
1296 { |
|
1297 int disto; |
|
1298 unsigned int sse; |
|
1299 cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], |
|
1300 bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost, |
|
1301 &disto, &sse); |
|
1302 } |
|
1303 } /* NEW4X4 */ |
|
1304 |
|
1305 rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], |
|
1306 bsi->ref_mv, x->mvcost); |
|
1307 |
|
1308 /* Trap vectors that reach beyond the UMV borders */ |
|
1309 if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || |
|
1310 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) |
|
1311 { |
|
1312 continue; |
|
1313 } |
|
1314 |
|
1315 distortion = vp8_encode_inter_mb_segment(x, labels, i) / 4; |
|
1316 |
|
1317 labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); |
|
1318 rate += labelyrate; |
|
1319 |
|
1320 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
|
1321 |
|
1322 if (this_rd < best_label_rd) |
|
1323 { |
|
1324 sbr = rate; |
|
1325 sbd = distortion; |
|
1326 bestlabelyrate = labelyrate; |
|
1327 mode_selected = this_mode; |
|
1328 best_label_rd = this_rd; |
|
1329 |
|
1330 vpx_memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1331 vpx_memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1332 |
|
1333 } |
|
1334 } /*for each 4x4 mode*/ |
|
1335 |
|
1336 vpx_memcpy(ta, ta_b, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1337 vpx_memcpy(tl, tl_b, sizeof(ENTROPY_CONTEXT_PLANES)); |
|
1338 |
|
1339 labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected], |
|
1340 bsi->ref_mv, x->mvcost); |
|
1341 |
|
1342 br += sbr; |
|
1343 bd += sbd; |
|
1344 segmentyrate += bestlabelyrate; |
|
1345 this_segment_rd += best_label_rd; |
|
1346 |
|
1347 if (this_segment_rd >= bsi->segment_rd) |
|
1348 break; |
|
1349 |
|
1350 } /* for each label */ |
|
1351 |
|
1352 if (this_segment_rd < bsi->segment_rd) |
|
1353 { |
|
1354 bsi->r = br; |
|
1355 bsi->d = bd; |
|
1356 bsi->segment_yrate = segmentyrate; |
|
1357 bsi->segment_rd = this_segment_rd; |
|
1358 bsi->segment_num = segmentation; |
|
1359 |
|
1360 /* store everything needed to come back to this!! */ |
|
1361 for (i = 0; i < 16; i++) |
|
1362 { |
|
1363 bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv; |
|
1364 bsi->modes[i] = x->partition_info->bmi[i].mode; |
|
1365 bsi->eobs[i] = x->e_mbd.eobs[i]; |
|
1366 } |
|
1367 } |
|
1368 } |
|
1369 |
|
1370 static |
|
1371 void vp8_cal_step_param(int sr, int *sp) |
|
1372 { |
|
1373 int step = 0; |
|
1374 |
|
1375 if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; |
|
1376 else if (sr < 1) sr = 1; |
|
1377 |
|
1378 while (sr>>=1) |
|
1379 step++; |
|
1380 |
|
1381 *sp = MAX_MVSEARCH_STEPS - 1 - step; |
|
1382 } |
|
1383 |
|
1384 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, |
|
1385 int_mv *best_ref_mv, int best_rd, |
|
1386 int *mdcounts, int *returntotrate, |
|
1387 int *returnyrate, int *returndistortion, |
|
1388 int mvthresh) |
|
1389 { |
|
1390 int i; |
|
1391 BEST_SEG_INFO bsi; |
|
1392 |
|
1393 vpx_memset(&bsi, 0, sizeof(bsi)); |
|
1394 |
|
1395 bsi.segment_rd = best_rd; |
|
1396 bsi.ref_mv = best_ref_mv; |
|
1397 bsi.mvp.as_int = best_ref_mv->as_int; |
|
1398 bsi.mvthresh = mvthresh; |
|
1399 bsi.mdcounts = mdcounts; |
|
1400 |
|
1401 for(i = 0; i < 16; i++) |
|
1402 { |
|
1403 bsi.modes[i] = ZERO4X4; |
|
1404 } |
|
1405 |
|
1406 if(cpi->compressor_speed == 0) |
|
1407 { |
|
1408 /* for now, we will keep the original segmentation order |
|
1409 when in best quality mode */ |
|
1410 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); |
|
1411 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); |
|
1412 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); |
|
1413 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); |
|
1414 } |
|
1415 else |
|
1416 { |
|
1417 int sr; |
|
1418 |
|
1419 rd_check_segment(cpi, x, &bsi, BLOCK_8X8); |
|
1420 |
|
1421 if (bsi.segment_rd < best_rd) |
|
1422 { |
|
1423 int col_min = ((best_ref_mv->as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; |
|
1424 int row_min = ((best_ref_mv->as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; |
|
1425 int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL; |
|
1426 int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL; |
|
1427 |
|
1428 int tmp_col_min = x->mv_col_min; |
|
1429 int tmp_col_max = x->mv_col_max; |
|
1430 int tmp_row_min = x->mv_row_min; |
|
1431 int tmp_row_max = x->mv_row_max; |
|
1432 |
|
1433 /* Get intersection of UMV window and valid MV window to reduce # of checks in diamond search. */ |
|
1434 if (x->mv_col_min < col_min ) |
|
1435 x->mv_col_min = col_min; |
|
1436 if (x->mv_col_max > col_max ) |
|
1437 x->mv_col_max = col_max; |
|
1438 if (x->mv_row_min < row_min ) |
|
1439 x->mv_row_min = row_min; |
|
1440 if (x->mv_row_max > row_max ) |
|
1441 x->mv_row_max = row_max; |
|
1442 |
|
1443 /* Get 8x8 result */ |
|
1444 bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int; |
|
1445 bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int; |
|
1446 bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int; |
|
1447 bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int; |
|
1448 |
|
1449 /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range according to the closeness of 2 MV. */ |
|
1450 /* block 8X16 */ |
|
1451 { |
|
1452 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col))>>3); |
|
1453 vp8_cal_step_param(sr, &bsi.sv_istep[0]); |
|
1454 |
|
1455 sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); |
|
1456 vp8_cal_step_param(sr, &bsi.sv_istep[1]); |
|
1457 |
|
1458 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); |
|
1459 } |
|
1460 |
|
1461 /* block 16X8 */ |
|
1462 { |
|
1463 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col))>>3); |
|
1464 vp8_cal_step_param(sr, &bsi.sv_istep[0]); |
|
1465 |
|
1466 sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); |
|
1467 vp8_cal_step_param(sr, &bsi.sv_istep[1]); |
|
1468 |
|
1469 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); |
|
1470 } |
|
1471 |
|
1472 /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ |
|
1473 /* Not skip 4x4 if speed=0 (good quality) */ |
|
1474 if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8) /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ |
|
1475 { |
|
1476 bsi.mvp.as_int = bsi.sv_mvp[0].as_int; |
|
1477 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); |
|
1478 } |
|
1479 |
|
1480 /* restore UMV window */ |
|
1481 x->mv_col_min = tmp_col_min; |
|
1482 x->mv_col_max = tmp_col_max; |
|
1483 x->mv_row_min = tmp_row_min; |
|
1484 x->mv_row_max = tmp_row_max; |
|
1485 } |
|
1486 } |
|
1487 |
|
1488 /* set it to the best */ |
|
1489 for (i = 0; i < 16; i++) |
|
1490 { |
|
1491 BLOCKD *bd = &x->e_mbd.block[i]; |
|
1492 |
|
1493 bd->bmi.mv.as_int = bsi.mvs[i].as_int; |
|
1494 *bd->eob = bsi.eobs[i]; |
|
1495 } |
|
1496 |
|
1497 *returntotrate = bsi.r; |
|
1498 *returndistortion = bsi.d; |
|
1499 *returnyrate = bsi.segment_yrate; |
|
1500 |
|
1501 /* save partitions */ |
|
1502 x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; |
|
1503 x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; |
|
1504 |
|
1505 for (i = 0; i < x->partition_info->count; i++) |
|
1506 { |
|
1507 int j; |
|
1508 |
|
1509 j = vp8_mbsplit_offset[bsi.segment_num][i]; |
|
1510 |
|
1511 x->partition_info->bmi[i].mode = bsi.modes[j]; |
|
1512 x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv; |
|
1513 } |
|
1514 /* |
|
1515 * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int |
|
1516 */ |
|
1517 x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int; |
|
1518 |
|
1519 return bsi.segment_rd; |
|
1520 } |
|
1521 |
|
1522 /* The improved MV prediction */ |
|
1523 void vp8_mv_pred |
|
1524 ( |
|
1525 VP8_COMP *cpi, |
|
1526 MACROBLOCKD *xd, |
|
1527 const MODE_INFO *here, |
|
1528 int_mv *mvp, |
|
1529 int refframe, |
|
1530 int *ref_frame_sign_bias, |
|
1531 int *sr, |
|
1532 int near_sadidx[] |
|
1533 ) |
|
1534 { |
|
1535 const MODE_INFO *above = here - xd->mode_info_stride; |
|
1536 const MODE_INFO *left = here - 1; |
|
1537 const MODE_INFO *aboveleft = above - 1; |
|
1538 int_mv near_mvs[8]; |
|
1539 int near_ref[8]; |
|
1540 int_mv mv; |
|
1541 int vcnt=0; |
|
1542 int find=0; |
|
1543 int mb_offset; |
|
1544 |
|
1545 int mvx[8]; |
|
1546 int mvy[8]; |
|
1547 int i; |
|
1548 |
|
1549 mv.as_int = 0; |
|
1550 |
|
1551 if(here->mbmi.ref_frame != INTRA_FRAME) |
|
1552 { |
|
1553 near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int = near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int = near_mvs[6].as_int = near_mvs[7].as_int = 0; |
|
1554 near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] = near_ref[5] = near_ref[6] = near_ref[7] = 0; |
|
1555 |
|
1556 /* read in 3 nearby block's MVs from current frame as prediction |
|
1557 * candidates. |
|
1558 */ |
|
1559 if (above->mbmi.ref_frame != INTRA_FRAME) |
|
1560 { |
|
1561 near_mvs[vcnt].as_int = above->mbmi.mv.as_int; |
|
1562 mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1563 near_ref[vcnt] = above->mbmi.ref_frame; |
|
1564 } |
|
1565 vcnt++; |
|
1566 if (left->mbmi.ref_frame != INTRA_FRAME) |
|
1567 { |
|
1568 near_mvs[vcnt].as_int = left->mbmi.mv.as_int; |
|
1569 mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1570 near_ref[vcnt] = left->mbmi.ref_frame; |
|
1571 } |
|
1572 vcnt++; |
|
1573 if (aboveleft->mbmi.ref_frame != INTRA_FRAME) |
|
1574 { |
|
1575 near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int; |
|
1576 mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1577 near_ref[vcnt] = aboveleft->mbmi.ref_frame; |
|
1578 } |
|
1579 vcnt++; |
|
1580 |
|
1581 /* read in 5 nearby block's MVs from last frame. */ |
|
1582 if(cpi->common.last_frame_type != KEY_FRAME) |
|
1583 { |
|
1584 mb_offset = (-xd->mb_to_top_edge/128 + 1) * (xd->mode_info_stride +1) + (-xd->mb_to_left_edge/128 +1) ; |
|
1585 |
|
1586 /* current in last frame */ |
|
1587 if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME) |
|
1588 { |
|
1589 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int; |
|
1590 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1591 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset]; |
|
1592 } |
|
1593 vcnt++; |
|
1594 |
|
1595 /* above in last frame */ |
|
1596 if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1] != INTRA_FRAME) |
|
1597 { |
|
1598 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - xd->mode_info_stride-1].as_int; |
|
1599 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride-1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1600 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1]; |
|
1601 } |
|
1602 vcnt++; |
|
1603 |
|
1604 /* left in last frame */ |
|
1605 if (cpi->lf_ref_frame[mb_offset-1] != INTRA_FRAME) |
|
1606 { |
|
1607 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset -1].as_int; |
|
1608 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset -1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1609 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1]; |
|
1610 } |
|
1611 vcnt++; |
|
1612 |
|
1613 /* right in last frame */ |
|
1614 if (cpi->lf_ref_frame[mb_offset +1] != INTRA_FRAME) |
|
1615 { |
|
1616 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset +1].as_int; |
|
1617 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1618 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset +1]; |
|
1619 } |
|
1620 vcnt++; |
|
1621 |
|
1622 /* below in last frame */ |
|
1623 if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1] != INTRA_FRAME) |
|
1624 { |
|
1625 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + xd->mode_info_stride +1].as_int; |
|
1626 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); |
|
1627 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1]; |
|
1628 } |
|
1629 vcnt++; |
|
1630 } |
|
1631 |
|
1632 for(i=0; i< vcnt; i++) |
|
1633 { |
|
1634 if(near_ref[near_sadidx[i]] != INTRA_FRAME) |
|
1635 { |
|
1636 if(here->mbmi.ref_frame == near_ref[near_sadidx[i]]) |
|
1637 { |
|
1638 mv.as_int = near_mvs[near_sadidx[i]].as_int; |
|
1639 find = 1; |
|
1640 if (i < 3) |
|
1641 *sr = 3; |
|
1642 else |
|
1643 *sr = 2; |
|
1644 break; |
|
1645 } |
|
1646 } |
|
1647 } |
|
1648 |
|
1649 if(!find) |
|
1650 { |
|
1651 for(i=0; i<vcnt; i++) |
|
1652 { |
|
1653 mvx[i] = near_mvs[i].as_mv.row; |
|
1654 mvy[i] = near_mvs[i].as_mv.col; |
|
1655 } |
|
1656 |
|
1657 insertsortmv(mvx, vcnt); |
|
1658 insertsortmv(mvy, vcnt); |
|
1659 mv.as_mv.row = mvx[vcnt/2]; |
|
1660 mv.as_mv.col = mvy[vcnt/2]; |
|
1661 |
|
1662 find = 1; |
|
1663 /* sr is set to 0 to allow calling function to decide the search |
|
1664 * range. |
|
1665 */ |
|
1666 *sr = 0; |
|
1667 } |
|
1668 } |
|
1669 |
|
1670 /* Set up return values */ |
|
1671 mvp->as_int = mv.as_int; |
|
1672 vp8_clamp_mv2(mvp, xd); |
|
1673 } |
|
1674 |
|
1675 void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffset, int near_sadidx[]) |
|
1676 { |
|
1677 /* near_sad indexes: |
|
1678 * 0-cf above, 1-cf left, 2-cf aboveleft, |
|
1679 * 3-lf current, 4-lf above, 5-lf left, 6-lf right, 7-lf below |
|
1680 */ |
|
1681 int near_sad[8] = {0}; |
|
1682 BLOCK *b = &x->block[0]; |
|
1683 unsigned char *src_y_ptr = *(b->base_src); |
|
1684 |
|
1685 /* calculate sad for current frame 3 nearby MBs. */ |
|
1686 if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) |
|
1687 { |
|
1688 near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; |
|
1689 }else if(xd->mb_to_top_edge==0) |
|
1690 { /* only has left MB for sad calculation. */ |
|
1691 near_sad[0] = near_sad[2] = INT_MAX; |
|
1692 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, UINT_MAX); |
|
1693 }else if(xd->mb_to_left_edge ==0) |
|
1694 { /* only has left MB for sad calculation. */ |
|
1695 near_sad[1] = near_sad[2] = INT_MAX; |
|
1696 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, UINT_MAX); |
|
1697 }else |
|
1698 { |
|
1699 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, UINT_MAX); |
|
1700 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, UINT_MAX); |
|
1701 near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, UINT_MAX); |
|
1702 } |
|
1703 |
|
1704 if(cpi->common.last_frame_type != KEY_FRAME) |
|
1705 { |
|
1706 /* calculate sad for last frame 5 nearby MBs. */ |
|
1707 unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset; |
|
1708 int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; |
|
1709 |
|
1710 if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; |
|
1711 if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; |
|
1712 if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; |
|
1713 if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; |
|
1714 |
|
1715 if(near_sad[4] != INT_MAX) |
|
1716 near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - pre_y_stride *16, pre_y_stride, UINT_MAX); |
|
1717 if(near_sad[5] != INT_MAX) |
|
1718 near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - 16, pre_y_stride, UINT_MAX); |
|
1719 near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer, pre_y_stride, UINT_MAX); |
|
1720 if(near_sad[6] != INT_MAX) |
|
1721 near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + 16, pre_y_stride, UINT_MAX); |
|
1722 if(near_sad[7] != INT_MAX) |
|
1723 near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + pre_y_stride *16, pre_y_stride, UINT_MAX); |
|
1724 } |
|
1725 |
|
1726 if(cpi->common.last_frame_type != KEY_FRAME) |
|
1727 { |
|
1728 insertsortsad(near_sad, near_sadidx, 8); |
|
1729 }else |
|
1730 { |
|
1731 insertsortsad(near_sad, near_sadidx, 3); |
|
1732 } |
|
1733 } |
|
1734 |
|
1735 static void rd_update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) |
|
1736 { |
|
1737 if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) |
|
1738 { |
|
1739 int i; |
|
1740 |
|
1741 for (i = 0; i < x->partition_info->count; i++) |
|
1742 { |
|
1743 if (x->partition_info->bmi[i].mode == NEW4X4) |
|
1744 { |
|
1745 x->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row |
|
1746 - best_ref_mv->as_mv.row) >> 1)]++; |
|
1747 x->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col |
|
1748 - best_ref_mv->as_mv.col) >> 1)]++; |
|
1749 } |
|
1750 } |
|
1751 } |
|
1752 else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) |
|
1753 { |
|
1754 x->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row |
|
1755 - best_ref_mv->as_mv.row) >> 1)]++; |
|
1756 x->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col |
|
1757 - best_ref_mv->as_mv.col) >> 1)]++; |
|
1758 } |
|
1759 } |
|
1760 |
|
1761 static int evaluate_inter_mode_rd(int mdcounts[4], |
|
1762 RATE_DISTORTION* rd, |
|
1763 int* disable_skip, |
|
1764 VP8_COMP *cpi, MACROBLOCK *x) |
|
1765 { |
|
1766 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; |
|
1767 BLOCK *b = &x->block[0]; |
|
1768 MACROBLOCKD *xd = &x->e_mbd; |
|
1769 int distortion; |
|
1770 vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.predictor, 16); |
|
1771 |
|
1772 if (cpi->active_map_enabled && x->active_ptr[0] == 0) { |
|
1773 x->skip = 1; |
|
1774 } |
|
1775 else if (x->encode_breakout) |
|
1776 { |
|
1777 unsigned int sse; |
|
1778 unsigned int var; |
|
1779 unsigned int threshold = (xd->block[0].dequant[1] |
|
1780 * xd->block[0].dequant[1] >>4); |
|
1781 |
|
1782 if(threshold < x->encode_breakout) |
|
1783 threshold = x->encode_breakout; |
|
1784 |
|
1785 var = vp8_variance16x16 |
|
1786 (*(b->base_src), b->src_stride, |
|
1787 x->e_mbd.predictor, 16, &sse); |
|
1788 |
|
1789 if (sse < threshold) |
|
1790 { |
|
1791 unsigned int q2dc = xd->block[24].dequant[0]; |
|
1792 /* If theres is no codeable 2nd order dc |
|
1793 or a very small uniform pixel change change */ |
|
1794 if ((sse - var < q2dc * q2dc >>4) || |
|
1795 (sse /2 > var && sse-var < 64)) |
|
1796 { |
|
1797 /* Check u and v to make sure skip is ok */ |
|
1798 unsigned int sse2 = VP8_UVSSE(x); |
|
1799 if (sse2 * 2 < threshold) |
|
1800 { |
|
1801 x->skip = 1; |
|
1802 rd->distortion2 = sse + sse2; |
|
1803 rd->rate2 = 500; |
|
1804 |
|
1805 /* for best_yrd calculation */ |
|
1806 rd->rate_uv = 0; |
|
1807 rd->distortion_uv = sse2; |
|
1808 |
|
1809 *disable_skip = 1; |
|
1810 return RDCOST(x->rdmult, x->rddiv, rd->rate2, |
|
1811 rd->distortion2); |
|
1812 } |
|
1813 } |
|
1814 } |
|
1815 } |
|
1816 |
|
1817 |
|
1818 /* Add in the Mv/mode cost */ |
|
1819 rd->rate2 += vp8_cost_mv_ref(this_mode, mdcounts); |
|
1820 |
|
1821 /* Y cost and distortion */ |
|
1822 macro_block_yrd(x, &rd->rate_y, &distortion); |
|
1823 rd->rate2 += rd->rate_y; |
|
1824 rd->distortion2 += distortion; |
|
1825 |
|
1826 /* UV cost and distortion */ |
|
1827 rd_inter16x16_uv(cpi, x, &rd->rate_uv, &rd->distortion_uv, |
|
1828 cpi->common.full_pixel); |
|
1829 rd->rate2 += rd->rate_uv; |
|
1830 rd->distortion2 += rd->distortion_uv; |
|
1831 return INT_MAX; |
|
1832 } |
|
1833 |
|
1834 static int calculate_final_rd_costs(int this_rd, |
|
1835 RATE_DISTORTION* rd, |
|
1836 int* other_cost, |
|
1837 int disable_skip, |
|
1838 int uv_intra_tteob, |
|
1839 int intra_rd_penalty, |
|
1840 VP8_COMP *cpi, MACROBLOCK *x) |
|
1841 { |
|
1842 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; |
|
1843 |
|
1844 /* Where skip is allowable add in the default per mb cost for the no |
|
1845 * skip case. where we then decide to skip we have to delete this and |
|
1846 * replace it with the cost of signalling a skip |
|
1847 */ |
|
1848 if (cpi->common.mb_no_coeff_skip) |
|
1849 { |
|
1850 *other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); |
|
1851 rd->rate2 += *other_cost; |
|
1852 } |
|
1853 |
|
1854 /* Estimate the reference frame signaling cost and add it |
|
1855 * to the rolling cost variable. |
|
1856 */ |
|
1857 rd->rate2 += |
|
1858 x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; |
|
1859 |
|
1860 if (!disable_skip) |
|
1861 { |
|
1862 /* Test for the condition where skip block will be activated |
|
1863 * because there are no non zero coefficients and make any |
|
1864 * necessary adjustment for rate |
|
1865 */ |
|
1866 if (cpi->common.mb_no_coeff_skip) |
|
1867 { |
|
1868 int i; |
|
1869 int tteob; |
|
1870 int has_y2_block = (this_mode!=SPLITMV && this_mode!=B_PRED); |
|
1871 |
|
1872 tteob = 0; |
|
1873 if(has_y2_block) |
|
1874 tteob += x->e_mbd.eobs[24]; |
|
1875 |
|
1876 for (i = 0; i < 16; i++) |
|
1877 tteob += (x->e_mbd.eobs[i] > has_y2_block); |
|
1878 |
|
1879 if (x->e_mbd.mode_info_context->mbmi.ref_frame) |
|
1880 { |
|
1881 for (i = 16; i < 24; i++) |
|
1882 tteob += x->e_mbd.eobs[i]; |
|
1883 } |
|
1884 else |
|
1885 tteob += uv_intra_tteob; |
|
1886 |
|
1887 if (tteob == 0) |
|
1888 { |
|
1889 rd->rate2 -= (rd->rate_y + rd->rate_uv); |
|
1890 /* for best_yrd calculation */ |
|
1891 rd->rate_uv = 0; |
|
1892 |
|
1893 /* Back out no skip flag costing and add in skip flag costing */ |
|
1894 if (cpi->prob_skip_false) |
|
1895 { |
|
1896 int prob_skip_cost; |
|
1897 |
|
1898 prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1); |
|
1899 prob_skip_cost -= vp8_cost_bit(cpi->prob_skip_false, 0); |
|
1900 rd->rate2 += prob_skip_cost; |
|
1901 *other_cost += prob_skip_cost; |
|
1902 } |
|
1903 } |
|
1904 } |
|
1905 /* Calculate the final RD estimate for this mode */ |
|
1906 this_rd = RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2); |
|
1907 if (this_rd < INT_MAX && x->e_mbd.mode_info_context->mbmi.ref_frame |
|
1908 == INTRA_FRAME) |
|
1909 this_rd += intra_rd_penalty; |
|
1910 } |
|
1911 return this_rd; |
|
1912 } |
|
1913 |
|
1914 static void update_best_mode(BEST_MODE* best_mode, int this_rd, |
|
1915 RATE_DISTORTION* rd, int other_cost, MACROBLOCK *x) |
|
1916 { |
|
1917 MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; |
|
1918 |
|
1919 other_cost += |
|
1920 x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; |
|
1921 |
|
1922 /* Calculate the final y RD estimate for this mode */ |
|
1923 best_mode->yrd = RDCOST(x->rdmult, x->rddiv, (rd->rate2-rd->rate_uv-other_cost), |
|
1924 (rd->distortion2-rd->distortion_uv)); |
|
1925 |
|
1926 best_mode->rd = this_rd; |
|
1927 vpx_memcpy(&best_mode->mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(MB_MODE_INFO)); |
|
1928 vpx_memcpy(&best_mode->partition, x->partition_info, sizeof(PARTITION_INFO)); |
|
1929 |
|
1930 if ((this_mode == B_PRED) || (this_mode == SPLITMV)) |
|
1931 { |
|
1932 int i; |
|
1933 for (i = 0; i < 16; i++) |
|
1934 { |
|
1935 best_mode->bmodes[i] = x->e_mbd.block[i].bmi; |
|
1936 } |
|
1937 } |
|
1938 } |
|
1939 |
|
1940 void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, |
|
1941 int recon_uvoffset, int *returnrate, |
|
1942 int *returndistortion, int *returnintra) |
|
1943 { |
|
1944 BLOCK *b = &x->block[0]; |
|
1945 BLOCKD *d = &x->e_mbd.block[0]; |
|
1946 MACROBLOCKD *xd = &x->e_mbd; |
|
1947 int_mv best_ref_mv_sb[2]; |
|
1948 int_mv mode_mv_sb[2][MB_MODE_COUNT]; |
|
1949 int_mv best_ref_mv; |
|
1950 int_mv *mode_mv; |
|
1951 MB_PREDICTION_MODE this_mode; |
|
1952 int num00; |
|
1953 int best_mode_index = 0; |
|
1954 BEST_MODE best_mode; |
|
1955 |
|
1956 int i; |
|
1957 int mode_index; |
|
1958 int mdcounts[4]; |
|
1959 int rate; |
|
1960 RATE_DISTORTION rd; |
|
1961 int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; |
|
1962 int uv_intra_tteob = 0; |
|
1963 int uv_intra_done = 0; |
|
1964 |
|
1965 MB_PREDICTION_MODE uv_intra_mode = 0; |
|
1966 int_mv mvp; |
|
1967 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; |
|
1968 int saddone=0; |
|
1969 /* search range got from mv_pred(). It uses step_param levels. (0-7) */ |
|
1970 int sr=0; |
|
1971 |
|
1972 unsigned char *plane[4][3]; |
|
1973 int ref_frame_map[4]; |
|
1974 int sign_bias = 0; |
|
1975 |
|
1976 int intra_rd_penalty = 10* vp8_dc_quant(cpi->common.base_qindex, |
|
1977 cpi->common.y1dc_delta_q); |
|
1978 |
|
1979 #if CONFIG_TEMPORAL_DENOISING |
|
1980 unsigned int zero_mv_sse = INT_MAX, best_sse = INT_MAX, |
|
1981 best_rd_sse = INT_MAX; |
|
1982 #endif |
|
1983 |
|
1984 mode_mv = mode_mv_sb[sign_bias]; |
|
1985 best_ref_mv.as_int = 0; |
|
1986 best_mode.rd = INT_MAX; |
|
1987 best_mode.yrd = INT_MAX; |
|
1988 best_mode.intra_rd = INT_MAX; |
|
1989 vpx_memset(mode_mv_sb, 0, sizeof(mode_mv_sb)); |
|
1990 vpx_memset(&best_mode.mbmode, 0, sizeof(best_mode.mbmode)); |
|
1991 vpx_memset(&best_mode.bmodes, 0, sizeof(best_mode.bmodes)); |
|
1992 |
|
1993 /* Setup search priorities */ |
|
1994 get_reference_search_order(cpi, ref_frame_map); |
|
1995 |
|
1996 /* Check to see if there is at least 1 valid reference frame that we need |
|
1997 * to calculate near_mvs. |
|
1998 */ |
|
1999 if (ref_frame_map[1] > 0) |
|
2000 { |
|
2001 sign_bias = vp8_find_near_mvs_bias(&x->e_mbd, |
|
2002 x->e_mbd.mode_info_context, |
|
2003 mode_mv_sb, |
|
2004 best_ref_mv_sb, |
|
2005 mdcounts, |
|
2006 ref_frame_map[1], |
|
2007 cpi->common.ref_frame_sign_bias); |
|
2008 |
|
2009 mode_mv = mode_mv_sb[sign_bias]; |
|
2010 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; |
|
2011 } |
|
2012 |
|
2013 get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); |
|
2014 |
|
2015 *returnintra = INT_MAX; |
|
2016 /* Count of the number of MBs tested so far this frame */ |
|
2017 x->mbs_tested_so_far++; |
|
2018 |
|
2019 x->skip = 0; |
|
2020 |
|
2021 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) |
|
2022 { |
|
2023 int this_rd = INT_MAX; |
|
2024 int disable_skip = 0; |
|
2025 int other_cost = 0; |
|
2026 int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; |
|
2027 |
|
2028 /* Test best rd so far against threshold for trying this mode. */ |
|
2029 if (best_mode.rd <= x->rd_threshes[mode_index]) |
|
2030 continue; |
|
2031 |
|
2032 if (this_ref_frame < 0) |
|
2033 continue; |
|
2034 |
|
2035 /* These variables hold are rolling total cost and distortion for |
|
2036 * this mode |
|
2037 */ |
|
2038 rd.rate2 = 0; |
|
2039 rd.distortion2 = 0; |
|
2040 |
|
2041 this_mode = vp8_mode_order[mode_index]; |
|
2042 |
|
2043 x->e_mbd.mode_info_context->mbmi.mode = this_mode; |
|
2044 x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; |
|
2045 |
|
2046 /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame, |
|
2047 * unless ARNR filtering is enabled in which case we want |
|
2048 * an unfiltered alternative |
|
2049 */ |
|
2050 if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) |
|
2051 { |
|
2052 if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) |
|
2053 continue; |
|
2054 } |
|
2055 |
|
2056 /* everything but intra */ |
|
2057 if (x->e_mbd.mode_info_context->mbmi.ref_frame) |
|
2058 { |
|
2059 x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; |
|
2060 x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; |
|
2061 x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; |
|
2062 |
|
2063 if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) |
|
2064 { |
|
2065 sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; |
|
2066 mode_mv = mode_mv_sb[sign_bias]; |
|
2067 best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; |
|
2068 } |
|
2069 } |
|
2070 |
|
2071 /* Check to see if the testing frequency for this mode is at its |
|
2072 * max If so then prevent it from being tested and increase the |
|
2073 * threshold for its testing |
|
2074 */ |
|
2075 if (x->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_index] > 1)) |
|
2076 { |
|
2077 if (x->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * x->mode_test_hit_counts[mode_index]) |
|
2078 { |
|
2079 /* Increase the threshold for coding this mode to make it |
|
2080 * less likely to be chosen |
|
2081 */ |
|
2082 x->rd_thresh_mult[mode_index] += 4; |
|
2083 |
|
2084 if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) |
|
2085 x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; |
|
2086 |
|
2087 x->rd_threshes[mode_index] = |
|
2088 (cpi->rd_baseline_thresh[mode_index] >> 7) * |
|
2089 x->rd_thresh_mult[mode_index]; |
|
2090 |
|
2091 continue; |
|
2092 } |
|
2093 } |
|
2094 |
|
2095 /* We have now reached the point where we are going to test the |
|
2096 * current mode so increment the counter for the number of times |
|
2097 * it has been tested |
|
2098 */ |
|
2099 x->mode_test_hit_counts[mode_index] ++; |
|
2100 |
|
2101 /* Experimental code. Special case for gf and arf zeromv modes. |
|
2102 * Increase zbin size to supress noise |
|
2103 */ |
|
2104 if (x->zbin_mode_boost_enabled) |
|
2105 { |
|
2106 if ( this_ref_frame == INTRA_FRAME ) |
|
2107 x->zbin_mode_boost = 0; |
|
2108 else |
|
2109 { |
|
2110 if (vp8_mode_order[mode_index] == ZEROMV) |
|
2111 { |
|
2112 if (this_ref_frame != LAST_FRAME) |
|
2113 x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; |
|
2114 else |
|
2115 x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; |
|
2116 } |
|
2117 else if (vp8_mode_order[mode_index] == SPLITMV) |
|
2118 x->zbin_mode_boost = 0; |
|
2119 else |
|
2120 x->zbin_mode_boost = MV_ZBIN_BOOST; |
|
2121 } |
|
2122 |
|
2123 vp8_update_zbin_extra(cpi, x); |
|
2124 } |
|
2125 |
|
2126 if(!uv_intra_done && this_ref_frame == INTRA_FRAME) |
|
2127 { |
|
2128 rd_pick_intra_mbuv_mode(x, &uv_intra_rate, |
|
2129 &uv_intra_rate_tokenonly, |
|
2130 &uv_intra_distortion); |
|
2131 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; |
|
2132 |
|
2133 /* |
|
2134 * Total of the eobs is used later to further adjust rate2. Since uv |
|
2135 * block's intra eobs will be overwritten when we check inter modes, |
|
2136 * we need to save uv_intra_tteob here. |
|
2137 */ |
|
2138 for (i = 16; i < 24; i++) |
|
2139 uv_intra_tteob += x->e_mbd.eobs[i]; |
|
2140 |
|
2141 uv_intra_done = 1; |
|
2142 } |
|
2143 |
|
2144 switch (this_mode) |
|
2145 { |
|
2146 case B_PRED: |
|
2147 { |
|
2148 int tmp_rd; |
|
2149 |
|
2150 /* Note the rate value returned here includes the cost of |
|
2151 * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED] |
|
2152 */ |
|
2153 int distortion; |
|
2154 tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion, best_mode.yrd); |
|
2155 rd.rate2 += rate; |
|
2156 rd.distortion2 += distortion; |
|
2157 |
|
2158 if(tmp_rd < best_mode.yrd) |
|
2159 { |
|
2160 rd.rate2 += uv_intra_rate; |
|
2161 rd.rate_uv = uv_intra_rate_tokenonly; |
|
2162 rd.distortion2 += uv_intra_distortion; |
|
2163 rd.distortion_uv = uv_intra_distortion; |
|
2164 } |
|
2165 else |
|
2166 { |
|
2167 this_rd = INT_MAX; |
|
2168 disable_skip = 1; |
|
2169 } |
|
2170 } |
|
2171 break; |
|
2172 |
|
2173 case SPLITMV: |
|
2174 { |
|
2175 int tmp_rd; |
|
2176 int this_rd_thresh; |
|
2177 int distortion; |
|
2178 |
|
2179 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ? |
|
2180 x->rd_threshes[THR_NEW1] : x->rd_threshes[THR_NEW3]; |
|
2181 this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ? |
|
2182 x->rd_threshes[THR_NEW2] : this_rd_thresh; |
|
2183 |
|
2184 tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv, |
|
2185 best_mode.yrd, mdcounts, |
|
2186 &rate, &rd.rate_y, &distortion, this_rd_thresh) ; |
|
2187 |
|
2188 rd.rate2 += rate; |
|
2189 rd.distortion2 += distortion; |
|
2190 |
|
2191 /* If even the 'Y' rd value of split is higher than best so far |
|
2192 * then dont bother looking at UV |
|
2193 */ |
|
2194 if (tmp_rd < best_mode.yrd) |
|
2195 { |
|
2196 /* Now work out UV cost and add it in */ |
|
2197 rd_inter4x4_uv(cpi, x, &rd.rate_uv, &rd.distortion_uv, cpi->common.full_pixel); |
|
2198 rd.rate2 += rd.rate_uv; |
|
2199 rd.distortion2 += rd.distortion_uv; |
|
2200 } |
|
2201 else |
|
2202 { |
|
2203 this_rd = INT_MAX; |
|
2204 disable_skip = 1; |
|
2205 } |
|
2206 } |
|
2207 break; |
|
2208 case DC_PRED: |
|
2209 case V_PRED: |
|
2210 case H_PRED: |
|
2211 case TM_PRED: |
|
2212 { |
|
2213 int distortion; |
|
2214 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
|
2215 |
|
2216 vp8_build_intra_predictors_mby_s(xd, |
|
2217 xd->dst.y_buffer - xd->dst.y_stride, |
|
2218 xd->dst.y_buffer - 1, |
|
2219 xd->dst.y_stride, |
|
2220 xd->predictor, |
|
2221 16); |
|
2222 macro_block_yrd(x, &rd.rate_y, &distortion) ; |
|
2223 rd.rate2 += rd.rate_y; |
|
2224 rd.distortion2 += distortion; |
|
2225 rd.rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode]; |
|
2226 rd.rate2 += uv_intra_rate; |
|
2227 rd.rate_uv = uv_intra_rate_tokenonly; |
|
2228 rd.distortion2 += uv_intra_distortion; |
|
2229 rd.distortion_uv = uv_intra_distortion; |
|
2230 } |
|
2231 break; |
|
2232 |
|
2233 case NEWMV: |
|
2234 { |
|
2235 int thissme; |
|
2236 int bestsme = INT_MAX; |
|
2237 int step_param = cpi->sf.first_step; |
|
2238 int further_steps; |
|
2239 int n; |
|
2240 int do_refine=1; /* If last step (1-away) of n-step search doesn't pick the center point as the best match, |
|
2241 we will do a final 1-away diamond refining search */ |
|
2242 |
|
2243 int sadpb = x->sadperbit16; |
|
2244 int_mv mvp_full; |
|
2245 |
|
2246 int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; |
|
2247 int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; |
|
2248 int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; |
|
2249 int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; |
|
2250 |
|
2251 int tmp_col_min = x->mv_col_min; |
|
2252 int tmp_col_max = x->mv_col_max; |
|
2253 int tmp_row_min = x->mv_row_min; |
|
2254 int tmp_row_max = x->mv_row_max; |
|
2255 |
|
2256 if(!saddone) |
|
2257 { |
|
2258 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); |
|
2259 saddone = 1; |
|
2260 } |
|
2261 |
|
2262 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, |
|
2263 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]); |
|
2264 |
|
2265 mvp_full.as_mv.col = mvp.as_mv.col>>3; |
|
2266 mvp_full.as_mv.row = mvp.as_mv.row>>3; |
|
2267 |
|
2268 /* Get intersection of UMV window and valid MV window to |
|
2269 * reduce # of checks in diamond search. |
|
2270 */ |
|
2271 if (x->mv_col_min < col_min ) |
|
2272 x->mv_col_min = col_min; |
|
2273 if (x->mv_col_max > col_max ) |
|
2274 x->mv_col_max = col_max; |
|
2275 if (x->mv_row_min < row_min ) |
|
2276 x->mv_row_min = row_min; |
|
2277 if (x->mv_row_max > row_max ) |
|
2278 x->mv_row_max = row_max; |
|
2279 |
|
2280 /* adjust search range according to sr from mv prediction */ |
|
2281 if(sr > step_param) |
|
2282 step_param = sr; |
|
2283 |
|
2284 /* Initial step/diamond search */ |
|
2285 { |
|
2286 bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv, |
|
2287 step_param, sadpb, &num00, |
|
2288 &cpi->fn_ptr[BLOCK_16X16], |
|
2289 x->mvcost, &best_ref_mv); |
|
2290 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
|
2291 |
|
2292 /* Further step/diamond searches as necessary */ |
|
2293 n = 0; |
|
2294 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; |
|
2295 |
|
2296 n = num00; |
|
2297 num00 = 0; |
|
2298 |
|
2299 /* If there won't be more n-step search, check to see if refining search is needed. */ |
|
2300 if (n > further_steps) |
|
2301 do_refine = 0; |
|
2302 |
|
2303 while (n < further_steps) |
|
2304 { |
|
2305 n++; |
|
2306 |
|
2307 if (num00) |
|
2308 num00--; |
|
2309 else |
|
2310 { |
|
2311 thissme = cpi->diamond_search_sad(x, b, d, &mvp_full, |
|
2312 &d->bmi.mv, step_param + n, sadpb, &num00, |
|
2313 &cpi->fn_ptr[BLOCK_16X16], x->mvcost, |
|
2314 &best_ref_mv); |
|
2315 |
|
2316 /* check to see if refining search is needed. */ |
|
2317 if (num00 > (further_steps-n)) |
|
2318 do_refine = 0; |
|
2319 |
|
2320 if (thissme < bestsme) |
|
2321 { |
|
2322 bestsme = thissme; |
|
2323 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
|
2324 } |
|
2325 else |
|
2326 { |
|
2327 d->bmi.mv.as_int = mode_mv[NEWMV].as_int; |
|
2328 } |
|
2329 } |
|
2330 } |
|
2331 } |
|
2332 |
|
2333 /* final 1-away diamond refining search */ |
|
2334 if (do_refine == 1) |
|
2335 { |
|
2336 int search_range; |
|
2337 |
|
2338 search_range = 8; |
|
2339 |
|
2340 thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb, |
|
2341 search_range, &cpi->fn_ptr[BLOCK_16X16], |
|
2342 x->mvcost, &best_ref_mv); |
|
2343 |
|
2344 if (thissme < bestsme) |
|
2345 { |
|
2346 bestsme = thissme; |
|
2347 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
|
2348 } |
|
2349 else |
|
2350 { |
|
2351 d->bmi.mv.as_int = mode_mv[NEWMV].as_int; |
|
2352 } |
|
2353 } |
|
2354 |
|
2355 x->mv_col_min = tmp_col_min; |
|
2356 x->mv_col_max = tmp_col_max; |
|
2357 x->mv_row_min = tmp_row_min; |
|
2358 x->mv_row_max = tmp_row_max; |
|
2359 |
|
2360 if (bestsme < INT_MAX) |
|
2361 { |
|
2362 int dis; /* TODO: use dis in distortion calculation later. */ |
|
2363 unsigned int sse; |
|
2364 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, |
|
2365 x->errorperbit, |
|
2366 &cpi->fn_ptr[BLOCK_16X16], |
|
2367 x->mvcost, &dis, &sse); |
|
2368 } |
|
2369 |
|
2370 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
|
2371 |
|
2372 /* Add the new motion vector cost to our rolling cost variable */ |
|
2373 rd.rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96); |
|
2374 } |
|
2375 |
|
2376 case NEARESTMV: |
|
2377 case NEARMV: |
|
2378 /* Clip "next_nearest" so that it does not extend to far out |
|
2379 * of image |
|
2380 */ |
|
2381 vp8_clamp_mv2(&mode_mv[this_mode], xd); |
|
2382 |
|
2383 /* Do not bother proceeding if the vector (from newmv, nearest |
|
2384 * or near) is 0,0 as this should then be coded using the zeromv |
|
2385 * mode. |
|
2386 */ |
|
2387 if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && (mode_mv[this_mode].as_int == 0)) |
|
2388 continue; |
|
2389 |
|
2390 case ZEROMV: |
|
2391 |
|
2392 /* Trap vectors that reach beyond the UMV borders |
|
2393 * Note that ALL New MV, Nearest MV Near MV and Zero MV code |
|
2394 * drops through to this point because of the lack of break |
|
2395 * statements in the previous two cases. |
|
2396 */ |
|
2397 if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || |
|
2398 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) |
|
2399 continue; |
|
2400 |
|
2401 vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); |
|
2402 this_rd = evaluate_inter_mode_rd(mdcounts, &rd, |
|
2403 &disable_skip, cpi, x); |
|
2404 break; |
|
2405 |
|
2406 default: |
|
2407 break; |
|
2408 } |
|
2409 |
|
2410 this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost, |
|
2411 disable_skip, uv_intra_tteob, |
|
2412 intra_rd_penalty, cpi, x); |
|
2413 |
|
2414 /* Keep record of best intra distortion */ |
|
2415 if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && |
|
2416 (this_rd < best_mode.intra_rd) ) |
|
2417 { |
|
2418 best_mode.intra_rd = this_rd; |
|
2419 *returnintra = rd.distortion2 ; |
|
2420 } |
|
2421 #if CONFIG_TEMPORAL_DENOISING |
|
2422 if (cpi->oxcf.noise_sensitivity) |
|
2423 { |
|
2424 unsigned int sse; |
|
2425 vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&sse, |
|
2426 mode_mv[this_mode]); |
|
2427 |
|
2428 if (sse < best_rd_sse) |
|
2429 best_rd_sse = sse; |
|
2430 |
|
2431 /* Store for later use by denoiser. */ |
|
2432 if (this_mode == ZEROMV && sse < zero_mv_sse ) |
|
2433 { |
|
2434 zero_mv_sse = sse; |
|
2435 x->best_zeromv_reference_frame = |
|
2436 x->e_mbd.mode_info_context->mbmi.ref_frame; |
|
2437 } |
|
2438 |
|
2439 /* Store the best NEWMV in x for later use in the denoiser. */ |
|
2440 if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && |
|
2441 sse < best_sse) |
|
2442 { |
|
2443 best_sse = sse; |
|
2444 vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&best_sse, |
|
2445 mode_mv[this_mode]); |
|
2446 x->best_sse_inter_mode = NEWMV; |
|
2447 x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv; |
|
2448 x->need_to_clamp_best_mvs = |
|
2449 x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs; |
|
2450 x->best_reference_frame = |
|
2451 x->e_mbd.mode_info_context->mbmi.ref_frame; |
|
2452 } |
|
2453 } |
|
2454 #endif |
|
2455 |
|
2456 /* Did this mode help.. i.i is it the new best mode */ |
|
2457 if (this_rd < best_mode.rd || x->skip) |
|
2458 { |
|
2459 /* Note index of best mode so far */ |
|
2460 best_mode_index = mode_index; |
|
2461 *returnrate = rd.rate2; |
|
2462 *returndistortion = rd.distortion2; |
|
2463 if (this_mode <= B_PRED) |
|
2464 { |
|
2465 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; |
|
2466 /* required for left and above block mv */ |
|
2467 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
|
2468 } |
|
2469 update_best_mode(&best_mode, this_rd, &rd, other_cost, x); |
|
2470 |
|
2471 |
|
2472 /* Testing this mode gave rise to an improvement in best error |
|
2473 * score. Lower threshold a bit for next time |
|
2474 */ |
|
2475 x->rd_thresh_mult[mode_index] = |
|
2476 (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? |
|
2477 x->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; |
|
2478 } |
|
2479 |
|
2480 /* If the mode did not help improve the best error case then raise |
|
2481 * the threshold for testing that mode next time around. |
|
2482 */ |
|
2483 else |
|
2484 { |
|
2485 x->rd_thresh_mult[mode_index] += 4; |
|
2486 |
|
2487 if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) |
|
2488 x->rd_thresh_mult[mode_index] = MAX_THRESHMULT; |
|
2489 } |
|
2490 x->rd_threshes[mode_index] = |
|
2491 (cpi->rd_baseline_thresh[mode_index] >> 7) * |
|
2492 x->rd_thresh_mult[mode_index]; |
|
2493 |
|
2494 if (x->skip) |
|
2495 break; |
|
2496 |
|
2497 } |
|
2498 |
|
2499 /* Reduce the activation RD thresholds for the best choice mode */ |
|
2500 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) |
|
2501 { |
|
2502 int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 2); |
|
2503 |
|
2504 x->rd_thresh_mult[best_mode_index] = |
|
2505 (x->rd_thresh_mult[best_mode_index] >= |
|
2506 (MIN_THRESHMULT + best_adjustment)) ? |
|
2507 x->rd_thresh_mult[best_mode_index] - best_adjustment : |
|
2508 MIN_THRESHMULT; |
|
2509 x->rd_threshes[best_mode_index] = |
|
2510 (cpi->rd_baseline_thresh[best_mode_index] >> 7) * |
|
2511 x->rd_thresh_mult[best_mode_index]; |
|
2512 } |
|
2513 |
|
2514 #if CONFIG_TEMPORAL_DENOISING |
|
2515 if (cpi->oxcf.noise_sensitivity) |
|
2516 { |
|
2517 if (x->best_sse_inter_mode == DC_PRED) |
|
2518 { |
|
2519 /* No best MV found. */ |
|
2520 x->best_sse_inter_mode = best_mode.mbmode.mode; |
|
2521 x->best_sse_mv = best_mode.mbmode.mv; |
|
2522 x->need_to_clamp_best_mvs = best_mode.mbmode.need_to_clamp_mvs; |
|
2523 x->best_reference_frame = best_mode.mbmode.ref_frame; |
|
2524 best_sse = best_rd_sse; |
|
2525 } |
|
2526 vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, |
|
2527 recon_yoffset, recon_uvoffset); |
|
2528 |
|
2529 |
|
2530 /* Reevaluate ZEROMV after denoising. */ |
|
2531 if (best_mode.mbmode.ref_frame == INTRA_FRAME && |
|
2532 x->best_zeromv_reference_frame != INTRA_FRAME) |
|
2533 { |
|
2534 int this_rd = INT_MAX; |
|
2535 int disable_skip = 0; |
|
2536 int other_cost = 0; |
|
2537 int this_ref_frame = x->best_zeromv_reference_frame; |
|
2538 rd.rate2 = x->ref_frame_cost[this_ref_frame] + |
|
2539 vp8_cost_mv_ref(ZEROMV, mdcounts); |
|
2540 rd.distortion2 = 0; |
|
2541 |
|
2542 /* set up the proper prediction buffers for the frame */ |
|
2543 x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; |
|
2544 x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; |
|
2545 x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; |
|
2546 x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; |
|
2547 |
|
2548 x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; |
|
2549 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; |
|
2550 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
|
2551 |
|
2552 this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x); |
|
2553 this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost, |
|
2554 disable_skip, uv_intra_tteob, |
|
2555 intra_rd_penalty, cpi, x); |
|
2556 if (this_rd < best_mode.rd || x->skip) |
|
2557 { |
|
2558 /* Note index of best mode so far */ |
|
2559 best_mode_index = mode_index; |
|
2560 *returnrate = rd.rate2; |
|
2561 *returndistortion = rd.distortion2; |
|
2562 update_best_mode(&best_mode, this_rd, &rd, other_cost, x); |
|
2563 } |
|
2564 } |
|
2565 |
|
2566 } |
|
2567 #endif |
|
2568 |
|
2569 if (cpi->is_src_frame_alt_ref && |
|
2570 (best_mode.mbmode.mode != ZEROMV || best_mode.mbmode.ref_frame != ALTREF_FRAME)) |
|
2571 { |
|
2572 x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; |
|
2573 x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; |
|
2574 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
|
2575 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; |
|
2576 x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = |
|
2577 (cpi->common.mb_no_coeff_skip); |
|
2578 x->e_mbd.mode_info_context->mbmi.partitioning = 0; |
|
2579 return; |
|
2580 } |
|
2581 |
|
2582 |
|
2583 /* macroblock modes */ |
|
2584 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mode.mbmode, sizeof(MB_MODE_INFO)); |
|
2585 |
|
2586 if (best_mode.mbmode.mode == B_PRED) |
|
2587 { |
|
2588 for (i = 0; i < 16; i++) |
|
2589 xd->mode_info_context->bmi[i].as_mode = best_mode.bmodes[i].as_mode; |
|
2590 } |
|
2591 |
|
2592 if (best_mode.mbmode.mode == SPLITMV) |
|
2593 { |
|
2594 for (i = 0; i < 16; i++) |
|
2595 xd->mode_info_context->bmi[i].mv.as_int = best_mode.bmodes[i].mv.as_int; |
|
2596 |
|
2597 vpx_memcpy(x->partition_info, &best_mode.partition, sizeof(PARTITION_INFO)); |
|
2598 |
|
2599 x->e_mbd.mode_info_context->mbmi.mv.as_int = |
|
2600 x->partition_info->bmi[15].mv.as_int; |
|
2601 } |
|
2602 |
|
2603 if (sign_bias |
|
2604 != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) |
|
2605 best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; |
|
2606 |
|
2607 rd_update_mvcount(x, &best_ref_mv); |
|
2608 } |
|
2609 |
|
2610 void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate_) |
|
2611 { |
|
2612 int error4x4, error16x16; |
|
2613 int rate4x4, rate16x16 = 0, rateuv; |
|
2614 int dist4x4, dist16x16, distuv; |
|
2615 int rate; |
|
2616 int rate4x4_tokenonly = 0; |
|
2617 int rate16x16_tokenonly = 0; |
|
2618 int rateuv_tokenonly = 0; |
|
2619 |
|
2620 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
|
2621 |
|
2622 rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv); |
|
2623 rate = rateuv; |
|
2624 |
|
2625 error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly, |
|
2626 &dist16x16); |
|
2627 |
|
2628 error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly, |
|
2629 &dist4x4, error16x16); |
|
2630 |
|
2631 if (error4x4 < error16x16) |
|
2632 { |
|
2633 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; |
|
2634 rate += rate4x4; |
|
2635 } |
|
2636 else |
|
2637 { |
|
2638 rate += rate16x16; |
|
2639 } |
|
2640 |
|
2641 *rate_ = rate; |
|
2642 } |