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

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

Issue 554673004: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.c ('k') | source/libvpx/vp9/encoder/vp9_rdopt.c » ('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 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 assert(0 && "Invalid transform size."); 357 assert(0 && "Invalid transform size.");
358 break; 358 break;
359 } 359 }
360 } 360 }
361 361
362 void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x, 362 void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x,
363 uint8_t *ref_y_buffer, int ref_y_stride, 363 uint8_t *ref_y_buffer, int ref_y_stride,
364 int ref_frame, BLOCK_SIZE block_size) { 364 int ref_frame, BLOCK_SIZE block_size) {
365 MACROBLOCKD *xd = &x->e_mbd; 365 MACROBLOCKD *xd = &x->e_mbd;
366 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 366 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
367 int_mv this_mv;
368 int i; 367 int i;
369 int zero_seen = 0; 368 int zero_seen = 0;
370 int best_index = 0; 369 int best_index = 0;
371 int best_sad = INT_MAX; 370 int best_sad = INT_MAX;
372 int this_sad = INT_MAX; 371 int this_sad = INT_MAX;
373 int max_mv = 0; 372 int max_mv = 0;
374
375 uint8_t *src_y_ptr = x->plane[0].src.buf; 373 uint8_t *src_y_ptr = x->plane[0].src.buf;
376 uint8_t *ref_y_ptr; 374 uint8_t *ref_y_ptr;
377 int row_offset, col_offset; 375 const int num_mv_refs = MAX_MV_REF_CANDIDATES +
378 int num_mv_refs = MAX_MV_REF_CANDIDATES +
379 (cpi->sf.adaptive_motion_search && 376 (cpi->sf.adaptive_motion_search &&
380 cpi->common.show_frame &&
381 block_size < cpi->sf.max_partition_size); 377 block_size < cpi->sf.max_partition_size);
382 378
383 MV pred_mv[3]; 379 MV pred_mv[3];
384 pred_mv[0] = mbmi->ref_mvs[ref_frame][0].as_mv; 380 pred_mv[0] = mbmi->ref_mvs[ref_frame][0].as_mv;
385 pred_mv[1] = mbmi->ref_mvs[ref_frame][1].as_mv; 381 pred_mv[1] = mbmi->ref_mvs[ref_frame][1].as_mv;
386 pred_mv[2] = x->pred_mv[ref_frame]; 382 pred_mv[2] = x->pred_mv[ref_frame];
387 383
388 // Get the sad for each candidate reference mv. 384 // Get the sad for each candidate reference mv.
389 for (i = 0; i < num_mv_refs; ++i) { 385 for (i = 0; i < num_mv_refs; ++i) {
390 this_mv.as_mv = pred_mv[i]; 386 const MV *this_mv = &pred_mv[i];
391 387
392 max_mv = MAX(max_mv, 388 max_mv = MAX(max_mv, MAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
393 MAX(abs(this_mv.as_mv.row), abs(this_mv.as_mv.col)) >> 3); 389 if (is_zero_mv(this_mv) && zero_seen)
394 // Only need to check zero mv once.
395 if (!this_mv.as_int && zero_seen)
396 continue; 390 continue;
397 391
398 zero_seen = zero_seen || !this_mv.as_int; 392 zero_seen |= is_zero_mv(this_mv);
399 393
400 row_offset = this_mv.as_mv.row >> 3; 394 ref_y_ptr =
401 col_offset = this_mv.as_mv.col >> 3; 395 &ref_y_buffer[ref_y_stride * (this_mv->row >> 3) + (this_mv->col >> 3)];
402 ref_y_ptr = ref_y_buffer + (ref_y_stride * row_offset) + col_offset;
403 396
404 // Find sad for current vector. 397 // Find sad for current vector.
405 this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride, 398 this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
406 ref_y_ptr, ref_y_stride); 399 ref_y_ptr, ref_y_stride);
407 400
408 // Note if it is the best so far. 401 // Note if it is the best so far.
409 if (this_sad < best_sad) { 402 if (this_sad < best_sad) {
410 best_sad = this_sad; 403 best_sad = this_sad;
411 best_index = i; 404 best_index = i;
412 } 405 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 cpi->switchable_interp_costs[ctx][mbmi->interp_filter]; 448 cpi->switchable_interp_costs[ctx][mbmi->interp_filter];
456 } 449 }
457 450
458 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) { 451 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
459 int i; 452 int i;
460 RD_OPT *const rd = &cpi->rd; 453 RD_OPT *const rd = &cpi->rd;
461 SPEED_FEATURES *const sf = &cpi->sf; 454 SPEED_FEATURES *const sf = &cpi->sf;
462 455
463 // Set baseline threshold values. 456 // Set baseline threshold values.
464 for (i = 0; i < MAX_MODES; ++i) 457 for (i = 0; i < MAX_MODES; ++i)
465 rd->thresh_mult[i] = is_best_mode(cpi->oxcf.mode) ? -500 : 0; 458 rd->thresh_mult[i] = cpi->oxcf.mode == BEST ? -500 : 0;
466 459
467 rd->thresh_mult[THR_NEARESTMV] = 0; 460 rd->thresh_mult[THR_NEARESTMV] = 0;
468 rd->thresh_mult[THR_NEARESTG] = 0; 461 rd->thresh_mult[THR_NEARESTG] = 0;
469 rd->thresh_mult[THR_NEARESTA] = 0; 462 rd->thresh_mult[THR_NEARESTA] = 0;
470 463
471 rd->thresh_mult[THR_DC] += 1000; 464 rd->thresh_mult[THR_DC] += 1000;
472 465
473 rd->thresh_mult[THR_NEWMV] += 1000; 466 rd->thresh_mult[THR_NEWMV] += 1000;
474 rd->thresh_mult[THR_NEWA] += 1000; 467 rd->thresh_mult[THR_NEWA] += 1000;
475 rd->thresh_mult[THR_NEWG] += 1000; 468 rd->thresh_mult[THR_NEWG] += 1000;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 rd->thresh_mult[THR_COMP_NEWGA ] = INT_MAX; 534 rd->thresh_mult[THR_COMP_NEWGA ] = INT_MAX;
542 } 535 }
543 } 536 }
544 537
545 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { 538 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
546 const SPEED_FEATURES *const sf = &cpi->sf; 539 const SPEED_FEATURES *const sf = &cpi->sf;
547 RD_OPT *const rd = &cpi->rd; 540 RD_OPT *const rd = &cpi->rd;
548 int i; 541 int i;
549 542
550 for (i = 0; i < MAX_REFS; ++i) 543 for (i = 0; i < MAX_REFS; ++i)
551 rd->thresh_mult_sub8x8[i] = is_best_mode(cpi->oxcf.mode) ? -500 : 0; 544 rd->thresh_mult_sub8x8[i] = cpi->oxcf.mode == BEST ? -500 : 0;
552 545
553 rd->thresh_mult_sub8x8[THR_LAST] += 2500; 546 rd->thresh_mult_sub8x8[THR_LAST] += 2500;
554 rd->thresh_mult_sub8x8[THR_GOLD] += 2500; 547 rd->thresh_mult_sub8x8[THR_GOLD] += 2500;
555 rd->thresh_mult_sub8x8[THR_ALTR] += 2500; 548 rd->thresh_mult_sub8x8[THR_ALTR] += 2500;
556 rd->thresh_mult_sub8x8[THR_INTRA] += 2500; 549 rd->thresh_mult_sub8x8[THR_INTRA] += 2500;
557 rd->thresh_mult_sub8x8[THR_COMP_LA] += 4500; 550 rd->thresh_mult_sub8x8[THR_COMP_LA] += 4500;
558 rd->thresh_mult_sub8x8[THR_COMP_GA] += 4500; 551 rd->thresh_mult_sub8x8[THR_COMP_GA] += 4500;
559 552
560 // Check for masked out split cases. 553 // Check for masked out split cases.
561 for (i = 0; i < MAX_REFS; ++i) 554 for (i = 0; i < MAX_REFS; ++i)
562 if (sf->disable_split_mask & (1 << i)) 555 if (sf->disable_split_mask & (1 << i))
563 rd->thresh_mult_sub8x8[i] = INT_MAX; 556 rd->thresh_mult_sub8x8[i] = INT_MAX;
564 557
565 // Disable mode test if frame flag is not set. 558 // Disable mode test if frame flag is not set.
566 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) 559 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
567 rd->thresh_mult_sub8x8[THR_LAST] = INT_MAX; 560 rd->thresh_mult_sub8x8[THR_LAST] = INT_MAX;
568 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) 561 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
569 rd->thresh_mult_sub8x8[THR_GOLD] = INT_MAX; 562 rd->thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
570 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) 563 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
571 rd->thresh_mult_sub8x8[THR_ALTR] = INT_MAX; 564 rd->thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
572 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != 565 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
573 (VP9_LAST_FLAG | VP9_ALT_FLAG)) 566 (VP9_LAST_FLAG | VP9_ALT_FLAG))
574 rd->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX; 567 rd->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
575 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != 568 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
576 (VP9_GOLD_FLAG | VP9_ALT_FLAG)) 569 (VP9_GOLD_FLAG | VP9_ALT_FLAG))
577 rd->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX; 570 rd->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
578 } 571 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_ratectrl.c ('k') | source/libvpx/vp9/encoder/vp9_rdopt.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698