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

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

Issue 485663004: Fix valgrind error in pickmode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 4 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 | « no previous file | no next file » | 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) 2014 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 <assert.h> 11 #include <assert.h>
12 #include <limits.h> 12 #include <limits.h>
13 #include <math.h> 13 #include <math.h>
14 #include <stdio.h> 14 #include <stdio.h>
15 15
16 #include "./vp9_rtcd.h" 16 #include "./vp9_rtcd.h"
17 17
18 #include "vpx_mem/vpx_mem.h" 18 #include "vpx_mem/vpx_mem.h"
19 19
20 #include "vp9/common/vp9_blockd.h"
20 #include "vp9/common/vp9_common.h" 21 #include "vp9/common/vp9_common.h"
21 #include "vp9/common/vp9_mvref_common.h" 22 #include "vp9/common/vp9_mvref_common.h"
22 #include "vp9/common/vp9_reconinter.h" 23 #include "vp9/common/vp9_reconinter.h"
23 #include "vp9/common/vp9_reconintra.h" 24 #include "vp9/common/vp9_reconintra.h"
24 25
25 #include "vp9/encoder/vp9_encoder.h" 26 #include "vp9/encoder/vp9_encoder.h"
26 #include "vp9/encoder/vp9_pickmode.h" 27 #include "vp9/encoder/vp9_pickmode.h"
27 #include "vp9/encoder/vp9_ratectrl.h" 28 #include "vp9/encoder/vp9_ratectrl.h"
28 #include "vp9/encoder/vp9_rd.h" 29 #include "vp9/encoder/vp9_rd.h"
29 30
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 // TODO(yunqingwang): In this function, only y-plane dist is 337 // TODO(yunqingwang): In this function, only y-plane dist is
337 // calculated. 338 // calculated.
338 *dist = (sse << 4); // + ((sse_u + sse_v) << 4); 339 *dist = (sse << 4); // + ((sse_u + sse_v) << 4);
339 340
340 // *disable_skip = 1; 341 // *disable_skip = 1;
341 } 342 }
342 } 343 }
343 } 344 }
344 } 345 }
345 346
347 struct estimate_block_intra_args {
348 VP9_COMP *cpi;
349 MACROBLOCK *x;
350 PREDICTION_MODE mode;
351 int rate;
352 int64_t dist;
353 };
354
355 static void estimate_block_intra(int plane, int block, BLOCK_SIZE plane_bsize,
356 TX_SIZE tx_size, void *arg) {
357 struct estimate_block_intra_args* const args = arg;
358 VP9_COMP *const cpi = args->cpi;
359 MACROBLOCK *const x = args->x;
360 MACROBLOCKD *const xd = &x->e_mbd;
361 struct macroblock_plane *const p = &x->plane[0];
362 struct macroblockd_plane *const pd = &xd->plane[0];
363 const BLOCK_SIZE bsize_tx = txsize_to_bsize[tx_size];
364 uint8_t *const src_buf_base = p->src.buf;
365 uint8_t *const dst_buf_base = pd->dst.buf;
366 const int src_stride = p->src.stride;
367 const int dst_stride = pd->dst.stride;
368 int i, j;
369 int rate;
370 int64_t dist;
371 unsigned int var_y, sse_y;
372 txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j);
373 assert(plane == 0);
374 (void) plane;
375
376 p->src.buf = &src_buf_base[4 * (j * src_stride + i)];
377 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)];
378 // Use source buffer as an approximation for the fully reconstructed buffer.
379 vp9_predict_intra_block(xd, block >> (2 * tx_size),
380 b_width_log2(plane_bsize),
381 tx_size, args->mode,
382 p->src.buf, src_stride,
383 pd->dst.buf, dst_stride,
384 i, j, 0);
385 // This procedure assumes zero offset from p->src.buf and pd->dst.buf.
386 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y);
387 p->src.buf = src_buf_base;
388 pd->dst.buf = dst_buf_base;
389 args->rate += rate;
390 args->dist += dist;
391 }
392
346 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][4] = { 393 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][4] = {
347 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, 394 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV},
348 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG}, 395 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG},
349 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA}, 396 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA},
350 }; 397 };
351 398
352 // TODO(jingning) placeholder for inter-frame non-RD mode decision. 399 // TODO(jingning) placeholder for inter-frame non-RD mode decision.
353 // this needs various further optimizations. to be continued.. 400 // this needs various further optimizations. to be continued..
354 int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 401 int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
355 const TileInfo *const tile, 402 const TileInfo *const tile,
356 int mi_row, int mi_col, 403 int mi_row, int mi_col,
357 int *returnrate, 404 int *returnrate,
358 int64_t *returndistortion, 405 int64_t *returndistortion,
359 BLOCK_SIZE bsize, 406 BLOCK_SIZE bsize,
360 PICK_MODE_CONTEXT *ctx) { 407 PICK_MODE_CONTEXT *ctx) {
361 MACROBLOCKD *xd = &x->e_mbd; 408 MACROBLOCKD *xd = &x->e_mbd;
362 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 409 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
363 struct macroblock_plane *const p = &x->plane[0];
364 struct macroblockd_plane *const pd = &xd->plane[0]; 410 struct macroblockd_plane *const pd = &xd->plane[0];
365 PREDICTION_MODE this_mode, best_mode = ZEROMV; 411 PREDICTION_MODE this_mode, best_mode = ZEROMV;
366 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; 412 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME;
367 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize], 413 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize],
368 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 414 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
369 INTERP_FILTER best_pred_filter = EIGHTTAP; 415 INTERP_FILTER best_pred_filter = EIGHTTAP;
370 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; 416 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES];
371 struct buf_2d yv12_mb[4][MAX_MB_PLANE]; 417 struct buf_2d yv12_mb[4][MAX_MB_PLANE];
372 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, 418 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG,
373 VP9_ALT_FLAG }; 419 VP9_ALT_FLAG };
(...skipping 16 matching lines...) Expand all
390 unsigned char segment_id = mbmi->segment_id; 436 unsigned char segment_id = mbmi->segment_id;
391 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; 437 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize];
392 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize]; 438 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize];
393 // Mode index conversion form THR_MODES to PREDICTION_MODE for a ref frame. 439 // Mode index conversion form THR_MODES to PREDICTION_MODE for a ref frame.
394 INTERP_FILTER filter_ref = cm->interp_filter; 440 INTERP_FILTER filter_ref = cm->interp_filter;
395 int bsl = mi_width_log2(bsize); 441 int bsl = mi_width_log2(bsize);
396 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? 442 const int pred_filter_search = cm->interp_filter == SWITCHABLE ?
397 (((mi_row + mi_col) >> bsl) + 443 (((mi_row + mi_col) >> bsl) +
398 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; 444 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0;
399 int const_motion[MAX_REF_FRAMES] = { 0 }; 445 int const_motion[MAX_REF_FRAMES] = { 0 };
400 int bh = num_4x4_blocks_high_lookup[bsize] << 2; 446 const int bh = num_4x4_blocks_high_lookup[bsize] << 2;
401 int bw = num_4x4_blocks_wide_lookup[bsize] << 2; 447 const int bw = num_4x4_blocks_wide_lookup[bsize] << 2;
402 int pixels_in_block = bh * bw; 448 const int pixels_in_block = bh * bw;
403 // For speed 6, the result of interp filter is reused later in actual encoding 449 // For speed 6, the result of interp filter is reused later in actual encoding
404 // process. 450 // process.
405 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. 451 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers.
406 PRED_BUFFER tmp[4]; 452 PRED_BUFFER tmp[4];
407 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); 453 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64);
408 struct buf_2d orig_dst = pd->dst; 454 struct buf_2d orig_dst = pd->dst;
409 PRED_BUFFER *best_pred = NULL; 455 PRED_BUFFER *best_pred = NULL;
410 PRED_BUFFER *this_mode_pred = NULL; 456 PRED_BUFFER *this_mode_pred = NULL;
411 int i; 457 int i;
412 458
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 mbmi->tx_size = best_tx_size; 709 mbmi->tx_size = best_tx_size;
664 mbmi->ref_frame[0] = best_ref_frame; 710 mbmi->ref_frame[0] = best_ref_frame;
665 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; 711 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int;
666 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; 712 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
667 x->skip_txfm[0] = skip_txfm; 713 x->skip_txfm[0] = skip_txfm;
668 714
669 // Perform intra prediction search, if the best SAD is above a certain 715 // Perform intra prediction search, if the best SAD is above a certain
670 // threshold. 716 // threshold.
671 if (!x->skip && best_rd > inter_mode_thresh && 717 if (!x->skip && best_rd > inter_mode_thresh &&
672 bsize <= cpi->sf.max_intra_bsize) { 718 bsize <= cpi->sf.max_intra_bsize) {
673 int i, j; 719 struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 };
674 const int width = num_4x4_blocks_wide_lookup[bsize];
675 const int height = num_4x4_blocks_high_lookup[bsize];
676 720
677 int rate2 = 0; 721 const TX_SIZE intra_tx_size =
678 int64_t dist2 = 0; 722 MIN(max_txsize_lookup[bsize],
679 const int dst_stride = cpi->sf.reuse_inter_pred_sby ? bw : pd->dst.stride; 723 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
680 const int src_stride = p->src.stride;
681 int block_idx = 0;
682
683 TX_SIZE tmp_tx_size = MIN(max_txsize_lookup[bsize],
684 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
685 const BLOCK_SIZE bsize_tx = txsize_to_bsize[tmp_tx_size];
686 const int step = 1 << tmp_tx_size;
687 724
688 if (cpi->sf.reuse_inter_pred_sby) { 725 if (cpi->sf.reuse_inter_pred_sby) {
689 pd->dst.buf = tmp[0].data; 726 pd->dst.buf = tmp[0].data;
690 pd->dst.stride = bw; 727 pd->dst.stride = bw;
691 } 728 }
692 729
693 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { 730 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) {
694 uint8_t *const src_buf_base = p->src.buf; 731 const TX_SIZE saved_tx_size = mbmi->tx_size;
695 uint8_t *const dst_buf_base = pd->dst.buf; 732 args.mode = this_mode;
696 for (j = 0; j < height; j += step) { 733 args.rate = 0;
697 for (i = 0; i < width; i += step) { 734 args.dist = 0;
698 p->src.buf = &src_buf_base[4 * (j * src_stride + i)]; 735 mbmi->tx_size = intra_tx_size;
699 pd->dst.buf = &dst_buf_base[4 * (j * dst_stride + i)]; 736 vp9_foreach_transformed_block_in_plane(xd, bsize, 0,
700 // Use source buffer as an approximation for the fully reconstructed 737 estimate_block_intra, &args);
701 // buffer 738 mbmi->tx_size = saved_tx_size;
702 vp9_predict_intra_block(xd, block_idx, b_width_log2(bsize), 739 rate = args.rate;
703 tmp_tx_size, this_mode, 740 dist = args.dist;
704 p->src.buf, src_stride,
705 pd->dst.buf, dst_stride,
706 i, j, 0);
707 model_rd_for_sb_y(cpi, bsize_tx, x, xd, &rate, &dist, &var_y, &sse_y);
708 rate2 += rate;
709 dist2 += dist;
710 ++block_idx;
711 }
712 }
713 p->src.buf = src_buf_base;
714 pd->dst.buf = dst_buf_base;
715
716 rate = rate2;
717 dist = dist2;
718
719 rate += cpi->mbmode_cost[this_mode]; 741 rate += cpi->mbmode_cost[this_mode];
720 rate += intra_cost_penalty; 742 rate += intra_cost_penalty;
721 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); 743 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist);
722 744
723 if (cpi->sf.reuse_inter_pred_sby)
724 pd->dst = orig_dst;
725
726 if (this_rd + intra_mode_cost < best_rd) { 745 if (this_rd + intra_mode_cost < best_rd) {
727 best_rd = this_rd; 746 best_rd = this_rd;
728 *returnrate = rate; 747 *returnrate = rate;
729 *returndistortion = dist; 748 *returndistortion = dist;
730 mbmi->mode = this_mode; 749 mbmi->mode = this_mode;
731 mbmi->tx_size = tmp_tx_size; 750 mbmi->tx_size = intra_tx_size;
732 mbmi->ref_frame[0] = INTRA_FRAME; 751 mbmi->ref_frame[0] = INTRA_FRAME;
733 mbmi->uv_mode = this_mode; 752 mbmi->uv_mode = this_mode;
734 mbmi->mv[0].as_int = INVALID_MV; 753 mbmi->mv[0].as_int = INVALID_MV;
735 } else { 754 } else {
736 x->skip_txfm[0] = skip_txfm; 755 x->skip_txfm[0] = skip_txfm;
737 } 756 }
738 } 757 }
758 if (cpi->sf.reuse_inter_pred_sby)
759 pd->dst = orig_dst;
739 } 760 }
740 761
741 return INT64_MAX; 762 return INT64_MAX;
742 } 763 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698