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
This commit is contained in:
Pengchong Jin 2014-07-17 11:54:43 -07:00
Родитель f349b071c6
Коммит e358ab5fc9
4 изменённых файлов: 22 добавлений и 20 удалений

Просмотреть файл

@ -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);

Просмотреть файл

@ -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);

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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;