From e358ab5fc9cda71ea2c74eec0ed130940b9f5b17 Mon Sep 17 00:00:00 2001 From: Pengchong Jin Date: Thu, 17 Jul 2014 11:54:43 -0700 Subject: [PATCH] Fixed a bug of setting wrong first pass mb stats pointer The bug sets the wrong pointer to the first pass mb stats if the encoder does the re-coding in the second pass. Change-Id: I8a11f45dd7dceb38de814adec24cecccae370d00 --- vp9/encoder/vp9_encodeframe.c | 22 ++++++++++++++++++++++ vp9/encoder/vp9_encoder.c | 2 -- vp9/encoder/vp9_firstpass.c | 17 ----------------- vp9/encoder/vp9_firstpass.h | 1 - 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 7ba7cae72..adc655332 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -3034,6 +3034,21 @@ static void encode_tiles(VP9_COMP *cpi) { } } +#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 +3116,13 @@ static void encode_frame_internal(VP9_COMP *cpi) { 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); diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 04d518178..f40cc56eb 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -940,8 +940,6 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) { cpi->twopass.firstpass_mb_stats.mb_stats_start = oxcf->firstpass_mb_stats_in.buf; - cpi->twopass.firstpass_mb_stats.mb_stats_in = - cpi->twopass.firstpass_mb_stats.mb_stats_start; cpi->twopass.firstpass_mb_stats.mb_stats_end = cpi->twopass.firstpass_mb_stats.mb_stats_start + (ps - 1) * cpi->common.MBs * sizeof(uint8_t); diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c index 2a5f594e9..3178ed859 100644 --- a/vp9/encoder/vp9_firstpass.c +++ b/vp9/encoder/vp9_firstpass.c @@ -148,16 +148,6 @@ static void output_stats(FIRSTPASS_STATS *stats, } #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) { - if (firstpass_mb_stats->mb_stats_in > firstpass_mb_stats->mb_stats_end) - return EOF; - - *this_frame_mb_stats = firstpass_mb_stats->mb_stats_in; - firstpass_mb_stats->mb_stats_in += cm->MBs * sizeof(uint8_t); - return 1; -} - static void output_fpmb_stats(uint8_t *this_frame_mb_stats, VP9_COMMON *cm, struct vpx_codec_pkt_list *pktlist) { struct vpx_codec_cx_pkt pkt; @@ -2232,13 +2222,6 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { // Update the total stats remaining structure. subtract_stats(&twopass->total_left_stats, &this_frame); - -#if CONFIG_FP_MB_STATS - if (cpi->use_fp_mb_stats) { - input_fpmb_stats(&twopass->firstpass_mb_stats, cm, - &twopass->this_frame_mb_stats); - } -#endif } void vp9_twopass_postencode_update(VP9_COMP *cpi) { diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h index 714a67fd8..84860b967 100644 --- a/vp9/encoder/vp9_firstpass.h +++ b/vp9/encoder/vp9_firstpass.h @@ -20,7 +20,6 @@ extern "C" { #if CONFIG_FP_MB_STATS typedef struct { - uint8_t *mb_stats_in; uint8_t *mb_stats_start; uint8_t *mb_stats_end; } FIRSTPASS_MB_STATS;