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

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

Issue 1124333011: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: only update to last nights LKGR Created 5 years, 7 months 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.c ('k') | source/libvpx/vp9/encoder/vp9_rdopt.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
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 ENTROPY_CONTEXT t_left[16]) { 412 ENTROPY_CONTEXT t_left[16]) {
413 const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd); 413 const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
414 const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize]; 414 const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
415 const int num_4x4_h = num_4x4_blocks_high_lookup[plane_bsize]; 415 const int num_4x4_h = num_4x4_blocks_high_lookup[plane_bsize];
416 const ENTROPY_CONTEXT *const above = pd->above_context; 416 const ENTROPY_CONTEXT *const above = pd->above_context;
417 const ENTROPY_CONTEXT *const left = pd->left_context; 417 const ENTROPY_CONTEXT *const left = pd->left_context;
418 418
419 int i; 419 int i;
420 switch (tx_size) { 420 switch (tx_size) {
421 case TX_4X4: 421 case TX_4X4:
422 vpx_memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w); 422 memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
423 vpx_memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h); 423 memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
424 break; 424 break;
425 case TX_8X8: 425 case TX_8X8:
426 for (i = 0; i < num_4x4_w; i += 2) 426 for (i = 0; i < num_4x4_w; i += 2)
427 t_above[i] = !!*(const uint16_t *)&above[i]; 427 t_above[i] = !!*(const uint16_t *)&above[i];
428 for (i = 0; i < num_4x4_h; i += 2) 428 for (i = 0; i < num_4x4_h; i += 2)
429 t_left[i] = !!*(const uint16_t *)&left[i]; 429 t_left[i] = !!*(const uint16_t *)&left[i];
430 break; 430 break;
431 case TX_16X16: 431 case TX_16X16:
432 for (i = 0; i < num_4x4_w; i += 4) 432 for (i = 0; i < num_4x4_w; i += 4)
433 t_above[i] = !!*(const uint32_t *)&above[i]; 433 t_above[i] = !!*(const uint32_t *)&above[i];
434 for (i = 0; i < num_4x4_h; i += 4) 434 for (i = 0; i < num_4x4_h; i += 4)
435 t_left[i] = !!*(const uint32_t *)&left[i]; 435 t_left[i] = !!*(const uint32_t *)&left[i];
436 break; 436 break;
437 case TX_32X32: 437 case TX_32X32:
438 for (i = 0; i < num_4x4_w; i += 8) 438 for (i = 0; i < num_4x4_w; i += 8)
439 t_above[i] = !!*(const uint64_t *)&above[i]; 439 t_above[i] = !!*(const uint64_t *)&above[i];
440 for (i = 0; i < num_4x4_h; i += 8) 440 for (i = 0; i < num_4x4_h; i += 8)
441 t_left[i] = !!*(const uint64_t *)&left[i]; 441 t_left[i] = !!*(const uint64_t *)&left[i];
442 break; 442 break;
443 default: 443 default:
444 assert(0 && "Invalid transform size."); 444 assert(0 && "Invalid transform size.");
445 break; 445 break;
446 } 446 }
447 } 447 }
448 448
449 void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x, 449 void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x,
450 uint8_t *ref_y_buffer, int ref_y_stride, 450 uint8_t *ref_y_buffer, int ref_y_stride,
451 int ref_frame, BLOCK_SIZE block_size) { 451 int ref_frame, BLOCK_SIZE block_size) {
452 MACROBLOCKD *xd = &x->e_mbd; 452 MACROBLOCKD *xd = &x->e_mbd;
453 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; 453 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
454 int i; 454 int i;
455 int zero_seen = 0; 455 int zero_seen = 0;
456 int best_index = 0; 456 int best_index = 0;
457 int best_sad = INT_MAX; 457 int best_sad = INT_MAX;
458 int this_sad = INT_MAX; 458 int this_sad = INT_MAX;
459 int max_mv = 0; 459 int max_mv = 0;
460 int near_same_nearest;
460 uint8_t *src_y_ptr = x->plane[0].src.buf; 461 uint8_t *src_y_ptr = x->plane[0].src.buf;
461 uint8_t *ref_y_ptr; 462 uint8_t *ref_y_ptr;
462 const int num_mv_refs = MAX_MV_REF_CANDIDATES + 463 const int num_mv_refs = MAX_MV_REF_CANDIDATES +
463 (cpi->sf.adaptive_motion_search && 464 (cpi->sf.adaptive_motion_search &&
464 block_size < x->max_partition_size); 465 block_size < x->max_partition_size);
465 466
466 MV pred_mv[3]; 467 MV pred_mv[3];
467 pred_mv[0] = mbmi->ref_mvs[ref_frame][0].as_mv; 468 pred_mv[0] = mbmi->ref_mvs[ref_frame][0].as_mv;
468 pred_mv[1] = mbmi->ref_mvs[ref_frame][1].as_mv; 469 pred_mv[1] = mbmi->ref_mvs[ref_frame][1].as_mv;
469 pred_mv[2] = x->pred_mv[ref_frame]; 470 pred_mv[2] = x->pred_mv[ref_frame];
470 assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0]))); 471 assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
471 472
473 near_same_nearest =
474 mbmi->ref_mvs[ref_frame][0].as_int == mbmi->ref_mvs[ref_frame][1].as_int;
472 // Get the sad for each candidate reference mv. 475 // Get the sad for each candidate reference mv.
473 for (i = 0; i < num_mv_refs; ++i) { 476 for (i = 0; i < num_mv_refs; ++i) {
474 const MV *this_mv = &pred_mv[i]; 477 const MV *this_mv = &pred_mv[i];
478 int fp_row, fp_col;
475 479
480 if (i == 1 && near_same_nearest)
481 continue;
482 fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
483 fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
476 max_mv = MAX(max_mv, MAX(abs(this_mv->row), abs(this_mv->col)) >> 3); 484 max_mv = MAX(max_mv, MAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
477 if (is_zero_mv(this_mv) && zero_seen) 485
486 if (fp_row ==0 && fp_col == 0 && zero_seen)
478 continue; 487 continue;
488 zero_seen |= (fp_row ==0 && fp_col == 0);
479 489
480 zero_seen |= is_zero_mv(this_mv); 490 ref_y_ptr =&ref_y_buffer[ref_y_stride * fp_row + fp_col];
481
482 ref_y_ptr =
483 &ref_y_buffer[ref_y_stride * (this_mv->row >> 3) + (this_mv->col >> 3)];
484
485 // Find sad for current vector. 491 // Find sad for current vector.
486 this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride, 492 this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
487 ref_y_ptr, ref_y_stride); 493 ref_y_ptr, ref_y_stride);
488
489 // Note if it is the best so far. 494 // Note if it is the best so far.
490 if (this_sad < best_sad) { 495 if (this_sad < best_sad) {
491 best_sad = this_sad; 496 best_sad = this_sad;
492 best_index = i; 497 best_index = i;
493 } 498 }
494 } 499 }
495 500
496 // Note the index of the mv that worked best in the reference list. 501 // Note the index of the mv that worked best in the reference list.
497 x->mv_best_ref_index[ref_frame] = best_index; 502 x->mv_best_ref_index[ref_frame] = best_index;
498 x->max_mv_context[ref_frame] = max_mv; 503 x->max_mv_context[ref_frame] = max_mv;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 int ref_frame) { 543 int ref_frame) {
539 const VP9_COMMON *const cm = &cpi->common; 544 const VP9_COMMON *const cm = &cpi->common;
540 const int scaled_idx = cpi->scaled_ref_idx[ref_frame - 1]; 545 const int scaled_idx = cpi->scaled_ref_idx[ref_frame - 1];
541 const int ref_idx = get_ref_frame_buf_idx(cpi, ref_frame); 546 const int ref_idx = get_ref_frame_buf_idx(cpi, ref_frame);
542 return 547 return
543 (scaled_idx != ref_idx && scaled_idx != INVALID_IDX) ? 548 (scaled_idx != ref_idx && scaled_idx != INVALID_IDX) ?
544 &cm->buffer_pool->frame_bufs[scaled_idx].buf : NULL; 549 &cm->buffer_pool->frame_bufs[scaled_idx].buf : NULL;
545 } 550 }
546 551
547 int vp9_get_switchable_rate(const VP9_COMP *cpi, const MACROBLOCKD *const xd) { 552 int vp9_get_switchable_rate(const VP9_COMP *cpi, const MACROBLOCKD *const xd) {
548 const MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; 553 const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
549 const int ctx = vp9_get_pred_context_switchable_interp(xd); 554 const int ctx = vp9_get_pred_context_switchable_interp(xd);
550 return SWITCHABLE_INTERP_RATE_FACTOR * 555 return SWITCHABLE_INTERP_RATE_FACTOR *
551 cpi->switchable_interp_costs[ctx][mbmi->interp_filter]; 556 cpi->switchable_interp_costs[ctx][mbmi->interp_filter];
552 } 557 }
553 558
554 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) { 559 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
555 int i; 560 int i;
556 RD_OPT *const rd = &cpi->rd; 561 RD_OPT *const rd = &cpi->rd;
557 SPEED_FEATURES *const sf = &cpi->sf; 562 SPEED_FEATURES *const sf = &cpi->sf;
558 563
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 rd->thresh_mult[THR_D207_PRED] += 2500; 609 rd->thresh_mult[THR_D207_PRED] += 2500;
605 rd->thresh_mult[THR_D63_PRED] += 2500; 610 rd->thresh_mult[THR_D63_PRED] += 2500;
606 } 611 }
607 612
608 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { 613 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
609 static const int thresh_mult[2][MAX_REFS] = 614 static const int thresh_mult[2][MAX_REFS] =
610 {{2500, 2500, 2500, 4500, 4500, 2500}, 615 {{2500, 2500, 2500, 4500, 4500, 2500},
611 {2000, 2000, 2000, 4000, 4000, 2000}}; 616 {2000, 2000, 2000, 4000, 4000, 2000}};
612 RD_OPT *const rd = &cpi->rd; 617 RD_OPT *const rd = &cpi->rd;
613 const int idx = cpi->oxcf.mode == BEST; 618 const int idx = cpi->oxcf.mode == BEST;
614 vpx_memcpy(rd->thresh_mult_sub8x8, thresh_mult[idx], 619 memcpy(rd->thresh_mult_sub8x8, thresh_mult[idx], sizeof(thresh_mult[idx]));
615 sizeof(thresh_mult[idx]));
616 } 620 }
617 621
618 void vp9_update_rd_thresh_fact(int (*factor_buf)[MAX_MODES], int rd_thresh, 622 void vp9_update_rd_thresh_fact(int (*factor_buf)[MAX_MODES], int rd_thresh,
619 int bsize, int best_mode_index) { 623 int bsize, int best_mode_index) {
620 if (rd_thresh > 0) { 624 if (rd_thresh > 0) {
621 const int top_mode = bsize < BLOCK_8X8 ? MAX_REFS : MAX_MODES; 625 const int top_mode = bsize < BLOCK_8X8 ? MAX_REFS : MAX_MODES;
622 int mode; 626 int mode;
623 for (mode = 0; mode < top_mode; ++mode) { 627 for (mode = 0; mode < top_mode; ++mode) {
624 const BLOCK_SIZE min_size = MAX(bsize - 1, BLOCK_4X4); 628 const BLOCK_SIZE min_size = MAX(bsize - 1, BLOCK_4X4);
625 const BLOCK_SIZE max_size = MIN(bsize + 2, BLOCK_64X64); 629 const BLOCK_SIZE max_size = MIN(bsize + 2, BLOCK_64X64);
(...skipping 24 matching lines...) Expand all
650 return ROUND_POWER_OF_TWO(5 * q, 2); 654 return ROUND_POWER_OF_TWO(5 * q, 2);
651 default: 655 default:
652 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); 656 assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
653 return -1; 657 return -1;
654 } 658 }
655 #else 659 #else
656 return 20 * q; 660 return 20 * q;
657 #endif // CONFIG_VP9_HIGHBITDEPTH 661 #endif // CONFIG_VP9_HIGHBITDEPTH
658 } 662 }
659 663
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.c ('k') | source/libvpx/vp9/encoder/vp9_rdopt.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698