Index: source/libvpx/vp9/encoder/vp9_encodeframe.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_encodeframe.c (revision 284462) |
+++ source/libvpx/vp9/encoder/vp9_encodeframe.c (working copy) |
@@ -1333,6 +1333,13 @@ |
set_offsets(cpi, tile, mi_row, mi_col, bsize); |
update_state_rt(cpi, ctx, mi_row, mi_col, bsize); |
+#if CONFIG_DENOISING |
+ if (cpi->oxcf.noise_sensitivity > 0 && output_enabled) { |
+ vp9_denoiser_denoise(&cpi->denoiser, &cpi->mb, mi_row, mi_col, |
+ MAX(BLOCK_8X8, bsize), ctx); |
+ } |
+#endif |
+ |
encode_superblock(cpi, tp, output_enabled, mi_row, mi_col, bsize, ctx); |
update_stats(cpi); |
@@ -2395,7 +2402,7 @@ |
static void nonrd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile, |
int mi_row, int mi_col, |
int *rate, int64_t *dist, |
- BLOCK_SIZE bsize) { |
+ BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) { |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCK *const x = &cpi->mb; |
MACROBLOCKD *const xd = &x->e_mbd; |
@@ -2411,7 +2418,7 @@ |
if (vp9_segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP)) |
set_mode_info_seg_skip(x, cm->tx_mode, rate, dist, bsize); |
else |
- vp9_pick_inter_mode(cpi, x, tile, mi_row, mi_col, rate, dist, bsize); |
+ vp9_pick_inter_mode(cpi, x, tile, mi_row, mi_col, rate, dist, bsize, ctx); |
duplicate_mode_info_in_sb(cm, xd, mi_row, mi_col, bsize); |
} |
@@ -2528,7 +2535,7 @@ |
// PARTITION_NONE |
if (partition_none_allowed) { |
nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, |
- &this_rate, &this_dist, bsize); |
+ &this_rate, &this_dist, bsize, ctx); |
ctx->mic.mbmi = xd->mi[0]->mbmi; |
ctx->skip_txfm = x->skip_txfm; |
ctx->skip = x->skip; |
@@ -2611,7 +2618,8 @@ |
load_pred_mv(x, ctx); |
nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, |
- &this_rate, &this_dist, subsize); |
+ &this_rate, &this_dist, subsize, |
+ &pc_tree->horizontal[0]); |
pc_tree->horizontal[0].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->horizontal[0].skip_txfm = x->skip_txfm; |
@@ -2622,7 +2630,8 @@ |
if (sum_rd < best_rd && mi_row + ms < cm->mi_rows) { |
load_pred_mv(x, ctx); |
nonrd_pick_sb_modes(cpi, tile, mi_row + ms, mi_col, |
- &this_rate, &this_dist, subsize); |
+ &this_rate, &this_dist, subsize, |
+ &pc_tree->horizontal[1]); |
pc_tree->horizontal[1].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->horizontal[1].skip_txfm = x->skip_txfm; |
@@ -2654,7 +2663,8 @@ |
load_pred_mv(x, ctx); |
nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, |
- &this_rate, &this_dist, subsize); |
+ &this_rate, &this_dist, subsize, |
+ &pc_tree->vertical[0]); |
pc_tree->vertical[0].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->vertical[0].skip_txfm = x->skip_txfm; |
pc_tree->vertical[0].skip = x->skip; |
@@ -2662,7 +2672,8 @@ |
if (sum_rd < best_rd && mi_col + ms < cm->mi_cols) { |
load_pred_mv(x, ctx); |
nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col + ms, |
- &this_rate, &this_dist, subsize); |
+ &this_rate, &this_dist, subsize, |
+ &pc_tree->vertical[1]); |
pc_tree->vertical[1].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->vertical[1].skip_txfm = x->skip_txfm; |
pc_tree->vertical[1].skip = x->skip; |
@@ -2752,19 +2763,21 @@ |
switch (partition) { |
case PARTITION_NONE: |
- nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, subsize); |
+ nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, |
+ subsize, &pc_tree->none); |
pc_tree->none.mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->none.skip_txfm = x->skip_txfm; |
pc_tree->none.skip = x->skip; |
break; |
case PARTITION_VERT: |
- nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, subsize); |
+ nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, |
+ subsize, &pc_tree->vertical[0]); |
pc_tree->vertical[0].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->vertical[0].skip_txfm = x->skip_txfm; |
pc_tree->vertical[0].skip = x->skip; |
if (mi_col + hbs < cm->mi_cols) { |
nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col + hbs, |
- &rate, &dist, subsize); |
+ &rate, &dist, subsize, &pc_tree->vertical[1]); |
pc_tree->vertical[1].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->vertical[1].skip_txfm = x->skip_txfm; |
pc_tree->vertical[1].skip = x->skip; |
@@ -2776,13 +2789,14 @@ |
} |
break; |
case PARTITION_HORZ: |
- nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, subsize); |
+ nonrd_pick_sb_modes(cpi, tile, mi_row, mi_col, totrate, totdist, |
+ subsize, &pc_tree->horizontal[0]); |
pc_tree->horizontal[0].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->horizontal[0].skip_txfm = x->skip_txfm; |
pc_tree->horizontal[0].skip = x->skip; |
if (mi_row + hbs < cm->mi_rows) { |
nonrd_pick_sb_modes(cpi, tile, mi_row + hbs, mi_col, |
- &rate, &dist, subsize); |
+ &rate, &dist, subsize, &pc_tree->horizontal[0]); |
pc_tree->horizontal[1].mic.mbmi = xd->mi[0]->mbmi; |
pc_tree->horizontal[1].skip_txfm = x->skip_txfm; |
pc_tree->horizontal[1].skip = x->skip; |
@@ -3034,6 +3048,21 @@ |
} |
} |
+#if CONFIG_FP_MB_STATS |
+static int input_fpmb_stats(FIRSTPASS_MB_STATS *firstpass_mb_stats, |
+ VP9_COMMON *cm, uint8_t **this_frame_mb_stats) { |
+ uint8_t *mb_stats_in = firstpass_mb_stats->mb_stats_start + |
+ cm->current_video_frame * cm->MBs * sizeof(uint8_t); |
+ |
+ if (mb_stats_in > firstpass_mb_stats->mb_stats_end) |
+ return EOF; |
+ |
+ *this_frame_mb_stats = mb_stats_in; |
+ |
+ return 1; |
+} |
+#endif |
+ |
static void encode_frame_internal(VP9_COMP *cpi) { |
SPEED_FEATURES *const sf = &cpi->sf; |
RD_OPT *const rd_opt = &cpi->rd; |
@@ -3101,6 +3130,13 @@ |
struct vpx_usec_timer emr_timer; |
vpx_usec_timer_start(&emr_timer); |
+#if CONFIG_FP_MB_STATS |
+ if (cpi->use_fp_mb_stats) { |
+ input_fpmb_stats(&cpi->twopass.firstpass_mb_stats, cm, |
+ &cpi->twopass.this_frame_mb_stats); |
+ } |
+#endif |
+ |
encode_tiles(cpi); |
vpx_usec_timer_mark(&emr_timer); |