Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(409)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_encodeframe.c

Issue 111463005: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_dct.c ('k') | source/libvpx/vp9/encoder/vp9_encodeintra.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <limits.h> 11 #include <limits.h>
12 #include <math.h> 12 #include <math.h>
13 #include <stdio.h> 13 #include <stdio.h>
14 14
15 #include "./vp9_rtcd.h" 15 #include "./vp9_rtcd.h"
16 #include "./vpx_config.h" 16 #include "./vpx_config.h"
17 17
18 #include "vpx_ports/vpx_timer.h" 18 #include "vpx_ports/vpx_timer.h"
19 19
20 #include "vp9/common/vp9_common.h" 20 #include "vp9/common/vp9_common.h"
21 #include "vp9/common/vp9_entropy.h" 21 #include "vp9/common/vp9_entropy.h"
22 #include "vp9/common/vp9_entropymode.h" 22 #include "vp9/common/vp9_entropymode.h"
23 #include "vp9/common/vp9_extend.h"
24 #include "vp9/common/vp9_findnearmv.h" 23 #include "vp9/common/vp9_findnearmv.h"
25 #include "vp9/common/vp9_idct.h" 24 #include "vp9/common/vp9_idct.h"
26 #include "vp9/common/vp9_mvref_common.h" 25 #include "vp9/common/vp9_mvref_common.h"
27 #include "vp9/common/vp9_pred_common.h" 26 #include "vp9/common/vp9_pred_common.h"
28 #include "vp9/common/vp9_quant_common.h" 27 #include "vp9/common/vp9_quant_common.h"
29 #include "vp9/common/vp9_reconintra.h" 28 #include "vp9/common/vp9_reconintra.h"
30 #include "vp9/common/vp9_reconinter.h" 29 #include "vp9/common/vp9_reconinter.h"
31 #include "vp9/common/vp9_seg_common.h" 30 #include "vp9/common/vp9_seg_common.h"
32 #include "vp9/common/vp9_tile_common.h" 31 #include "vp9/common/vp9_tile_common.h"
33 #include "vp9/encoder/vp9_encodeframe.h" 32 #include "vp9/encoder/vp9_encodeframe.h"
34 #include "vp9/encoder/vp9_encodeintra.h"
35 #include "vp9/encoder/vp9_encodemb.h" 33 #include "vp9/encoder/vp9_encodemb.h"
36 #include "vp9/encoder/vp9_encodemv.h" 34 #include "vp9/encoder/vp9_encodemv.h"
35 #include "vp9/encoder/vp9_extend.h"
37 #include "vp9/encoder/vp9_onyx_int.h" 36 #include "vp9/encoder/vp9_onyx_int.h"
38 #include "vp9/encoder/vp9_rdopt.h" 37 #include "vp9/encoder/vp9_rdopt.h"
39 #include "vp9/encoder/vp9_segmentation.h" 38 #include "vp9/encoder/vp9_segmentation.h"
40 #include "vp9/common/vp9_systemdependent.h" 39 #include "vp9/common/vp9_systemdependent.h"
41 #include "vp9/encoder/vp9_tokenize.h" 40 #include "vp9/encoder/vp9_tokenize.h"
42 #include "vp9/encoder/vp9_vaq.h" 41 #include "vp9/encoder/vp9_vaq.h"
43 42
44 43
45 #define DBG_PRNT_SEGMAP 0 44 #define DBG_PRNT_SEGMAP 0
46 45
47 46
48 // #define ENC_DEBUG 47 // #define ENC_DEBUG
49 #ifdef ENC_DEBUG 48 #ifdef ENC_DEBUG
50 int enc_debug = 0; 49 int enc_debug = 0;
51 #endif 50 #endif
52 51
53 static INLINE uint8_t *get_sb_index(MACROBLOCKD *xd, BLOCK_SIZE subsize) { 52 static INLINE uint8_t *get_sb_index(MACROBLOCK *x, BLOCK_SIZE subsize) {
54 switch (subsize) { 53 switch (subsize) {
55 case BLOCK_64X64: 54 case BLOCK_64X64:
56 case BLOCK_64X32: 55 case BLOCK_64X32:
57 case BLOCK_32X64: 56 case BLOCK_32X64:
58 case BLOCK_32X32: 57 case BLOCK_32X32:
59 return &xd->sb_index; 58 return &x->sb_index;
60 case BLOCK_32X16: 59 case BLOCK_32X16:
61 case BLOCK_16X32: 60 case BLOCK_16X32:
62 case BLOCK_16X16: 61 case BLOCK_16X16:
63 return &xd->mb_index; 62 return &x->mb_index;
64 case BLOCK_16X8: 63 case BLOCK_16X8:
65 case BLOCK_8X16: 64 case BLOCK_8X16:
66 case BLOCK_8X8: 65 case BLOCK_8X8:
67 return &xd->b_index; 66 return &x->b_index;
68 case BLOCK_8X4: 67 case BLOCK_8X4:
69 case BLOCK_4X8: 68 case BLOCK_4X8:
70 case BLOCK_4X4: 69 case BLOCK_4X4:
71 return &xd->ab_index; 70 return &x->ab_index;
72 default: 71 default:
73 assert(0); 72 assert(0);
74 return NULL; 73 return NULL;
75 } 74 }
76 } 75 }
77 76
78 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled, 77 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled,
79 int mi_row, int mi_col, BLOCK_SIZE bsize); 78 int mi_row, int mi_col, BLOCK_SIZE bsize);
80 79
81 static void adjust_act_zbin(VP9_COMP *cpi, MACROBLOCK *x); 80 static void adjust_act_zbin(VP9_COMP *cpi, MACROBLOCK *x);
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 353
355 x->rdmult = (unsigned int) (((int64_t) x->rdmult * b + (a >> 1)) / a); 354 x->rdmult = (unsigned int) (((int64_t) x->rdmult * b + (a >> 1)) / a);
356 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv); 355 x->errorperbit = x->rdmult * 100 / (110 * x->rddiv);
357 x->errorperbit += (x->errorperbit == 0); 356 x->errorperbit += (x->errorperbit == 0);
358 #endif 357 #endif
359 358
360 // Activity based Zbin adjustment 359 // Activity based Zbin adjustment
361 adjust_act_zbin(cpi, x); 360 adjust_act_zbin(cpi, x);
362 } 361 }
363 362
363 // Select a segment for the current SB64
364 static void select_in_frame_q_segment(VP9_COMP *cpi,
365 int mi_row, int mi_col,
366 int output_enabled, int projected_rate) {
367 VP9_COMMON * const cm = &cpi->common;
368 int target_rate = cpi->rc.sb64_target_rate << 8; // convert to bits << 8
369
370 const int mi_offset = mi_row * cm->mi_cols + mi_col;
371 const int bw = 1 << mi_width_log2(BLOCK_64X64);
372 const int bh = 1 << mi_height_log2(BLOCK_64X64);
373 const int xmis = MIN(cm->mi_cols - mi_col, bw);
374 const int ymis = MIN(cm->mi_rows - mi_row, bh);
375 int complexity_metric = 64;
376 int x, y;
377
378 unsigned char segment;
379
380 if (!output_enabled) {
381 segment = 0;
382 } else {
383 // Rate depends on fraction of a SB64 in frame (xmis * ymis / bw * bh).
384 // It is converted to bits * 256 units
385 target_rate = (cpi->rc.sb64_target_rate * xmis * ymis * 256) / (bw * bh);
386
387 if (projected_rate < (target_rate / 4)) {
388 segment = 2;
389 } else if (projected_rate < (target_rate / 2)) {
390 segment = 1;
391 } else {
392 segment = 0;
393 }
394
395 complexity_metric =
396 clamp((int)((projected_rate * 64) / target_rate), 16, 255);
397 }
398
399 // Fill in the entires in the segment map corresponding to this SB64
400 for (y = 0; y < ymis; y++) {
401 for (x = 0; x < xmis; x++) {
402 cpi->segmentation_map[mi_offset + y * cm->mi_cols + x] = segment;
403 cpi->complexity_map[mi_offset + y * cm->mi_cols + x] =
404 (unsigned char)complexity_metric;
405 }
406 }
407 }
408
364 static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, 409 static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
365 BLOCK_SIZE bsize, int output_enabled) { 410 BLOCK_SIZE bsize, int output_enabled) {
366 int i, x_idx, y; 411 int i, x_idx, y;
367 VP9_COMMON *const cm = &cpi->common; 412 VP9_COMMON *const cm = &cpi->common;
368 MACROBLOCK *const x = &cpi->mb; 413 MACROBLOCK *const x = &cpi->mb;
369 MACROBLOCKD *const xd = &x->e_mbd; 414 MACROBLOCKD *const xd = &x->e_mbd;
415 struct macroblock_plane *const p = x->plane;
416 struct macroblockd_plane *const pd = xd->plane;
370 MODE_INFO *mi = &ctx->mic; 417 MODE_INFO *mi = &ctx->mic;
371 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; 418 MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi;
372 MODE_INFO *mi_addr = xd->mi_8x8[0]; 419 MODE_INFO *mi_addr = xd->mi_8x8[0];
373 420
374 int mb_mode_index = ctx->best_mode_index; 421 int mb_mode_index = ctx->best_mode_index;
375 const int mis = cm->mode_info_stride; 422 const int mis = cm->mode_info_stride;
376 const int mi_width = num_8x8_blocks_wide_lookup[bsize]; 423 const int mi_width = num_8x8_blocks_wide_lookup[bsize];
377 const int mi_height = num_8x8_blocks_high_lookup[bsize]; 424 const int mi_height = num_8x8_blocks_high_lookup[bsize];
425 int max_plane;
378 426
379 assert(mi->mbmi.mode < MB_MODE_COUNT); 427 assert(mi->mbmi.mode < MB_MODE_COUNT);
380 assert(mi->mbmi.ref_frame[0] < MAX_REF_FRAMES); 428 assert(mi->mbmi.ref_frame[0] < MAX_REF_FRAMES);
381 assert(mi->mbmi.ref_frame[1] < MAX_REF_FRAMES); 429 assert(mi->mbmi.ref_frame[1] < MAX_REF_FRAMES);
382 assert(mi->mbmi.sb_type == bsize); 430 assert(mi->mbmi.sb_type == bsize);
383 431
432 // For in frame adaptive Q copy over the chosen segment id into the
433 // mode innfo context for the chosen mode / partition.
434 if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && output_enabled)
435 mi->mbmi.segment_id = xd->mi_8x8[0]->mbmi.segment_id;
436
384 *mi_addr = *mi; 437 *mi_addr = *mi;
385 438
439 max_plane = is_inter_block(mbmi) ? MAX_MB_PLANE : 1;
440 for (i = 0; i < max_plane; ++i) {
441 p[i].coeff = ctx->coeff_pbuf[i][1];
442 p[i].qcoeff = ctx->qcoeff_pbuf[i][1];
443 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
444 p[i].eobs = ctx->eobs_pbuf[i][1];
445 }
446
447 for (i = max_plane; i < MAX_MB_PLANE; ++i) {
448 p[i].coeff = ctx->coeff_pbuf[i][2];
449 p[i].qcoeff = ctx->qcoeff_pbuf[i][2];
450 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2];
451 p[i].eobs = ctx->eobs_pbuf[i][2];
452 }
453
386 // Restore the coding context of the MB to that that was in place 454 // Restore the coding context of the MB to that that was in place
387 // when the mode was picked for it 455 // when the mode was picked for it
388 for (y = 0; y < mi_height; y++) 456 for (y = 0; y < mi_height; y++)
389 for (x_idx = 0; x_idx < mi_width; x_idx++) 457 for (x_idx = 0; x_idx < mi_width; x_idx++)
390 if ((xd->mb_to_right_edge >> (3 + MI_SIZE_LOG2)) + mi_width > x_idx 458 if ((xd->mb_to_right_edge >> (3 + MI_SIZE_LOG2)) + mi_width > x_idx
391 && (xd->mb_to_bottom_edge >> (3 + MI_SIZE_LOG2)) + mi_height > y) 459 && (xd->mb_to_bottom_edge >> (3 + MI_SIZE_LOG2)) + mi_height > y) {
392 xd->mi_8x8[x_idx + y * mis] = mi_addr; 460 xd->mi_8x8[x_idx + y * mis] = mi_addr;
461 }
393 462
394 if (cpi->sf.variance_adaptive_quantization) { 463 if ((cpi->oxcf.aq_mode == VARIANCE_AQ) ||
464 (cpi->oxcf.aq_mode == COMPLEXITY_AQ)) {
395 vp9_mb_init_quantizer(cpi, x); 465 vp9_mb_init_quantizer(cpi, x);
396 } 466 }
397 467
398 // FIXME(rbultje) I'm pretty sure this should go to the end of this block 468 // FIXME(rbultje) I'm pretty sure this should go to the end of this block
399 // (i.e. after the output_enabled) 469 // (i.e. after the output_enabled)
400 if (bsize < BLOCK_32X32) { 470 if (bsize < BLOCK_32X32) {
401 if (bsize < BLOCK_16X16) 471 if (bsize < BLOCK_16X16)
402 ctx->tx_rd_diff[ALLOW_16X16] = ctx->tx_rd_diff[ALLOW_8X8]; 472 ctx->tx_rd_diff[ALLOW_16X16] = ctx->tx_rd_diff[ALLOW_8X8];
403 ctx->tx_rd_diff[ALLOW_32X32] = ctx->tx_rd_diff[ALLOW_16X16]; 473 ctx->tx_rd_diff[ALLOW_32X32] = ctx->tx_rd_diff[ALLOW_16X16];
404 } 474 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 mbmi->best_mv[0].as_int = best_mv[0].as_int; 524 mbmi->best_mv[0].as_int = best_mv[0].as_int;
455 mbmi->best_mv[1].as_int = best_mv[1].as_int; 525 mbmi->best_mv[1].as_int = best_mv[1].as_int;
456 vp9_update_mv_count(cpi, x, best_mv); 526 vp9_update_mv_count(cpi, x, best_mv);
457 } 527 }
458 528
459 if (cm->mcomp_filter_type == SWITCHABLE && is_inter_mode(mbmi->mode)) { 529 if (cm->mcomp_filter_type == SWITCHABLE && is_inter_mode(mbmi->mode)) {
460 const int ctx = vp9_get_pred_context_switchable_interp(xd); 530 const int ctx = vp9_get_pred_context_switchable_interp(xd);
461 ++cm->counts.switchable_interp[ctx][mbmi->interp_filter]; 531 ++cm->counts.switchable_interp[ctx][mbmi->interp_filter];
462 } 532 }
463 533
464 cpi->rd_comp_pred_diff[SINGLE_PREDICTION_ONLY] += ctx->single_pred_diff; 534 cpi->rd_comp_pred_diff[SINGLE_REFERENCE] += ctx->single_pred_diff;
465 cpi->rd_comp_pred_diff[COMP_PREDICTION_ONLY] += ctx->comp_pred_diff; 535 cpi->rd_comp_pred_diff[COMPOUND_REFERENCE] += ctx->comp_pred_diff;
466 cpi->rd_comp_pred_diff[HYBRID_PREDICTION] += ctx->hybrid_pred_diff; 536 cpi->rd_comp_pred_diff[REFERENCE_MODE_SELECT] += ctx->hybrid_pred_diff;
467 537
468 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) 538 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++)
469 cpi->rd_filter_diff[i] += ctx->best_filter_diff[i]; 539 cpi->rd_filter_diff[i] += ctx->best_filter_diff[i];
470 } 540 }
471 } 541 }
472 542
473 void vp9_setup_src_planes(MACROBLOCK *x, const YV12_BUFFER_CONFIG *src, 543 void vp9_setup_src_planes(MACROBLOCK *x, const YV12_BUFFER_CONFIG *src,
474 int mi_row, int mi_col) { 544 int mi_row, int mi_col) {
475 uint8_t *const buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer, 545 uint8_t *const buffers[4] = {src->y_buffer, src->u_buffer, src->v_buffer,
476 src->alpha_buffer}; 546 src->alpha_buffer};
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 603
534 /* set up source buffers */ 604 /* set up source buffers */
535 vp9_setup_src_planes(x, cpi->Source, mi_row, mi_col); 605 vp9_setup_src_planes(x, cpi->Source, mi_row, mi_col);
536 606
537 /* R/D setup */ 607 /* R/D setup */
538 x->rddiv = cpi->RDDIV; 608 x->rddiv = cpi->RDDIV;
539 x->rdmult = cpi->RDMULT; 609 x->rdmult = cpi->RDMULT;
540 610
541 /* segment ID */ 611 /* segment ID */
542 if (seg->enabled) { 612 if (seg->enabled) {
543 if (!cpi->sf.variance_adaptive_quantization) { 613 if (cpi->oxcf.aq_mode != VARIANCE_AQ) {
544 uint8_t *map = seg->update_map ? cpi->segmentation_map 614 uint8_t *map = seg->update_map ? cpi->segmentation_map
545 : cm->last_frame_seg_map; 615 : cm->last_frame_seg_map;
546 mbmi->segment_id = vp9_get_segment_id(cm, map, bsize, mi_row, mi_col); 616 mbmi->segment_id = vp9_get_segment_id(cm, map, bsize, mi_row, mi_col);
547 } 617 }
548 vp9_mb_init_quantizer(cpi, x); 618 vp9_mb_init_quantizer(cpi, x);
549 619
550 if (seg->enabled && cpi->seg0_cnt > 0 620 if (seg->enabled && cpi->seg0_cnt > 0
551 && !vp9_segfeature_active(seg, 0, SEG_LVL_REF_FRAME) 621 && !vp9_segfeature_active(seg, 0, SEG_LVL_REF_FRAME)
552 && vp9_segfeature_active(seg, 1, SEG_LVL_REF_FRAME)) { 622 && vp9_segfeature_active(seg, 1, SEG_LVL_REF_FRAME)) {
553 cpi->seg0_progress = (cpi->seg0_idx << 16) / cpi->seg0_cnt; 623 cpi->seg0_progress = (cpi->seg0_idx << 16) / cpi->seg0_cnt;
(...skipping 17 matching lines...) Expand all
571 } 641 }
572 642
573 static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile, 643 static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
574 int mi_row, int mi_col, 644 int mi_row, int mi_col,
575 int *totalrate, int64_t *totaldist, 645 int *totalrate, int64_t *totaldist,
576 BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx, 646 BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx,
577 int64_t best_rd) { 647 int64_t best_rd) {
578 VP9_COMMON *const cm = &cpi->common; 648 VP9_COMMON *const cm = &cpi->common;
579 MACROBLOCK *const x = &cpi->mb; 649 MACROBLOCK *const x = &cpi->mb;
580 MACROBLOCKD *const xd = &x->e_mbd; 650 MACROBLOCKD *const xd = &x->e_mbd;
651 struct macroblock_plane *const p = x->plane;
652 struct macroblockd_plane *const pd = xd->plane;
653 int i;
581 int orig_rdmult = x->rdmult; 654 int orig_rdmult = x->rdmult;
582 double rdmult_ratio; 655 double rdmult_ratio;
583 656
584 vp9_clear_system_state(); // __asm emms; 657 vp9_clear_system_state(); // __asm emms;
585 rdmult_ratio = 1.0; // avoid uninitialized warnings 658 rdmult_ratio = 1.0; // avoid uninitialized warnings
586 659
587 // Use the lower precision, but faster, 32x32 fdct for mode selection. 660 // Use the lower precision, but faster, 32x32 fdct for mode selection.
588 x->use_lp32x32fdct = 1; 661 x->use_lp32x32fdct = 1;
589 662
590 if (bsize < BLOCK_8X8) { 663 if (bsize < BLOCK_8X8) {
591 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0 664 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0
592 // there is nothing to be done. 665 // there is nothing to be done.
593 if (xd->ab_index != 0) { 666 if (x->ab_index != 0) {
594 *totalrate = 0; 667 *totalrate = 0;
595 *totaldist = 0; 668 *totaldist = 0;
596 return; 669 return;
597 } 670 }
598 } 671 }
599 672
600 set_offsets(cpi, tile, mi_row, mi_col, bsize); 673 set_offsets(cpi, tile, mi_row, mi_col, bsize);
601 xd->mi_8x8[0]->mbmi.sb_type = bsize; 674 xd->mi_8x8[0]->mbmi.sb_type = bsize;
602 675
676 for (i = 0; i < MAX_MB_PLANE; ++i) {
677 p[i].coeff = ctx->coeff_pbuf[i][0];
678 p[i].qcoeff = ctx->qcoeff_pbuf[i][0];
679 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][0];
680 p[i].eobs = ctx->eobs_pbuf[i][0];
681 }
682 ctx->is_coded = 0;
683 x->skip_recode = 0;
684
603 // Set to zero to make sure we do not use the previous encoded frame stats 685 // Set to zero to make sure we do not use the previous encoded frame stats
604 xd->mi_8x8[0]->mbmi.skip_coeff = 0; 686 xd->mi_8x8[0]->mbmi.skip_coeff = 0;
605 687
606 x->source_variance = get_sby_perpixel_variance(cpi, x, bsize); 688 x->source_variance = get_sby_perpixel_variance(cpi, x, bsize);
607 689
608 if (cpi->sf.variance_adaptive_quantization) { 690 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
609 int energy; 691 int energy;
610 if (bsize <= BLOCK_16X16) { 692 if (bsize <= BLOCK_16X16) {
611 energy = x->mb_energy; 693 energy = x->mb_energy;
612 } else { 694 } else {
613 energy = vp9_block_energy(cpi, x, bsize); 695 energy = vp9_block_energy(cpi, x, bsize);
614 } 696 }
615 697
616 xd->mi_8x8[0]->mbmi.segment_id = vp9_vaq_segment_id(energy); 698 xd->mi_8x8[0]->mbmi.segment_id = vp9_vaq_segment_id(energy);
617 rdmult_ratio = vp9_vaq_rdmult_ratio(energy); 699 rdmult_ratio = vp9_vaq_rdmult_ratio(energy);
618 vp9_mb_init_quantizer(cpi, x); 700 vp9_mb_init_quantizer(cpi, x);
619 } 701 }
620 702
621 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) 703 if (cpi->oxcf.tuning == VP8_TUNE_SSIM)
622 vp9_activity_masking(cpi, x); 704 vp9_activity_masking(cpi, x);
623 705
624 if (cpi->sf.variance_adaptive_quantization) { 706 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
625 vp9_clear_system_state(); // __asm emms; 707 vp9_clear_system_state(); // __asm emms;
626 x->rdmult = round(x->rdmult * rdmult_ratio); 708 x->rdmult = round(x->rdmult * rdmult_ratio);
709 } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
710 const int mi_offset = mi_row * cm->mi_cols + mi_col;
711 unsigned char complexity = cpi->complexity_map[mi_offset];
712 const int is_edge = (mi_row == 0) || (mi_row == (cm->mi_rows - 1)) ||
713 (mi_col == 0) || (mi_col == (cm->mi_cols - 1));
714
715 if (!is_edge && (complexity > 128))
716 x->rdmult = x->rdmult + ((x->rdmult * (complexity - 128)) / 256);
627 } 717 }
628 718
629 // Find best coding mode & reconstruct the MB so it is available 719 // Find best coding mode & reconstruct the MB so it is available
630 // as a predictor for MBs that follow in the SB 720 // as a predictor for MBs that follow in the SB
631 if (frame_is_intra_only(cm)) { 721 if (frame_is_intra_only(cm)) {
632 vp9_rd_pick_intra_mode_sb(cpi, x, totalrate, totaldist, bsize, ctx, 722 vp9_rd_pick_intra_mode_sb(cpi, x, totalrate, totaldist, bsize, ctx,
633 best_rd); 723 best_rd);
634 } else { 724 } else {
635 if (bsize >= BLOCK_8X8) 725 if (bsize >= BLOCK_8X8)
636 vp9_rd_pick_inter_mode_sb(cpi, x, tile, mi_row, mi_col, 726 vp9_rd_pick_inter_mode_sb(cpi, x, tile, mi_row, mi_col,
637 totalrate, totaldist, bsize, ctx, best_rd); 727 totalrate, totaldist, bsize, ctx, best_rd);
638 else 728 else
639 vp9_rd_pick_inter_mode_sub8x8(cpi, x, tile, mi_row, mi_col, totalrate, 729 vp9_rd_pick_inter_mode_sub8x8(cpi, x, tile, mi_row, mi_col, totalrate,
640 totaldist, bsize, ctx, best_rd); 730 totaldist, bsize, ctx, best_rd);
641 } 731 }
642 732
643 if (cpi->sf.variance_adaptive_quantization) { 733 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
644 x->rdmult = orig_rdmult; 734 x->rdmult = orig_rdmult;
645 if (*totalrate != INT_MAX) { 735 if (*totalrate != INT_MAX) {
646 vp9_clear_system_state(); // __asm emms; 736 vp9_clear_system_state(); // __asm emms;
647 *totalrate = round(*totalrate * rdmult_ratio); 737 *totalrate = round(*totalrate * rdmult_ratio);
648 } 738 }
649 } 739 }
650 } 740 }
651 741
652 static void update_stats(VP9_COMP *cpi) { 742 static void update_stats(VP9_COMP *cpi) {
653 VP9_COMMON *const cm = &cpi->common; 743 VP9_COMMON *const cm = &cpi->common;
654 MACROBLOCK *const x = &cpi->mb; 744 MACROBLOCK *const x = &cpi->mb;
655 MACROBLOCKD *const xd = &x->e_mbd; 745 MACROBLOCKD *const xd = &x->e_mbd;
656 MODE_INFO *mi = xd->mi_8x8[0]; 746 MODE_INFO *mi = xd->mi_8x8[0];
657 MB_MODE_INFO *const mbmi = &mi->mbmi; 747 MB_MODE_INFO *const mbmi = &mi->mbmi;
658 748
659 if (!frame_is_intra_only(cm)) { 749 if (!frame_is_intra_only(cm)) {
660 const int seg_ref_active = vp9_segfeature_active(&cm->seg, mbmi->segment_id, 750 const int seg_ref_active = vp9_segfeature_active(&cm->seg, mbmi->segment_id,
661 SEG_LVL_REF_FRAME); 751 SEG_LVL_REF_FRAME);
662 752
663 if (!seg_ref_active) 753 if (!seg_ref_active)
664 cpi->intra_inter_count[vp9_get_pred_context_intra_inter(xd)] 754 cpi->intra_inter_count[vp9_get_intra_inter_context(xd)]
665 [is_inter_block(mbmi)]++; 755 [is_inter_block(mbmi)]++;
666 756
667 // If the segment reference feature is enabled we have only a single 757 // If the segment reference feature is enabled we have only a single
668 // reference frame allowed for the segment so exclude it from 758 // reference frame allowed for the segment so exclude it from
669 // the reference frame counts used to work out probabilities. 759 // the reference frame counts used to work out probabilities.
670 if (is_inter_block(mbmi) && !seg_ref_active) { 760 if (is_inter_block(mbmi) && !seg_ref_active) {
671 if (cm->comp_pred_mode == HYBRID_PREDICTION) 761 if (cm->reference_mode == REFERENCE_MODE_SELECT)
672 cpi->comp_inter_count[vp9_get_pred_context_comp_inter_inter(cm, xd)] 762 cpi->comp_inter_count[vp9_get_reference_mode_context(cm, xd)]
673 [has_second_ref(mbmi)]++; 763 [has_second_ref(mbmi)]++;
674 764
675 if (has_second_ref(mbmi)) { 765 if (has_second_ref(mbmi)) {
676 cpi->comp_ref_count[vp9_get_pred_context_comp_ref_p(cm, xd)] 766 cpi->comp_ref_count[vp9_get_pred_context_comp_ref_p(cm, xd)]
677 [mbmi->ref_frame[0] == GOLDEN_FRAME]++; 767 [mbmi->ref_frame[0] == GOLDEN_FRAME]++;
678 } else { 768 } else {
679 cpi->single_ref_count[vp9_get_pred_context_single_ref_p1(xd)][0] 769 cpi->single_ref_count[vp9_get_pred_context_single_ref_p1(xd)][0]
680 [mbmi->ref_frame[0] != LAST_FRAME]++; 770 [mbmi->ref_frame[0] != LAST_FRAME]++;
681 if (mbmi->ref_frame[0] != LAST_FRAME) 771 if (mbmi->ref_frame[0] != LAST_FRAME)
682 cpi->single_ref_count[vp9_get_pred_context_single_ref_p2(xd)][1] 772 cpi->single_ref_count[vp9_get_pred_context_single_ref_p2(xd)][1]
683 [mbmi->ref_frame[0] != GOLDEN_FRAME]++; 773 [mbmi->ref_frame[0] != GOLDEN_FRAME]++;
684 } 774 }
685 } 775 }
686
687 // Count of last ref frame 0,0 usage
688 if (mbmi->mode == ZEROMV && mbmi->ref_frame[0] == LAST_FRAME)
689 cpi->inter_zz_count++;
690 } 776 }
691 } 777 }
692 778
693 static BLOCK_SIZE *get_sb_partitioning(MACROBLOCK *x, BLOCK_SIZE bsize) { 779 static BLOCK_SIZE *get_sb_partitioning(MACROBLOCK *x, BLOCK_SIZE bsize) {
694 MACROBLOCKD *const xd = &x->e_mbd;
695 switch (bsize) { 780 switch (bsize) {
696 case BLOCK_64X64: 781 case BLOCK_64X64:
697 return &x->sb64_partitioning; 782 return &x->sb64_partitioning;
698 case BLOCK_32X32: 783 case BLOCK_32X32:
699 return &x->sb_partitioning[xd->sb_index]; 784 return &x->sb_partitioning[x->sb_index];
700 case BLOCK_16X16: 785 case BLOCK_16X16:
701 return &x->mb_partitioning[xd->sb_index][xd->mb_index]; 786 return &x->mb_partitioning[x->sb_index][x->mb_index];
702 case BLOCK_8X8: 787 case BLOCK_8X8:
703 return &x->b_partitioning[xd->sb_index][xd->mb_index][xd->b_index]; 788 return &x->b_partitioning[x->sb_index][x->mb_index][x->b_index];
704 default: 789 default:
705 assert(0); 790 assert(0);
706 return NULL; 791 return NULL;
707 } 792 }
708 } 793 }
709 794
710 static void restore_context(VP9_COMP *cpi, int mi_row, int mi_col, 795 static void restore_context(VP9_COMP *cpi, int mi_row, int mi_col,
711 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE], 796 ENTROPY_CONTEXT a[16 * MAX_MB_PLANE],
712 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], 797 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE],
713 PARTITION_CONTEXT sa[8], PARTITION_CONTEXT sl[8], 798 PARTITION_CONTEXT sa[8], PARTITION_CONTEXT sl[8],
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 } 851 }
767 vpx_memcpy(sa, cpi->above_seg_context + mi_col, 852 vpx_memcpy(sa, cpi->above_seg_context + mi_col,
768 sizeof(*cpi->above_seg_context) * mi_width); 853 sizeof(*cpi->above_seg_context) * mi_width);
769 vpx_memcpy(sl, cpi->left_seg_context + (mi_row & MI_MASK), 854 vpx_memcpy(sl, cpi->left_seg_context + (mi_row & MI_MASK),
770 sizeof(cpi->left_seg_context[0]) * mi_height); 855 sizeof(cpi->left_seg_context[0]) * mi_height);
771 } 856 }
772 857
773 static void encode_b(VP9_COMP *cpi, const TileInfo *const tile, 858 static void encode_b(VP9_COMP *cpi, const TileInfo *const tile,
774 TOKENEXTRA **tp, int mi_row, int mi_col, 859 TOKENEXTRA **tp, int mi_row, int mi_col,
775 int output_enabled, BLOCK_SIZE bsize, int sub_index) { 860 int output_enabled, BLOCK_SIZE bsize, int sub_index) {
776 VP9_COMMON * const cm = &cpi->common; 861 VP9_COMMON *const cm = &cpi->common;
777 MACROBLOCK * const x = &cpi->mb; 862 MACROBLOCK *const x = &cpi->mb;
778 MACROBLOCKD * const xd = &x->e_mbd;
779 863
780 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) 864 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols)
781 return; 865 return;
782 866
783 if (sub_index != -1) 867 if (sub_index != -1)
784 *get_sb_index(xd, bsize) = sub_index; 868 *get_sb_index(x, bsize) = sub_index;
785 869
786 if (bsize < BLOCK_8X8) { 870 if (bsize < BLOCK_8X8) {
787 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0 871 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0
788 // there is nothing to be done. 872 // there is nothing to be done.
789 if (xd->ab_index > 0) 873 if (x->ab_index > 0)
790 return; 874 return;
791 } 875 }
792 set_offsets(cpi, tile, mi_row, mi_col, bsize); 876 set_offsets(cpi, tile, mi_row, mi_col, bsize);
793 update_state(cpi, get_block_context(x, bsize), bsize, output_enabled); 877 update_state(cpi, get_block_context(x, bsize), bsize, output_enabled);
794 encode_superblock(cpi, tp, output_enabled, mi_row, mi_col, bsize); 878 encode_superblock(cpi, tp, output_enabled, mi_row, mi_col, bsize);
795 879
796 if (output_enabled) { 880 if (output_enabled) {
797 update_stats(cpi); 881 update_stats(cpi);
798 882
799 (*tp)->token = EOSB_TOKEN; 883 (*tp)->token = EOSB_TOKEN;
800 (*tp)++; 884 (*tp)++;
801 } 885 }
802 } 886 }
803 887
804 static void encode_sb(VP9_COMP *cpi, const TileInfo *const tile, 888 static void encode_sb(VP9_COMP *cpi, const TileInfo *const tile,
805 TOKENEXTRA **tp, int mi_row, int mi_col, 889 TOKENEXTRA **tp, int mi_row, int mi_col,
806 int output_enabled, BLOCK_SIZE bsize) { 890 int output_enabled, BLOCK_SIZE bsize) {
807 VP9_COMMON * const cm = &cpi->common; 891 VP9_COMMON *const cm = &cpi->common;
808 MACROBLOCK * const x = &cpi->mb; 892 MACROBLOCK *const x = &cpi->mb;
809 MACROBLOCKD * const xd = &x->e_mbd;
810 BLOCK_SIZE c1 = BLOCK_8X8; 893 BLOCK_SIZE c1 = BLOCK_8X8;
811 const int bsl = b_width_log2(bsize), bs = (1 << bsl) / 4; 894 const int bsl = b_width_log2(bsize), bs = (1 << bsl) / 4;
812 int pl = 0; 895 int pl = 0;
813 PARTITION_TYPE partition; 896 PARTITION_TYPE partition;
814 BLOCK_SIZE subsize; 897 BLOCK_SIZE subsize;
815 int i; 898 int i;
816 899
817 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) 900 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols)
818 return; 901 return;
819 902
820 c1 = BLOCK_4X4; 903 c1 = BLOCK_4X4;
821 if (bsize >= BLOCK_8X8) { 904 if (bsize >= BLOCK_8X8) {
822 pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, 905 pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context,
823 mi_row, mi_col, bsize); 906 mi_row, mi_col, bsize);
824 c1 = *(get_sb_partitioning(x, bsize)); 907 c1 = *(get_sb_partitioning(x, bsize));
825 } 908 }
826 partition = partition_lookup[bsl][c1]; 909 partition = partition_lookup[bsl][c1];
827 910
828 switch (partition) { 911 switch (partition) {
829 case PARTITION_NONE: 912 case PARTITION_NONE:
830 if (output_enabled && bsize >= BLOCK_8X8) 913 if (output_enabled && bsize >= BLOCK_8X8)
831 cpi->partition_count[pl][PARTITION_NONE]++; 914 cm->counts.partition[pl][PARTITION_NONE]++;
832 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, -1); 915 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, -1);
833 break; 916 break;
834 case PARTITION_VERT: 917 case PARTITION_VERT:
835 if (output_enabled) 918 if (output_enabled)
836 cpi->partition_count[pl][PARTITION_VERT]++; 919 cm->counts.partition[pl][PARTITION_VERT]++;
837 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, 0); 920 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, 0);
838 encode_b(cpi, tile, tp, mi_row, mi_col + bs, output_enabled, c1, 1); 921 encode_b(cpi, tile, tp, mi_row, mi_col + bs, output_enabled, c1, 1);
839 break; 922 break;
840 case PARTITION_HORZ: 923 case PARTITION_HORZ:
841 if (output_enabled) 924 if (output_enabled)
842 cpi->partition_count[pl][PARTITION_HORZ]++; 925 cm->counts.partition[pl][PARTITION_HORZ]++;
843 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, 0); 926 encode_b(cpi, tile, tp, mi_row, mi_col, output_enabled, c1, 0);
844 encode_b(cpi, tile, tp, mi_row + bs, mi_col, output_enabled, c1, 1); 927 encode_b(cpi, tile, tp, mi_row + bs, mi_col, output_enabled, c1, 1);
845 break; 928 break;
846 case PARTITION_SPLIT: 929 case PARTITION_SPLIT:
847 subsize = get_subsize(bsize, PARTITION_SPLIT); 930 subsize = get_subsize(bsize, PARTITION_SPLIT);
848 931
849 if (output_enabled) 932 if (output_enabled)
850 cpi->partition_count[pl][PARTITION_SPLIT]++; 933 cm->counts.partition[pl][PARTITION_SPLIT]++;
851 934
852 for (i = 0; i < 4; i++) { 935 for (i = 0; i < 4; i++) {
853 const int x_idx = i & 1, y_idx = i >> 1; 936 const int x_idx = i & 1, y_idx = i >> 1;
854 937
855 *get_sb_index(xd, subsize) = i; 938 *get_sb_index(x, subsize) = i;
856 encode_sb(cpi, tile, tp, mi_row + y_idx * bs, mi_col + x_idx * bs, 939 encode_sb(cpi, tile, tp, mi_row + y_idx * bs, mi_col + x_idx * bs,
857 output_enabled, subsize); 940 output_enabled, subsize);
858 } 941 }
859 break; 942 break;
860 default: 943 default:
861 assert(0); 944 assert(0);
862 break; 945 break;
863 } 946 }
864 947
865 if (partition != PARTITION_SPLIT || bsize == BLOCK_8X8) 948 if (partition != PARTITION_SPLIT || bsize == BLOCK_8X8)
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 } 1055 }
973 return 0; 1056 return 0;
974 } 1057 }
975 1058
976 static void rd_use_partition(VP9_COMP *cpi, 1059 static void rd_use_partition(VP9_COMP *cpi,
977 const TileInfo *const tile, 1060 const TileInfo *const tile,
978 MODE_INFO **mi_8x8, 1061 MODE_INFO **mi_8x8,
979 TOKENEXTRA **tp, int mi_row, int mi_col, 1062 TOKENEXTRA **tp, int mi_row, int mi_col,
980 BLOCK_SIZE bsize, int *rate, int64_t *dist, 1063 BLOCK_SIZE bsize, int *rate, int64_t *dist,
981 int do_recon) { 1064 int do_recon) {
982 VP9_COMMON * const cm = &cpi->common; 1065 VP9_COMMON *const cm = &cpi->common;
983 MACROBLOCK * const x = &cpi->mb; 1066 MACROBLOCK *const x = &cpi->mb;
984 MACROBLOCKD *xd = &cpi->mb.e_mbd;
985 const int mis = cm->mode_info_stride; 1067 const int mis = cm->mode_info_stride;
986 int bsl = b_width_log2(bsize); 1068 int bsl = b_width_log2(bsize);
987 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; 1069 const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize];
988 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; 1070 const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize];
989 int ms = num_4x4_blocks_wide / 2; 1071 int ms = num_4x4_blocks_wide / 2;
990 int mh = num_4x4_blocks_high / 2; 1072 int mh = num_4x4_blocks_high / 2;
991 int bss = (1 << bsl) / 4; 1073 int bss = (1 << bsl) / 4;
992 int i, pl; 1074 int i, pl;
993 PARTITION_TYPE partition = PARTITION_NONE; 1075 PARTITION_TYPE partition = PARTITION_NONE;
994 BLOCK_SIZE subsize; 1076 BLOCK_SIZE subsize;
(...skipping 14 matching lines...) Expand all
1009 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) 1091 if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols)
1010 return; 1092 return;
1011 1093
1012 partition = partition_lookup[bsl][bs_type]; 1094 partition = partition_lookup[bsl][bs_type];
1013 1095
1014 subsize = get_subsize(bsize, partition); 1096 subsize = get_subsize(bsize, partition);
1015 1097
1016 if (bsize < BLOCK_8X8) { 1098 if (bsize < BLOCK_8X8) {
1017 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0 1099 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0
1018 // there is nothing to be done. 1100 // there is nothing to be done.
1019 if (xd->ab_index != 0) { 1101 if (x->ab_index != 0) {
1020 *rate = 0; 1102 *rate = 0;
1021 *dist = 0; 1103 *dist = 0;
1022 return; 1104 return;
1023 } 1105 }
1024 } else { 1106 } else {
1025 *(get_sb_partitioning(x, bsize)) = subsize; 1107 *(get_sb_partitioning(x, bsize)) = subsize;
1026 } 1108 }
1027 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1109 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1028 1110
1029 if (bsize == BLOCK_16X16) { 1111 if (bsize == BLOCK_16X16) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1067 *(get_sb_partitioning(x, bsize)) = subsize; 1149 *(get_sb_partitioning(x, bsize)) = subsize;
1068 } 1150 }
1069 } 1151 }
1070 1152
1071 switch (partition) { 1153 switch (partition) {
1072 case PARTITION_NONE: 1154 case PARTITION_NONE:
1073 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist, 1155 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist,
1074 bsize, get_block_context(x, bsize), INT64_MAX); 1156 bsize, get_block_context(x, bsize), INT64_MAX);
1075 break; 1157 break;
1076 case PARTITION_HORZ: 1158 case PARTITION_HORZ:
1077 *get_sb_index(xd, subsize) = 0; 1159 *get_sb_index(x, subsize) = 0;
1078 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist, 1160 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist,
1079 subsize, get_block_context(x, subsize), INT64_MAX); 1161 subsize, get_block_context(x, subsize), INT64_MAX);
1080 if (last_part_rate != INT_MAX && 1162 if (last_part_rate != INT_MAX &&
1081 bsize >= BLOCK_8X8 && mi_row + (mh >> 1) < cm->mi_rows) { 1163 bsize >= BLOCK_8X8 && mi_row + (mh >> 1) < cm->mi_rows) {
1082 int rt = 0; 1164 int rt = 0;
1083 int64_t dt = 0; 1165 int64_t dt = 0;
1084 update_state(cpi, get_block_context(x, subsize), subsize, 0); 1166 update_state(cpi, get_block_context(x, subsize), subsize, 0);
1085 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); 1167 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
1086 *get_sb_index(xd, subsize) = 1; 1168 *get_sb_index(x, subsize) = 1;
1087 pick_sb_modes(cpi, tile, mi_row + (ms >> 1), mi_col, &rt, &dt, subsize, 1169 pick_sb_modes(cpi, tile, mi_row + (ms >> 1), mi_col, &rt, &dt, subsize,
1088 get_block_context(x, subsize), INT64_MAX); 1170 get_block_context(x, subsize), INT64_MAX);
1089 if (rt == INT_MAX || dt == INT_MAX) { 1171 if (rt == INT_MAX || dt == INT_MAX) {
1090 last_part_rate = INT_MAX; 1172 last_part_rate = INT_MAX;
1091 last_part_dist = INT_MAX; 1173 last_part_dist = INT_MAX;
1092 break; 1174 break;
1093 } 1175 }
1094 1176
1095 last_part_rate += rt; 1177 last_part_rate += rt;
1096 last_part_dist += dt; 1178 last_part_dist += dt;
1097 } 1179 }
1098 break; 1180 break;
1099 case PARTITION_VERT: 1181 case PARTITION_VERT:
1100 *get_sb_index(xd, subsize) = 0; 1182 *get_sb_index(x, subsize) = 0;
1101 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist, 1183 pick_sb_modes(cpi, tile, mi_row, mi_col, &last_part_rate, &last_part_dist,
1102 subsize, get_block_context(x, subsize), INT64_MAX); 1184 subsize, get_block_context(x, subsize), INT64_MAX);
1103 if (last_part_rate != INT_MAX && 1185 if (last_part_rate != INT_MAX &&
1104 bsize >= BLOCK_8X8 && mi_col + (ms >> 1) < cm->mi_cols) { 1186 bsize >= BLOCK_8X8 && mi_col + (ms >> 1) < cm->mi_cols) {
1105 int rt = 0; 1187 int rt = 0;
1106 int64_t dt = 0; 1188 int64_t dt = 0;
1107 update_state(cpi, get_block_context(x, subsize), subsize, 0); 1189 update_state(cpi, get_block_context(x, subsize), subsize, 0);
1108 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); 1190 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
1109 *get_sb_index(xd, subsize) = 1; 1191 *get_sb_index(x, subsize) = 1;
1110 pick_sb_modes(cpi, tile, mi_row, mi_col + (ms >> 1), &rt, &dt, subsize, 1192 pick_sb_modes(cpi, tile, mi_row, mi_col + (ms >> 1), &rt, &dt, subsize,
1111 get_block_context(x, subsize), INT64_MAX); 1193 get_block_context(x, subsize), INT64_MAX);
1112 if (rt == INT_MAX || dt == INT_MAX) { 1194 if (rt == INT_MAX || dt == INT_MAX) {
1113 last_part_rate = INT_MAX; 1195 last_part_rate = INT_MAX;
1114 last_part_dist = INT_MAX; 1196 last_part_dist = INT_MAX;
1115 break; 1197 break;
1116 } 1198 }
1117 last_part_rate += rt; 1199 last_part_rate += rt;
1118 last_part_dist += dt; 1200 last_part_dist += dt;
1119 } 1201 }
1120 break; 1202 break;
1121 case PARTITION_SPLIT: 1203 case PARTITION_SPLIT:
1122 // Split partition. 1204 // Split partition.
1123 last_part_rate = 0; 1205 last_part_rate = 0;
1124 last_part_dist = 0; 1206 last_part_dist = 0;
1125 for (i = 0; i < 4; i++) { 1207 for (i = 0; i < 4; i++) {
1126 int x_idx = (i & 1) * (ms >> 1); 1208 int x_idx = (i & 1) * (ms >> 1);
1127 int y_idx = (i >> 1) * (ms >> 1); 1209 int y_idx = (i >> 1) * (ms >> 1);
1128 int jj = i >> 1, ii = i & 0x01; 1210 int jj = i >> 1, ii = i & 0x01;
1129 int rt; 1211 int rt;
1130 int64_t dt; 1212 int64_t dt;
1131 1213
1132 if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols)) 1214 if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols))
1133 continue; 1215 continue;
1134 1216
1135 *get_sb_index(xd, subsize) = i; 1217 *get_sb_index(x, subsize) = i;
1136 1218
1137 rd_use_partition(cpi, tile, mi_8x8 + jj * bss * mis + ii * bss, tp, 1219 rd_use_partition(cpi, tile, mi_8x8 + jj * bss * mis + ii * bss, tp,
1138 mi_row + y_idx, mi_col + x_idx, subsize, &rt, &dt, 1220 mi_row + y_idx, mi_col + x_idx, subsize, &rt, &dt,
1139 i != 3); 1221 i != 3);
1140 if (rt == INT_MAX || dt == INT_MAX) { 1222 if (rt == INT_MAX || dt == INT_MAX) {
1141 last_part_rate = INT_MAX; 1223 last_part_rate = INT_MAX;
1142 last_part_dist = INT_MAX; 1224 last_part_dist = INT_MAX;
1143 break; 1225 break;
1144 } 1226 }
1145 last_part_rate += rt; 1227 last_part_rate += rt;
(...skipping 20 matching lines...) Expand all
1166 1248
1167 // Split partition. 1249 // Split partition.
1168 for (i = 0; i < 4; i++) { 1250 for (i = 0; i < 4; i++) {
1169 int x_idx = (i & 1) * (num_4x4_blocks_wide >> 2); 1251 int x_idx = (i & 1) * (num_4x4_blocks_wide >> 2);
1170 int y_idx = (i >> 1) * (num_4x4_blocks_wide >> 2); 1252 int y_idx = (i >> 1) * (num_4x4_blocks_wide >> 2);
1171 int rt = 0; 1253 int rt = 0;
1172 int64_t dt = 0; 1254 int64_t dt = 0;
1173 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; 1255 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE];
1174 PARTITION_CONTEXT sl[8], sa[8]; 1256 PARTITION_CONTEXT sl[8], sa[8];
1175 1257
1176 if ((mi_row + y_idx >= cm->mi_rows) 1258 if ((mi_row + y_idx >= cm->mi_rows) || (mi_col + x_idx >= cm->mi_cols))
1177 || (mi_col + x_idx >= cm->mi_cols))
1178 continue; 1259 continue;
1179 1260
1180 *get_sb_index(xd, split_subsize) = i; 1261 *get_sb_index(x, split_subsize) = i;
1181 *get_sb_partitioning(x, bsize) = split_subsize; 1262 *get_sb_partitioning(x, bsize) = split_subsize;
1182 *get_sb_partitioning(x, split_subsize) = split_subsize; 1263 *get_sb_partitioning(x, split_subsize) = split_subsize;
1183 1264
1184 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1265 save_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1185 1266
1186 pick_sb_modes(cpi, tile, mi_row + y_idx, mi_col + x_idx, &rt, &dt, 1267 pick_sb_modes(cpi, tile, mi_row + y_idx, mi_col + x_idx, &rt, &dt,
1187 split_subsize, get_block_context(x, split_subsize), 1268 split_subsize, get_block_context(x, split_subsize),
1188 INT64_MAX); 1269 INT64_MAX);
1189 1270
1190 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1271 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1191 1272
1192 if (rt == INT_MAX || dt == INT_MAX) { 1273 if (rt == INT_MAX || dt == INT_MAX) {
1193 split_rate = INT_MAX; 1274 split_rate = INT_MAX;
1194 split_dist = INT_MAX; 1275 split_dist = INT_MAX;
1195 break; 1276 break;
1196 } 1277 }
1197 1278
1198 if (i != 3) 1279 if (i != 3)
1199 encode_sb(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx, 0, 1280 encode_sb(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx, 0,
1200 split_subsize); 1281 split_subsize);
1201 1282
1202 split_rate += rt; 1283 split_rate += rt;
1203 split_dist += dt; 1284 split_dist += dt;
1204 pl = partition_plane_context(cpi->above_seg_context, 1285 pl = partition_plane_context(cpi->above_seg_context,
1205 cpi->left_seg_context, 1286 cpi->left_seg_context,
1206 mi_row + y_idx, mi_col + x_idx, bsize); 1287 mi_row + y_idx, mi_col + x_idx,
1288 split_subsize);
1207 split_rate += x->partition_cost[pl][PARTITION_NONE]; 1289 split_rate += x->partition_cost[pl][PARTITION_NONE];
1208 } 1290 }
1209 pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, 1291 pl = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context,
1210 mi_row, mi_col, bsize); 1292 mi_row, mi_col, bsize);
1211 if (split_rate < INT_MAX) { 1293 if (split_rate < INT_MAX) {
1212 split_rate += x->partition_cost[pl][PARTITION_SPLIT]; 1294 split_rate += x->partition_cost[pl][PARTITION_SPLIT];
1213 1295
1214 chosen_rate = split_rate; 1296 chosen_rate = split_rate;
1215 chosen_dist = split_dist; 1297 chosen_dist = split_dist;
1216 } 1298 }
(...skipping 17 matching lines...) Expand all
1234 chosen_dist = none_dist; 1316 chosen_dist = none_dist;
1235 } 1317 }
1236 1318
1237 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1319 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1238 1320
1239 // We must have chosen a partitioning and encoding or we'll fail later on. 1321 // We must have chosen a partitioning and encoding or we'll fail later on.
1240 // No other opportunities for success. 1322 // No other opportunities for success.
1241 if ( bsize == BLOCK_64X64) 1323 if ( bsize == BLOCK_64X64)
1242 assert(chosen_rate < INT_MAX && chosen_dist < INT_MAX); 1324 assert(chosen_rate < INT_MAX && chosen_dist < INT_MAX);
1243 1325
1244 if (do_recon) 1326 if (do_recon) {
1245 encode_sb(cpi, tile, tp, mi_row, mi_col, bsize == BLOCK_64X64, bsize); 1327 int output_enabled = (bsize == BLOCK_64X64);
1328
1329 // Check the projected output rate for this SB against it's target
1330 // and and if necessary apply a Q delta using segmentation to get
1331 // closer to the target.
1332 if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
1333 select_in_frame_q_segment(cpi, mi_row, mi_col,
1334 output_enabled, chosen_rate);
1335 }
1336
1337 encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize);
1338 }
1246 1339
1247 *rate = chosen_rate; 1340 *rate = chosen_rate;
1248 *dist = chosen_dist; 1341 *dist = chosen_dist;
1249 } 1342 }
1250 1343
1251 static const BLOCK_SIZE min_partition_size[BLOCK_SIZES] = { 1344 static const BLOCK_SIZE min_partition_size[BLOCK_SIZES] = {
1252 BLOCK_4X4, BLOCK_4X4, BLOCK_4X4, BLOCK_4X4, 1345 BLOCK_4X4, BLOCK_4X4, BLOCK_4X4, BLOCK_4X4,
1253 BLOCK_4X4, BLOCK_4X4, BLOCK_8X8, BLOCK_8X8, 1346 BLOCK_4X4, BLOCK_4X4, BLOCK_8X8, BLOCK_8X8,
1254 BLOCK_8X8, BLOCK_16X16, BLOCK_16X16, BLOCK_16X16, BLOCK_16X16 1347 BLOCK_8X8, BLOCK_16X16, BLOCK_16X16, BLOCK_16X16, BLOCK_16X16
1255 }; 1348 };
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 // Check border cases where max and min from neighbours may not be legal. 1443 // Check border cases where max and min from neighbours may not be legal.
1351 *max_block_size = find_partition_size(*max_block_size, 1444 *max_block_size = find_partition_size(*max_block_size,
1352 row8x8_remaining, col8x8_remaining, 1445 row8x8_remaining, col8x8_remaining,
1353 &bh, &bw); 1446 &bh, &bw);
1354 *min_block_size = MIN(*min_block_size, *max_block_size); 1447 *min_block_size = MIN(*min_block_size, *max_block_size);
1355 } 1448 }
1356 1449
1357 static void compute_fast_motion_search_level(VP9_COMP *cpi, BLOCK_SIZE bsize) { 1450 static void compute_fast_motion_search_level(VP9_COMP *cpi, BLOCK_SIZE bsize) {
1358 VP9_COMMON *const cm = &cpi->common; 1451 VP9_COMMON *const cm = &cpi->common;
1359 MACROBLOCK *const x = &cpi->mb; 1452 MACROBLOCK *const x = &cpi->mb;
1360 MACROBLOCKD *const xd = &x->e_mbd;
1361 1453
1362 // Only use 8x8 result for non HD videos. 1454 // Only use 8x8 result for non HD videos.
1363 // int use_8x8 = (MIN(cpi->common.width, cpi->common.height) < 720) ? 1 : 0; 1455 // int use_8x8 = (MIN(cpi->common.width, cpi->common.height) < 720) ? 1 : 0;
1364 int use_8x8 = 1; 1456 int use_8x8 = 1;
1365 1457
1366 if (cm->frame_type && !cpi->is_src_frame_alt_ref && 1458 if (cm->frame_type && !cpi->is_src_frame_alt_ref &&
1367 ((use_8x8 && bsize == BLOCK_16X16) || 1459 ((use_8x8 && bsize == BLOCK_16X16) ||
1368 bsize == BLOCK_32X32 || bsize == BLOCK_64X64)) { 1460 bsize == BLOCK_32X32 || bsize == BLOCK_64X64)) {
1369 int ref0 = 0, ref1 = 0, ref2 = 0, ref3 = 0; 1461 int ref0 = 0, ref1 = 0, ref2 = 0, ref3 = 0;
1370 PICK_MODE_CONTEXT *block_context = NULL; 1462 PICK_MODE_CONTEXT *block_context = NULL;
1371 1463
1372 if (bsize == BLOCK_16X16) { 1464 if (bsize == BLOCK_16X16) {
1373 block_context = x->sb8x8_context[xd->sb_index][xd->mb_index]; 1465 block_context = x->sb8x8_context[x->sb_index][x->mb_index];
1374 } else if (bsize == BLOCK_32X32) { 1466 } else if (bsize == BLOCK_32X32) {
1375 block_context = x->mb_context[xd->sb_index]; 1467 block_context = x->mb_context[x->sb_index];
1376 } else if (bsize == BLOCK_64X64) { 1468 } else if (bsize == BLOCK_64X64) {
1377 block_context = x->sb32_context; 1469 block_context = x->sb32_context;
1378 } 1470 }
1379 1471
1380 if (block_context) { 1472 if (block_context) {
1381 ref0 = block_context[0].mic.mbmi.ref_frame[0]; 1473 ref0 = block_context[0].mic.mbmi.ref_frame[0];
1382 ref1 = block_context[1].mic.mbmi.ref_frame[0]; 1474 ref1 = block_context[1].mic.mbmi.ref_frame[0];
1383 ref2 = block_context[2].mic.mbmi.ref_frame[0]; 1475 ref2 = block_context[2].mic.mbmi.ref_frame[0];
1384 ref3 = block_context[3].mic.mbmi.ref_frame[0]; 1476 ref3 = block_context[3].mic.mbmi.ref_frame[0];
1385 } 1477 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 vpx_memcpy(x->pred_mv, ctx->pred_mv, sizeof(x->pred_mv)); 1545 vpx_memcpy(x->pred_mv, ctx->pred_mv, sizeof(x->pred_mv));
1454 } 1546 }
1455 1547
1456 // TODO(jingning,jimbankoski,rbultje): properly skip partition types that are 1548 // TODO(jingning,jimbankoski,rbultje): properly skip partition types that are
1457 // unlikely to be selected depending on previous rate-distortion optimization 1549 // unlikely to be selected depending on previous rate-distortion optimization
1458 // results, for encoding speed-up. 1550 // results, for encoding speed-up.
1459 static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile, 1551 static void rd_pick_partition(VP9_COMP *cpi, const TileInfo *const tile,
1460 TOKENEXTRA **tp, int mi_row, 1552 TOKENEXTRA **tp, int mi_row,
1461 int mi_col, BLOCK_SIZE bsize, int *rate, 1553 int mi_col, BLOCK_SIZE bsize, int *rate,
1462 int64_t *dist, int do_recon, int64_t best_rd) { 1554 int64_t *dist, int do_recon, int64_t best_rd) {
1463 VP9_COMMON * const cm = &cpi->common; 1555 VP9_COMMON *const cm = &cpi->common;
1464 MACROBLOCK * const x = &cpi->mb; 1556 MACROBLOCK *const x = &cpi->mb;
1465 MACROBLOCKD * const xd = &x->e_mbd;
1466 const int ms = num_8x8_blocks_wide_lookup[bsize] / 2; 1557 const int ms = num_8x8_blocks_wide_lookup[bsize] / 2;
1467 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE]; 1558 ENTROPY_CONTEXT l[16 * MAX_MB_PLANE], a[16 * MAX_MB_PLANE];
1468 PARTITION_CONTEXT sl[8], sa[8]; 1559 PARTITION_CONTEXT sl[8], sa[8];
1469 TOKENEXTRA *tp_orig = *tp; 1560 TOKENEXTRA *tp_orig = *tp;
1470 int i, pl; 1561 int i, pl;
1471 BLOCK_SIZE subsize; 1562 BLOCK_SIZE subsize;
1472 int this_rate, sum_rate = 0, best_rate = INT_MAX; 1563 int this_rate, sum_rate = 0, best_rate = INT_MAX;
1473 int64_t this_dist, sum_dist = 0, best_dist = INT64_MAX; 1564 int64_t this_dist, sum_dist = 0, best_dist = INT64_MAX;
1474 int64_t sum_rd = 0; 1565 int64_t sum_rd = 0;
1475 int do_split = bsize >= BLOCK_8X8; 1566 int do_split = bsize >= BLOCK_8X8;
1476 int do_rect = 1; 1567 int do_rect = 1;
1477 // Override skipping rectangular partition operations for edge blocks 1568 // Override skipping rectangular partition operations for edge blocks
1478 const int force_horz_split = (mi_row + ms >= cm->mi_rows); 1569 const int force_horz_split = (mi_row + ms >= cm->mi_rows);
1479 const int force_vert_split = (mi_col + ms >= cm->mi_cols); 1570 const int force_vert_split = (mi_col + ms >= cm->mi_cols);
1571 const int xss = x->e_mbd.plane[1].subsampling_x;
1572 const int yss = x->e_mbd.plane[1].subsampling_y;
1480 1573
1481 int partition_none_allowed = !force_horz_split && !force_vert_split; 1574 int partition_none_allowed = !force_horz_split && !force_vert_split;
1482 int partition_horz_allowed = !force_vert_split && bsize >= BLOCK_8X8; 1575 int partition_horz_allowed = !force_vert_split && yss <= xss &&
1483 int partition_vert_allowed = !force_horz_split && bsize >= BLOCK_8X8; 1576 bsize >= BLOCK_8X8;
1577 int partition_vert_allowed = !force_horz_split && xss <= yss &&
1578 bsize >= BLOCK_8X8;
1484 1579
1485 int partition_split_done = 0; 1580 int partition_split_done = 0;
1486 (void) *tp_orig; 1581 (void) *tp_orig;
1487 1582
1488 if (bsize < BLOCK_8X8) { 1583 if (bsize < BLOCK_8X8) {
1489 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0 1584 // When ab_index = 0 all sub-blocks are handled, so for ab_index != 0
1490 // there is nothing to be done. 1585 // there is nothing to be done.
1491 if (xd->ab_index != 0) { 1586 if (x->ab_index != 0) {
1492 *rate = 0; 1587 *rate = 0;
1493 *dist = 0; 1588 *dist = 0;
1494 return; 1589 return;
1495 } 1590 }
1496 } 1591 }
1497 assert(mi_height_log2(bsize) == mi_width_log2(bsize)); 1592 assert(num_8x8_blocks_wide_lookup[bsize] ==
1593 num_8x8_blocks_high_lookup[bsize]);
1498 1594
1499 if (bsize == BLOCK_16X16) { 1595 if (bsize == BLOCK_16X16) {
1500 set_offsets(cpi, tile, mi_row, mi_col, bsize); 1596 set_offsets(cpi, tile, mi_row, mi_col, bsize);
1501 x->mb_energy = vp9_block_energy(cpi, x, bsize); 1597 x->mb_energy = vp9_block_energy(cpi, x, bsize);
1502 } 1598 }
1503 1599
1504 // Determine partition types in search according to the speed features. 1600 // Determine partition types in search according to the speed features.
1505 // The threshold set here has to be of square block size. 1601 // The threshold set here has to be of square block size.
1506 if (cpi->sf.auto_min_max_partition_size) { 1602 if (cpi->sf.auto_min_max_partition_size) {
1507 partition_none_allowed &= (bsize <= cpi->sf.max_partition_size && 1603 partition_none_allowed &= (bsize <= cpi->sf.max_partition_size &&
(...skipping 30 matching lines...) Expand all
1538 get_block_context(x, bsize), best_rd); 1634 get_block_context(x, bsize), best_rd);
1539 if (this_rate != INT_MAX) { 1635 if (this_rate != INT_MAX) {
1540 if (bsize >= BLOCK_8X8) { 1636 if (bsize >= BLOCK_8X8) {
1541 pl = partition_plane_context(cpi->above_seg_context, 1637 pl = partition_plane_context(cpi->above_seg_context,
1542 cpi->left_seg_context, 1638 cpi->left_seg_context,
1543 mi_row, mi_col, bsize); 1639 mi_row, mi_col, bsize);
1544 this_rate += x->partition_cost[pl][PARTITION_NONE]; 1640 this_rate += x->partition_cost[pl][PARTITION_NONE];
1545 } 1641 }
1546 sum_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_dist); 1642 sum_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_dist);
1547 if (sum_rd < best_rd) { 1643 if (sum_rd < best_rd) {
1548 int64_t stop_thresh = 2048; 1644 int64_t stop_thresh = 4096;
1645 int64_t stop_thresh_rd;
1549 1646
1550 best_rate = this_rate; 1647 best_rate = this_rate;
1551 best_dist = this_dist; 1648 best_dist = this_dist;
1552 best_rd = sum_rd; 1649 best_rd = sum_rd;
1553 if (bsize >= BLOCK_8X8) 1650 if (bsize >= BLOCK_8X8)
1554 *(get_sb_partitioning(x, bsize)) = bsize; 1651 *(get_sb_partitioning(x, bsize)) = bsize;
1555 1652
1556 // Adjust threshold according to partition size. 1653 // Adjust threshold according to partition size.
1557 stop_thresh >>= 8 - (b_width_log2_lookup[bsize] + 1654 stop_thresh >>= 8 - (b_width_log2_lookup[bsize] +
1558 b_height_log2_lookup[bsize]); 1655 b_height_log2_lookup[bsize]);
1559 1656
1657 stop_thresh_rd = RDCOST(x->rdmult, x->rddiv, 0, stop_thresh);
1560 // If obtained distortion is very small, choose current partition 1658 // If obtained distortion is very small, choose current partition
1561 // and stop splitting. 1659 // and stop splitting.
1562 if (this_dist < stop_thresh) { 1660 if (!x->e_mbd.lossless && best_rd < stop_thresh_rd) {
1563 do_split = 0; 1661 do_split = 0;
1564 do_rect = 0; 1662 do_rect = 0;
1565 } 1663 }
1566 } 1664 }
1567 } 1665 }
1568 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1666 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1569 } 1667 }
1570 1668
1571 // store estimated motion vector 1669 // store estimated motion vector
1572 if (cpi->sf.adaptive_motion_search) 1670 if (cpi->sf.adaptive_motion_search)
1573 store_pred_mv(x, get_block_context(x, bsize)); 1671 store_pred_mv(x, get_block_context(x, bsize));
1574 1672
1575 // PARTITION_SPLIT 1673 // PARTITION_SPLIT
1576 sum_rd = 0; 1674 sum_rd = 0;
1577 // TODO(jingning): use the motion vectors given by the above search as 1675 // TODO(jingning): use the motion vectors given by the above search as
1578 // the starting point of motion search in the following partition type check. 1676 // the starting point of motion search in the following partition type check.
1579 if (do_split) { 1677 if (do_split) {
1580 subsize = get_subsize(bsize, PARTITION_SPLIT); 1678 subsize = get_subsize(bsize, PARTITION_SPLIT);
1581 for (i = 0; i < 4 && sum_rd < best_rd; ++i) { 1679 for (i = 0; i < 4 && sum_rd < best_rd; ++i) {
1582 const int x_idx = (i & 1) * ms; 1680 const int x_idx = (i & 1) * ms;
1583 const int y_idx = (i >> 1) * ms; 1681 const int y_idx = (i >> 1) * ms;
1584 1682
1585 if (mi_row + y_idx >= cm->mi_rows || mi_col + x_idx >= cm->mi_cols) 1683 if (mi_row + y_idx >= cm->mi_rows || mi_col + x_idx >= cm->mi_cols)
1586 continue; 1684 continue;
1587 1685
1588 *get_sb_index(xd, subsize) = i; 1686 *get_sb_index(x, subsize) = i;
1589 if (cpi->sf.adaptive_motion_search) 1687 if (cpi->sf.adaptive_motion_search)
1590 load_pred_mv(x, get_block_context(x, bsize)); 1688 load_pred_mv(x, get_block_context(x, bsize));
1689 if (cpi->sf.adaptive_pred_filter_type && bsize == BLOCK_8X8 &&
1690 partition_none_allowed)
1691 get_block_context(x, subsize)->pred_filter_type =
1692 get_block_context(x, bsize)->mic.mbmi.interp_filter;
1591 rd_pick_partition(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx, subsize, 1693 rd_pick_partition(cpi, tile, tp, mi_row + y_idx, mi_col + x_idx, subsize,
1592 &this_rate, &this_dist, i != 3, best_rd - sum_rd); 1694 &this_rate, &this_dist, i != 3, best_rd - sum_rd);
1593 1695
1594 if (this_rate == INT_MAX) { 1696 if (this_rate == INT_MAX) {
1595 sum_rd = INT64_MAX; 1697 sum_rd = INT64_MAX;
1596 } else { 1698 } else {
1597 sum_rate += this_rate; 1699 sum_rate += this_rate;
1598 sum_dist += this_dist; 1700 sum_dist += this_dist;
1599 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); 1701 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
1600 } 1702 }
(...skipping 24 matching lines...) Expand all
1625 x->subblock_ref = 0; 1727 x->subblock_ref = 0;
1626 1728
1627 if (partition_split_done && 1729 if (partition_split_done &&
1628 cpi->sf.using_small_partition_info) { 1730 cpi->sf.using_small_partition_info) {
1629 compute_fast_motion_search_level(cpi, bsize); 1731 compute_fast_motion_search_level(cpi, bsize);
1630 } 1732 }
1631 1733
1632 // PARTITION_HORZ 1734 // PARTITION_HORZ
1633 if (partition_horz_allowed && do_rect) { 1735 if (partition_horz_allowed && do_rect) {
1634 subsize = get_subsize(bsize, PARTITION_HORZ); 1736 subsize = get_subsize(bsize, PARTITION_HORZ);
1635 *get_sb_index(xd, subsize) = 0; 1737 *get_sb_index(x, subsize) = 0;
1636 if (cpi->sf.adaptive_motion_search) 1738 if (cpi->sf.adaptive_motion_search)
1637 load_pred_mv(x, get_block_context(x, bsize)); 1739 load_pred_mv(x, get_block_context(x, bsize));
1740 if (cpi->sf.adaptive_pred_filter_type && bsize == BLOCK_8X8 &&
1741 partition_none_allowed)
1742 get_block_context(x, subsize)->pred_filter_type =
1743 get_block_context(x, bsize)->mic.mbmi.interp_filter;
1638 pick_sb_modes(cpi, tile, mi_row, mi_col, &sum_rate, &sum_dist, subsize, 1744 pick_sb_modes(cpi, tile, mi_row, mi_col, &sum_rate, &sum_dist, subsize,
1639 get_block_context(x, subsize), best_rd); 1745 get_block_context(x, subsize), best_rd);
1640 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); 1746 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
1641 1747
1642 if (sum_rd < best_rd && mi_row + ms < cm->mi_rows) { 1748 if (sum_rd < best_rd && mi_row + ms < cm->mi_rows) {
1643 update_state(cpi, get_block_context(x, subsize), subsize, 0); 1749 update_state(cpi, get_block_context(x, subsize), subsize, 0);
1644 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); 1750 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
1645 1751
1646 *get_sb_index(xd, subsize) = 1; 1752 *get_sb_index(x, subsize) = 1;
1647 if (cpi->sf.adaptive_motion_search) 1753 if (cpi->sf.adaptive_motion_search)
1648 load_pred_mv(x, get_block_context(x, bsize)); 1754 load_pred_mv(x, get_block_context(x, bsize));
1755 if (cpi->sf.adaptive_pred_filter_type && bsize == BLOCK_8X8 &&
1756 partition_none_allowed)
1757 get_block_context(x, subsize)->pred_filter_type =
1758 get_block_context(x, bsize)->mic.mbmi.interp_filter;
1649 pick_sb_modes(cpi, tile, mi_row + ms, mi_col, &this_rate, 1759 pick_sb_modes(cpi, tile, mi_row + ms, mi_col, &this_rate,
1650 &this_dist, subsize, get_block_context(x, subsize), 1760 &this_dist, subsize, get_block_context(x, subsize),
1651 best_rd - sum_rd); 1761 best_rd - sum_rd);
1652 if (this_rate == INT_MAX) { 1762 if (this_rate == INT_MAX) {
1653 sum_rd = INT64_MAX; 1763 sum_rd = INT64_MAX;
1654 } else { 1764 } else {
1655 sum_rate += this_rate; 1765 sum_rate += this_rate;
1656 sum_dist += this_dist; 1766 sum_dist += this_dist;
1657 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); 1767 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
1658 } 1768 }
(...skipping 11 matching lines...) Expand all
1670 *(get_sb_partitioning(x, bsize)) = subsize; 1780 *(get_sb_partitioning(x, bsize)) = subsize;
1671 } 1781 }
1672 } 1782 }
1673 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1783 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1674 } 1784 }
1675 1785
1676 // PARTITION_VERT 1786 // PARTITION_VERT
1677 if (partition_vert_allowed && do_rect) { 1787 if (partition_vert_allowed && do_rect) {
1678 subsize = get_subsize(bsize, PARTITION_VERT); 1788 subsize = get_subsize(bsize, PARTITION_VERT);
1679 1789
1680 *get_sb_index(xd, subsize) = 0; 1790 *get_sb_index(x, subsize) = 0;
1681 if (cpi->sf.adaptive_motion_search) 1791 if (cpi->sf.adaptive_motion_search)
1682 load_pred_mv(x, get_block_context(x, bsize)); 1792 load_pred_mv(x, get_block_context(x, bsize));
1793 if (cpi->sf.adaptive_pred_filter_type && bsize == BLOCK_8X8 &&
1794 partition_none_allowed)
1795 get_block_context(x, subsize)->pred_filter_type =
1796 get_block_context(x, bsize)->mic.mbmi.interp_filter;
1683 pick_sb_modes(cpi, tile, mi_row, mi_col, &sum_rate, &sum_dist, subsize, 1797 pick_sb_modes(cpi, tile, mi_row, mi_col, &sum_rate, &sum_dist, subsize,
1684 get_block_context(x, subsize), best_rd); 1798 get_block_context(x, subsize), best_rd);
1685 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); 1799 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
1686 if (sum_rd < best_rd && mi_col + ms < cm->mi_cols) { 1800 if (sum_rd < best_rd && mi_col + ms < cm->mi_cols) {
1687 update_state(cpi, get_block_context(x, subsize), subsize, 0); 1801 update_state(cpi, get_block_context(x, subsize), subsize, 0);
1688 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize); 1802 encode_superblock(cpi, tp, 0, mi_row, mi_col, subsize);
1689 1803
1690 *get_sb_index(xd, subsize) = 1; 1804 *get_sb_index(x, subsize) = 1;
1691 if (cpi->sf.adaptive_motion_search) 1805 if (cpi->sf.adaptive_motion_search)
1692 load_pred_mv(x, get_block_context(x, bsize)); 1806 load_pred_mv(x, get_block_context(x, bsize));
1807 if (cpi->sf.adaptive_pred_filter_type && bsize == BLOCK_8X8 &&
1808 partition_none_allowed)
1809 get_block_context(x, subsize)->pred_filter_type =
1810 get_block_context(x, bsize)->mic.mbmi.interp_filter;
1693 pick_sb_modes(cpi, tile, mi_row, mi_col + ms, &this_rate, 1811 pick_sb_modes(cpi, tile, mi_row, mi_col + ms, &this_rate,
1694 &this_dist, subsize, get_block_context(x, subsize), 1812 &this_dist, subsize, get_block_context(x, subsize),
1695 best_rd - sum_rd); 1813 best_rd - sum_rd);
1696 if (this_rate == INT_MAX) { 1814 if (this_rate == INT_MAX) {
1697 sum_rd = INT64_MAX; 1815 sum_rd = INT64_MAX;
1698 } else { 1816 } else {
1699 sum_rate += this_rate; 1817 sum_rate += this_rate;
1700 sum_dist += this_dist; 1818 sum_dist += this_dist;
1701 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist); 1819 sum_rd = RDCOST(x->rdmult, x->rddiv, sum_rate, sum_dist);
1702 } 1820 }
(...skipping 11 matching lines...) Expand all
1714 *(get_sb_partitioning(x, bsize)) = subsize; 1832 *(get_sb_partitioning(x, bsize)) = subsize;
1715 } 1833 }
1716 } 1834 }
1717 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize); 1835 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, bsize);
1718 } 1836 }
1719 1837
1720 1838
1721 *rate = best_rate; 1839 *rate = best_rate;
1722 *dist = best_dist; 1840 *dist = best_dist;
1723 1841
1724 if (best_rate < INT_MAX && best_dist < INT64_MAX && do_recon) 1842 if (best_rate < INT_MAX && best_dist < INT64_MAX && do_recon) {
1725 encode_sb(cpi, tile, tp, mi_row, mi_col, bsize == BLOCK_64X64, bsize); 1843 int output_enabled = (bsize == BLOCK_64X64);
1844
1845 // Check the projected output rate for this SB against it's target
1846 // and and if necessary apply a Q delta using segmentation to get
1847 // closer to the target.
1848 if ((cpi->oxcf.aq_mode == COMPLEXITY_AQ) && cm->seg.update_map) {
1849 select_in_frame_q_segment(cpi, mi_row, mi_col, output_enabled, best_rate);
1850 }
1851 encode_sb(cpi, tile, tp, mi_row, mi_col, output_enabled, bsize);
1852 }
1726 if (bsize == BLOCK_64X64) { 1853 if (bsize == BLOCK_64X64) {
1727 assert(tp_orig < *tp); 1854 assert(tp_orig < *tp);
1728 assert(best_rate < INT_MAX); 1855 assert(best_rate < INT_MAX);
1729 assert(best_dist < INT_MAX); 1856 assert(best_dist < INT_MAX);
1730 } else { 1857 } else {
1731 assert(tp_orig == *tp); 1858 assert(tp_orig == *tp);
1732 } 1859 }
1733 } 1860 }
1734 1861
1735 // Examines 64x64 block and chooses a best reference frame 1862 // Examines 64x64 block and chooses a best reference frame
(...skipping 25 matching lines...) Expand all
1761 r += x->partition_cost[pl][PARTITION_NONE]; 1888 r += x->partition_cost[pl][PARTITION_NONE];
1762 1889
1763 *(get_sb_partitioning(x, BLOCK_64X64)) = BLOCK_64X64; 1890 *(get_sb_partitioning(x, BLOCK_64X64)) = BLOCK_64X64;
1764 cpi->set_ref_frame_mask = 0; 1891 cpi->set_ref_frame_mask = 0;
1765 } 1892 }
1766 1893
1767 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, BLOCK_64X64); 1894 restore_context(cpi, mi_row, mi_col, a, l, sa, sl, BLOCK_64X64);
1768 } 1895 }
1769 1896
1770 static void encode_sb_row(VP9_COMP *cpi, const TileInfo *const tile, 1897 static void encode_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
1771 int mi_row, TOKENEXTRA **tp, int *totalrate) { 1898 int mi_row, TOKENEXTRA **tp) {
1772 VP9_COMMON * const cm = &cpi->common; 1899 VP9_COMMON * const cm = &cpi->common;
1773 int mi_col; 1900 int mi_col;
1774 1901
1775 // Initialize the left context for the new SB row 1902 // Initialize the left context for the new SB row
1776 vpx_memset(&cpi->left_context, 0, sizeof(cpi->left_context)); 1903 vpx_memset(&cpi->left_context, 0, sizeof(cpi->left_context));
1777 vpx_memset(cpi->left_seg_context, 0, sizeof(cpi->left_seg_context)); 1904 vpx_memset(cpi->left_seg_context, 0, sizeof(cpi->left_seg_context));
1778 1905
1779 // Code each SB in the row 1906 // Code each SB in the row
1780 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end; 1907 for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
1781 mi_col += MI_BLOCK_SIZE) { 1908 mi_col += MI_BLOCK_SIZE) {
1782 int dummy_rate; 1909 int dummy_rate;
1783 int64_t dummy_dist; 1910 int64_t dummy_dist;
1784 1911
1912 BLOCK_SIZE i;
1913 MACROBLOCK *x = &cpi->mb;
1914 for (i = BLOCK_4X4; i < BLOCK_8X8; ++i) {
1915 const int num_4x4_w = num_4x4_blocks_wide_lookup[i];
1916 const int num_4x4_h = num_4x4_blocks_high_lookup[i];
1917 const int num_4x4_blk = MAX(4, num_4x4_w * num_4x4_h);
1918 for (x->sb_index = 0; x->sb_index < 4; ++x->sb_index)
1919 for (x->mb_index = 0; x->mb_index < 4; ++x->mb_index)
1920 for (x->b_index = 0; x->b_index < 16 / num_4x4_blk; ++x->b_index)
1921 get_block_context(x, i)->pred_filter_type = SWITCHABLE;
1922 }
1923
1785 vp9_zero(cpi->mb.pred_mv); 1924 vp9_zero(cpi->mb.pred_mv);
1786 1925
1787 if (cpi->sf.reference_masking) 1926 if (cpi->sf.reference_masking)
1788 rd_pick_reference_frame(cpi, tile, mi_row, mi_col); 1927 rd_pick_reference_frame(cpi, tile, mi_row, mi_col);
1789 1928
1790 if (cpi->sf.use_lastframe_partitioning || 1929 if (cpi->sf.use_lastframe_partitioning ||
1791 cpi->sf.use_one_partition_size_always ) { 1930 cpi->sf.use_one_partition_size_always ) {
1792 const int idx_str = cm->mode_info_stride * mi_row + mi_col; 1931 const int idx_str = cm->mode_info_stride * mi_row + mi_col;
1793 MODE_INFO **mi_8x8 = cm->mi_grid_visible + idx_str; 1932 MODE_INFO **mi_8x8 = cm->mi_grid_visible + idx_str;
1794 MODE_INFO **prev_mi_8x8 = cm->prev_mi_grid_visible + idx_str; 1933 MODE_INFO **prev_mi_8x8 = cm->prev_mi_grid_visible + idx_str;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 MACROBLOCK *const x = &cpi->mb; 1981 MACROBLOCK *const x = &cpi->mb;
1843 VP9_COMMON *const cm = &cpi->common; 1982 VP9_COMMON *const cm = &cpi->common;
1844 MACROBLOCKD *const xd = &x->e_mbd; 1983 MACROBLOCKD *const xd = &x->e_mbd;
1845 const int aligned_mi_cols = mi_cols_aligned_to_sb(cm->mi_cols); 1984 const int aligned_mi_cols = mi_cols_aligned_to_sb(cm->mi_cols);
1846 1985
1847 x->act_zbin_adj = 0; 1986 x->act_zbin_adj = 0;
1848 cpi->seg0_idx = 0; 1987 cpi->seg0_idx = 0;
1849 1988
1850 xd->mode_info_stride = cm->mode_info_stride; 1989 xd->mode_info_stride = cm->mode_info_stride;
1851 1990
1852 // reset intra mode contexts
1853 if (frame_is_intra_only(cm))
1854 vp9_init_mbmode_probs(cm);
1855
1856 // Copy data over into macro block data structures. 1991 // Copy data over into macro block data structures.
1857 vp9_setup_src_planes(x, cpi->Source, 0, 0); 1992 vp9_setup_src_planes(x, cpi->Source, 0, 0);
1858 1993
1859 // TODO(jkoleszar): are these initializations required? 1994 // TODO(jkoleszar): are these initializations required?
1860 setup_pre_planes(xd, 0, &cm->yv12_fb[cm->ref_frame_map[cpi->lst_fb_idx]], 1995 setup_pre_planes(xd, 0, &cm->yv12_fb[cm->ref_frame_map[cpi->lst_fb_idx]],
1861 0, 0, NULL); 1996 0, 0, NULL);
1862 setup_dst_planes(xd, get_frame_new_buffer(cm), 0, 0); 1997 setup_dst_planes(xd, get_frame_new_buffer(cm), 0, 0);
1863 1998
1864 setup_block_dptrs(&x->e_mbd, cm->subsampling_x, cm->subsampling_y); 1999 setup_block_dptrs(&x->e_mbd, cm->subsampling_x, cm->subsampling_y);
1865 2000
1866 xd->mi_8x8[0]->mbmi.mode = DC_PRED; 2001 xd->mi_8x8[0]->mbmi.mode = DC_PRED;
1867 xd->mi_8x8[0]->mbmi.uv_mode = DC_PRED; 2002 xd->mi_8x8[0]->mbmi.uv_mode = DC_PRED;
1868 2003
1869 vp9_zero(cpi->y_mode_count); 2004 vp9_zero(cpi->y_mode_count);
1870 vp9_zero(cpi->y_uv_mode_count); 2005 vp9_zero(cpi->y_uv_mode_count);
1871 vp9_zero(cm->counts.inter_mode); 2006 vp9_zero(cm->counts.inter_mode);
1872 vp9_zero(cpi->partition_count); 2007 vp9_zero(cm->counts.partition);
1873 vp9_zero(cpi->intra_inter_count); 2008 vp9_zero(cpi->intra_inter_count);
1874 vp9_zero(cpi->comp_inter_count); 2009 vp9_zero(cpi->comp_inter_count);
1875 vp9_zero(cpi->single_ref_count); 2010 vp9_zero(cpi->single_ref_count);
1876 vp9_zero(cpi->comp_ref_count); 2011 vp9_zero(cpi->comp_ref_count);
1877 vp9_zero(cm->counts.tx); 2012 vp9_zero(cm->counts.tx);
1878 vp9_zero(cm->counts.mbskip); 2013 vp9_zero(cm->counts.mbskip);
1879 2014
1880 // Note: this memset assumes above_context[0], [1] and [2] 2015 // Note: this memset assumes above_context[0], [1] and [2]
1881 // are allocated as part of the same buffer. 2016 // are allocated as part of the same buffer.
1882 vpx_memset(cpi->above_context[0], 0, 2017 vpx_memset(cpi->above_context[0], 0,
(...skipping 23 matching lines...) Expand all
1906 if (cpi->sf.tx_size_search_method == USE_LARGESTALL && 2041 if (cpi->sf.tx_size_search_method == USE_LARGESTALL &&
1907 cpi->common.tx_mode >= ALLOW_32X32) 2042 cpi->common.tx_mode >= ALLOW_32X32)
1908 cpi->common.tx_mode = ALLOW_32X32; 2043 cpi->common.tx_mode = ALLOW_32X32;
1909 } 2044 }
1910 2045
1911 static void encode_frame_internal(VP9_COMP *cpi) { 2046 static void encode_frame_internal(VP9_COMP *cpi) {
1912 int mi_row; 2047 int mi_row;
1913 MACROBLOCK * const x = &cpi->mb; 2048 MACROBLOCK * const x = &cpi->mb;
1914 VP9_COMMON * const cm = &cpi->common; 2049 VP9_COMMON * const cm = &cpi->common;
1915 MACROBLOCKD * const xd = &x->e_mbd; 2050 MACROBLOCKD * const xd = &x->e_mbd;
1916 int totalrate;
1917 2051
1918 // fprintf(stderr, "encode_frame_internal frame %d (%d) type %d\n", 2052 // fprintf(stderr, "encode_frame_internal frame %d (%d) type %d\n",
1919 // cpi->common.current_video_frame, cpi->common.show_frame, 2053 // cpi->common.current_video_frame, cpi->common.show_frame,
1920 // cm->frame_type); 2054 // cm->frame_type);
1921 2055
1922 // debug output 2056 // debug output
1923 #if DBG_PRNT_SEGMAP 2057 #if DBG_PRNT_SEGMAP
1924 { 2058 {
1925 FILE *statsfile; 2059 FILE *statsfile;
1926 statsfile = fopen("segmap2.stt", "a"); 2060 statsfile = fopen("segmap2.stt", "a");
1927 fprintf(statsfile, "\n"); 2061 fprintf(statsfile, "\n");
1928 fclose(statsfile); 2062 fclose(statsfile);
1929 } 2063 }
1930 #endif 2064 #endif
1931 2065
1932 totalrate = 0;
1933
1934 // Reset frame count of inter 0,0 motion vector usage.
1935 cpi->inter_zz_count = 0;
1936
1937 vp9_zero(cm->counts.switchable_interp); 2066 vp9_zero(cm->counts.switchable_interp);
1938 vp9_zero(cpi->tx_stepdown_count); 2067 vp9_zero(cpi->tx_stepdown_count);
1939 2068
1940 xd->mi_8x8 = cm->mi_grid_visible; 2069 xd->mi_8x8 = cm->mi_grid_visible;
1941 // required for vp9_frame_init_quantizer 2070 // required for vp9_frame_init_quantizer
1942 xd->mi_8x8[0] = cm->mi; 2071 xd->mi_8x8[0] = cm->mi;
1943 2072
1944 xd->last_mi = cm->prev_mi; 2073 xd->last_mi = cm->prev_mi;
1945 2074
1946 vp9_zero(cpi->NMVcount); 2075 vp9_zero(cpi->NMVcount);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1988 2117
1989 for (tile_row = 0; tile_row < tile_rows; tile_row++) { 2118 for (tile_row = 0; tile_row < tile_rows; tile_row++) {
1990 for (tile_col = 0; tile_col < tile_cols; tile_col++) { 2119 for (tile_col = 0; tile_col < tile_cols; tile_col++) {
1991 TileInfo tile; 2120 TileInfo tile;
1992 TOKENEXTRA *tp_old = tp; 2121 TOKENEXTRA *tp_old = tp;
1993 2122
1994 // For each row of SBs in the frame 2123 // For each row of SBs in the frame
1995 vp9_tile_init(&tile, cm, tile_row, tile_col); 2124 vp9_tile_init(&tile, cm, tile_row, tile_col);
1996 for (mi_row = tile.mi_row_start; 2125 for (mi_row = tile.mi_row_start;
1997 mi_row < tile.mi_row_end; mi_row += 8) 2126 mi_row < tile.mi_row_end; mi_row += 8)
1998 encode_sb_row(cpi, &tile, mi_row, &tp, &totalrate); 2127 encode_sb_row(cpi, &tile, mi_row, &tp);
1999 2128
2000 cpi->tok_count[tile_row][tile_col] = (unsigned int)(tp - tp_old); 2129 cpi->tok_count[tile_row][tile_col] = (unsigned int)(tp - tp_old);
2001 assert(tp - cpi->tok <= get_token_alloc(cm->mb_rows, cm->mb_cols)); 2130 assert(tp - cpi->tok <= get_token_alloc(cm->mb_rows, cm->mb_cols));
2002 } 2131 }
2003 } 2132 }
2004 } 2133 }
2005 2134
2006 vpx_usec_timer_mark(&emr_timer); 2135 vpx_usec_timer_mark(&emr_timer);
2007 cpi->time_encode_sb_row += vpx_usec_timer_elapsed(&emr_timer); 2136 cpi->time_encode_sb_row += vpx_usec_timer_elapsed(&emr_timer);
2008 } 2137 }
2009 2138
2010 if (cpi->sf.skip_encode_sb) { 2139 if (cpi->sf.skip_encode_sb) {
2011 int j; 2140 int j;
2012 unsigned int intra_count = 0, inter_count = 0; 2141 unsigned int intra_count = 0, inter_count = 0;
2013 for (j = 0; j < INTRA_INTER_CONTEXTS; ++j) { 2142 for (j = 0; j < INTRA_INTER_CONTEXTS; ++j) {
2014 intra_count += cpi->intra_inter_count[j][0]; 2143 intra_count += cpi->intra_inter_count[j][0];
2015 inter_count += cpi->intra_inter_count[j][1]; 2144 inter_count += cpi->intra_inter_count[j][1];
2016 } 2145 }
2017 cpi->sf.skip_encode_frame = ((intra_count << 2) < inter_count); 2146 cpi->sf.skip_encode_frame = ((intra_count << 2) < inter_count);
2018 cpi->sf.skip_encode_frame &= (cm->frame_type != KEY_FRAME); 2147 cpi->sf.skip_encode_frame &= (cm->frame_type != KEY_FRAME);
2019 cpi->sf.skip_encode_frame &= cm->show_frame; 2148 cpi->sf.skip_encode_frame &= cm->show_frame;
2020 } else { 2149 } else {
2021 cpi->sf.skip_encode_frame = 0; 2150 cpi->sf.skip_encode_frame = 0;
2022 } 2151 }
2023 2152
2024 // 256 rate units to the bit,
2025 // projected_frame_size in units of BYTES
2026 cpi->projected_frame_size = totalrate >> 8;
2027
2028 #if 0 2153 #if 0
2029 // Keep record of the total distortion this time around for future use 2154 // Keep record of the total distortion this time around for future use
2030 cpi->last_frame_distortion = cpi->frame_distortion; 2155 cpi->last_frame_distortion = cpi->frame_distortion;
2031 #endif 2156 #endif
2032 } 2157 }
2033 2158
2034 static int check_dual_ref_flags(VP9_COMP *cpi) { 2159 static int check_dual_ref_flags(VP9_COMP *cpi) {
2035 const int ref_flags = cpi->ref_frame_flags; 2160 const int ref_flags = cpi->ref_frame_flags;
2036 2161
2037 if (vp9_segfeature_active(&cpi->common.seg, 1, SEG_LVL_REF_FRAME)) { 2162 if (vp9_segfeature_active(&cpi->common.seg, 1, SEG_LVL_REF_FRAME)) {
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
2218 * worked best for that type of frame in the past. 2343 * worked best for that type of frame in the past.
2219 * It also predicts whether another coding mode would have worked 2344 * It also predicts whether another coding mode would have worked
2220 * better that this coding mode. If that is the case, it remembers 2345 * better that this coding mode. If that is the case, it remembers
2221 * that for subsequent frames. 2346 * that for subsequent frames.
2222 * It does the same analysis for transform size selection also. 2347 * It does the same analysis for transform size selection also.
2223 */ 2348 */
2224 int frame_type = get_frame_type(cpi); 2349 int frame_type = get_frame_type(cpi);
2225 2350
2226 /* prediction (compound, single or hybrid) mode selection */ 2351 /* prediction (compound, single or hybrid) mode selection */
2227 if (frame_type == 3 || !cm->allow_comp_inter_inter) 2352 if (frame_type == 3 || !cm->allow_comp_inter_inter)
2228 pred_type = SINGLE_PREDICTION_ONLY; 2353 pred_type = SINGLE_REFERENCE;
2229 else if (cpi->rd_prediction_type_threshes[frame_type][1] 2354 else if (cpi->rd_prediction_type_threshes[frame_type][1]
2230 > cpi->rd_prediction_type_threshes[frame_type][0] 2355 > cpi->rd_prediction_type_threshes[frame_type][0]
2231 && cpi->rd_prediction_type_threshes[frame_type][1] 2356 && cpi->rd_prediction_type_threshes[frame_type][1]
2232 > cpi->rd_prediction_type_threshes[frame_type][2] 2357 > cpi->rd_prediction_type_threshes[frame_type][2]
2233 && check_dual_ref_flags(cpi) && cpi->static_mb_pct == 100) 2358 && check_dual_ref_flags(cpi) && cpi->static_mb_pct == 100)
2234 pred_type = COMP_PREDICTION_ONLY; 2359 pred_type = COMPOUND_REFERENCE;
2235 else if (cpi->rd_prediction_type_threshes[frame_type][0] 2360 else if (cpi->rd_prediction_type_threshes[frame_type][0]
2236 > cpi->rd_prediction_type_threshes[frame_type][2]) 2361 > cpi->rd_prediction_type_threshes[frame_type][2])
2237 pred_type = SINGLE_PREDICTION_ONLY; 2362 pred_type = SINGLE_REFERENCE;
2238 else 2363 else
2239 pred_type = HYBRID_PREDICTION; 2364 pred_type = REFERENCE_MODE_SELECT;
2240 2365
2241 /* filter type selection */ 2366 /* filter type selection */
2242 // FIXME(rbultje) for some odd reason, we often select smooth_filter 2367 // FIXME(rbultje) for some odd reason, we often select smooth_filter
2243 // as default filter for ARF overlay frames. This is a REALLY BAD 2368 // as default filter for ARF overlay frames. This is a REALLY BAD
2244 // IDEA so we explicitly disable it here. 2369 // IDEA so we explicitly disable it here.
2245 if (frame_type != 3 && 2370 if (frame_type != 3 &&
2246 cpi->rd_filter_threshes[frame_type][1] > 2371 cpi->rd_filter_threshes[frame_type][1] >
2247 cpi->rd_filter_threshes[frame_type][0] && 2372 cpi->rd_filter_threshes[frame_type][0] &&
2248 cpi->rd_filter_threshes[frame_type][1] > 2373 cpi->rd_filter_threshes[frame_type][1] >
2249 cpi->rd_filter_threshes[frame_type][2] && 2374 cpi->rd_filter_threshes[frame_type][2] &&
(...skipping 12 matching lines...) Expand all
2262 filter_type = SWITCHABLE; 2387 filter_type = SWITCHABLE;
2263 } 2388 }
2264 2389
2265 cpi->mb.e_mbd.lossless = 0; 2390 cpi->mb.e_mbd.lossless = 0;
2266 if (cpi->oxcf.lossless) { 2391 if (cpi->oxcf.lossless) {
2267 cpi->mb.e_mbd.lossless = 1; 2392 cpi->mb.e_mbd.lossless = 1;
2268 } 2393 }
2269 2394
2270 /* transform size selection (4x4, 8x8, 16x16 or select-per-mb) */ 2395 /* transform size selection (4x4, 8x8, 16x16 or select-per-mb) */
2271 select_tx_mode(cpi); 2396 select_tx_mode(cpi);
2272 cpi->common.comp_pred_mode = pred_type; 2397 cpi->common.reference_mode = pred_type;
2273 cpi->common.mcomp_filter_type = filter_type; 2398 cpi->common.mcomp_filter_type = filter_type;
2274 encode_frame_internal(cpi); 2399 encode_frame_internal(cpi);
2275 2400
2276 for (i = 0; i < NB_PREDICTION_TYPES; ++i) { 2401 for (i = 0; i < REFERENCE_MODES; ++i) {
2277 const int diff = (int) (cpi->rd_comp_pred_diff[i] / cpi->common.MBs); 2402 const int diff = (int) (cpi->rd_comp_pred_diff[i] / cpi->common.MBs);
2278 cpi->rd_prediction_type_threshes[frame_type][i] += diff; 2403 cpi->rd_prediction_type_threshes[frame_type][i] += diff;
2279 cpi->rd_prediction_type_threshes[frame_type][i] >>= 1; 2404 cpi->rd_prediction_type_threshes[frame_type][i] >>= 1;
2280 } 2405 }
2281 2406
2282 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) { 2407 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; i++) {
2283 const int64_t diff = cpi->rd_filter_diff[i] / cpi->common.MBs; 2408 const int64_t diff = cpi->rd_filter_diff[i] / cpi->common.MBs;
2284 cpi->rd_filter_threshes[frame_type][i] = 2409 cpi->rd_filter_threshes[frame_type][i] =
2285 (cpi->rd_filter_threshes[frame_type][i] + diff) / 2; 2410 (cpi->rd_filter_threshes[frame_type][i] + diff) / 2;
2286 } 2411 }
2287 2412
2288 for (i = 0; i < TX_MODES; ++i) { 2413 for (i = 0; i < TX_MODES; ++i) {
2289 int64_t pd = cpi->rd_tx_select_diff[i]; 2414 int64_t pd = cpi->rd_tx_select_diff[i];
2290 int diff; 2415 int diff;
2291 if (i == TX_MODE_SELECT) 2416 if (i == TX_MODE_SELECT)
2292 pd -= RDCOST(cpi->mb.rdmult, cpi->mb.rddiv, 2417 pd -= RDCOST(cpi->mb.rdmult, cpi->mb.rddiv,
2293 2048 * (TX_SIZES - 1), 0); 2418 2048 * (TX_SIZES - 1), 0);
2294 diff = (int) (pd / cpi->common.MBs); 2419 diff = (int) (pd / cpi->common.MBs);
2295 cpi->rd_tx_select_threshes[frame_type][i] += diff; 2420 cpi->rd_tx_select_threshes[frame_type][i] += diff;
2296 cpi->rd_tx_select_threshes[frame_type][i] /= 2; 2421 cpi->rd_tx_select_threshes[frame_type][i] /= 2;
2297 } 2422 }
2298 2423
2299 if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { 2424 if (cpi->common.reference_mode == REFERENCE_MODE_SELECT) {
2300 int single_count_zero = 0; 2425 int single_count_zero = 0;
2301 int comp_count_zero = 0; 2426 int comp_count_zero = 0;
2302 2427
2303 for (i = 0; i < COMP_INTER_CONTEXTS; i++) { 2428 for (i = 0; i < COMP_INTER_CONTEXTS; i++) {
2304 single_count_zero += cpi->comp_inter_count[i][0]; 2429 single_count_zero += cpi->comp_inter_count[i][0];
2305 comp_count_zero += cpi->comp_inter_count[i][1]; 2430 comp_count_zero += cpi->comp_inter_count[i][1];
2306 } 2431 }
2307 2432
2308 if (comp_count_zero == 0) { 2433 if (comp_count_zero == 0) {
2309 cpi->common.comp_pred_mode = SINGLE_PREDICTION_ONLY; 2434 cpi->common.reference_mode = SINGLE_REFERENCE;
2310 vp9_zero(cpi->comp_inter_count); 2435 vp9_zero(cpi->comp_inter_count);
2311 } else if (single_count_zero == 0) { 2436 } else if (single_count_zero == 0) {
2312 cpi->common.comp_pred_mode = COMP_PREDICTION_ONLY; 2437 cpi->common.reference_mode = COMPOUND_REFERENCE;
2313 vp9_zero(cpi->comp_inter_count); 2438 vp9_zero(cpi->comp_inter_count);
2314 } 2439 }
2315 } 2440 }
2316 2441
2317 if (cpi->common.tx_mode == TX_MODE_SELECT) { 2442 if (cpi->common.tx_mode == TX_MODE_SELECT) {
2318 int count4x4 = 0; 2443 int count4x4 = 0;
2319 int count8x8_lp = 0, count8x8_8x8p = 0; 2444 int count8x8_lp = 0, count8x8_8x8p = 0;
2320 int count16x16_16x16p = 0, count16x16_lp = 0; 2445 int count16x16_16x16p = 0, count16x16_lp = 0;
2321 int count32x32 = 0; 2446 int count32x32 = 0;
2322 2447
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 #endif 2519 #endif
2395 } 2520 }
2396 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled, 2521 static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled,
2397 int mi_row, int mi_col, BLOCK_SIZE bsize) { 2522 int mi_row, int mi_col, BLOCK_SIZE bsize) {
2398 VP9_COMMON * const cm = &cpi->common; 2523 VP9_COMMON * const cm = &cpi->common;
2399 MACROBLOCK * const x = &cpi->mb; 2524 MACROBLOCK * const x = &cpi->mb;
2400 MACROBLOCKD * const xd = &x->e_mbd; 2525 MACROBLOCKD * const xd = &x->e_mbd;
2401 MODE_INFO **mi_8x8 = xd->mi_8x8; 2526 MODE_INFO **mi_8x8 = xd->mi_8x8;
2402 MODE_INFO *mi = mi_8x8[0]; 2527 MODE_INFO *mi = mi_8x8[0];
2403 MB_MODE_INFO *mbmi = &mi->mbmi; 2528 MB_MODE_INFO *mbmi = &mi->mbmi;
2529 PICK_MODE_CONTEXT *ctx = get_block_context(x, bsize);
2404 unsigned int segment_id = mbmi->segment_id; 2530 unsigned int segment_id = mbmi->segment_id;
2405 const int mis = cm->mode_info_stride; 2531 const int mis = cm->mode_info_stride;
2406 const int mi_width = num_8x8_blocks_wide_lookup[bsize]; 2532 const int mi_width = num_8x8_blocks_wide_lookup[bsize];
2407 const int mi_height = num_8x8_blocks_high_lookup[bsize]; 2533 const int mi_height = num_8x8_blocks_high_lookup[bsize];
2534 x->skip_recode = !x->select_txfm_size && mbmi->sb_type >= BLOCK_8X8 &&
2535 (cpi->oxcf.aq_mode != COMPLEXITY_AQ);
2536 x->skip_optimize = ctx->is_coded;
2537 ctx->is_coded = 1;
2408 x->use_lp32x32fdct = cpi->sf.use_lp32x32fdct; 2538 x->use_lp32x32fdct = cpi->sf.use_lp32x32fdct;
2409 x->skip_encode = (!output_enabled && cpi->sf.skip_encode_frame && 2539 x->skip_encode = (!output_enabled && cpi->sf.skip_encode_frame &&
2410 xd->q_index < QIDX_SKIP_THRESH); 2540 x->q_index < QIDX_SKIP_THRESH);
2411 if (x->skip_encode) 2541 if (x->skip_encode)
2412 return; 2542 return;
2413 2543
2414 if (cm->frame_type == KEY_FRAME) { 2544 if (cm->frame_type == KEY_FRAME) {
2415 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) { 2545 if (cpi->oxcf.tuning == VP8_TUNE_SSIM) {
2416 adjust_act_zbin(cpi, x); 2546 adjust_act_zbin(cpi, x);
2417 vp9_update_zbin_extra(cpi, x); 2547 vp9_update_zbin_extra(cpi, x);
2418 } 2548 }
2419 } else { 2549 } else {
2420 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm); 2550 vp9_setup_interp_filters(xd, mbmi->interp_filter, cm);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2485 cm->counts.mbskip[mb_skip_context][1]++; 2615 cm->counts.mbskip[mb_skip_context][1]++;
2486 reset_skip_context(xd, MAX(bsize, BLOCK_8X8)); 2616 reset_skip_context(xd, MAX(bsize, BLOCK_8X8));
2487 } 2617 }
2488 2618
2489 if (output_enabled) { 2619 if (output_enabled) {
2490 if (cm->tx_mode == TX_MODE_SELECT && 2620 if (cm->tx_mode == TX_MODE_SELECT &&
2491 mbmi->sb_type >= BLOCK_8X8 && 2621 mbmi->sb_type >= BLOCK_8X8 &&
2492 !(is_inter_block(mbmi) && 2622 !(is_inter_block(mbmi) &&
2493 (mbmi->skip_coeff || 2623 (mbmi->skip_coeff ||
2494 vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)))) { 2624 vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)))) {
2495 const uint8_t context = vp9_get_pred_context_tx_size(xd); 2625 ++get_tx_counts(max_txsize_lookup[bsize], vp9_get_tx_size_context(xd),
2496 ++get_tx_counts(bsize, context, &cm->counts.tx)[mbmi->tx_size]; 2626 &cm->counts.tx)[mbmi->tx_size];
2497 } else { 2627 } else {
2498 int x, y; 2628 int x, y;
2499 TX_SIZE sz = tx_mode_to_biggest_tx_size[cm->tx_mode]; 2629 TX_SIZE tx_size;
2500 assert(sizeof(tx_mode_to_biggest_tx_size) /
2501 sizeof(tx_mode_to_biggest_tx_size[0]) == TX_MODES);
2502 // The new intra coding scheme requires no change of transform size 2630 // The new intra coding scheme requires no change of transform size
2503 if (is_inter_block(&mi->mbmi)) { 2631 if (is_inter_block(&mi->mbmi)) {
2504 if (sz == TX_32X32 && bsize < BLOCK_32X32) 2632 tx_size = MIN(tx_mode_to_biggest_tx_size[cm->tx_mode],
2505 sz = TX_16X16; 2633 max_txsize_lookup[bsize]);
2506 if (sz == TX_16X16 && bsize < BLOCK_16X16)
2507 sz = TX_8X8;
2508 if (sz == TX_8X8 && bsize < BLOCK_8X8)
2509 sz = TX_4X4;
2510 } else if (bsize >= BLOCK_8X8) {
2511 sz = mbmi->tx_size;
2512 } else { 2634 } else {
2513 sz = TX_4X4; 2635 tx_size = (bsize >= BLOCK_8X8) ? mbmi->tx_size : TX_4X4;
2514 } 2636 }
2515 2637
2516 for (y = 0; y < mi_height; y++) 2638 for (y = 0; y < mi_height; y++)
2517 for (x = 0; x < mi_width; x++) 2639 for (x = 0; x < mi_width; x++)
2518 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows) 2640 if (mi_col + x < cm->mi_cols && mi_row + y < cm->mi_rows)
2519 mi_8x8[mis * y + x]->mbmi.tx_size = sz; 2641 mi_8x8[mis * y + x]->mbmi.tx_size = tx_size;
2520 } 2642 }
2521 } 2643 }
2522 } 2644 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_dct.c ('k') | source/libvpx/vp9/encoder/vp9_encodeintra.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698