From bfd0f41f9b8282a458e276fbccf07c8e9ae0870b Mon Sep 17 00:00:00 2001 From: Yunqing Wang Date: Wed, 2 Aug 2017 15:47:09 -0700 Subject: [PATCH] Force the bit exactness in the first pass Originally, for the purpose of keeping a fast first pass, the first-pass stats between row_mt_mode = 0 and row_mt_mode = 1 are not bit exact, but that difference is very small that doesn't cause a mismatch between the final bitstreams. However, if the encoder changes, this minor difference may cause a mismatch. Thus, this patch always forces the first pass to be bit exact. BUG=webm:1453 Change-Id: I2b67cf529dee81f660f9d9e7fe9a60ea3c7b12b8 --- test/vp9_ethread_test.cc | 2 -- vp9/encoder/vp9_encoder.c | 2 +- vp9/encoder/vp9_speed_features.c | 6 ++++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/vp9_ethread_test.cc b/test/vp9_ethread_test.cc index 4e8d814c1..d4ee8aedd 100644 --- a/test/vp9_ethread_test.cc +++ b/test/vp9_ethread_test.cc @@ -340,8 +340,6 @@ TEST_P(VPxEncoderThreadTest, EncoderResultTest) { ASSERT_EQ(single_thr_md5, multi_thr_md5); // Part 2: row_mt_mode_ = 0 vs row_mt_mode_ = 1 single thread bit exact test. - // The first-pass stats are not bit exact here, but that difference doesn't - // cause a mismatch between the final bitstreams. row_mt_mode_ = 1; // Encode using single thread diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index c6e34117e..4888c20f4 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -5589,7 +5589,7 @@ void vp9_set_row_mt(VP9_COMP *cpi) { cpi->row_mt = 1; } - if (cpi->row_mt && cpi->oxcf.max_threads > 1) + if (cpi->row_mt) cpi->row_mt_bit_exact = 1; else cpi->row_mt_bit_exact = 0; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 5a374ff88..43ef4254d 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -664,7 +664,8 @@ void vp9_set_speed_features_framesize_dependent(VP9_COMP *cpi) { // and multiple threads match. // It can be used in realtime when adaptive_rd_thresh_row_mt is enabled since // adaptive_rd_thresh is defined per-row for non-rd pickmode. - if (!sf->adaptive_rd_thresh_row_mt && cpi->row_mt_bit_exact) + if (!sf->adaptive_rd_thresh_row_mt && cpi->row_mt_bit_exact && + oxcf->max_threads > 1) sf->adaptive_rd_thresh = 0; // This is only used in motion vector unit test. @@ -820,7 +821,8 @@ void vp9_set_speed_features_framesize_independent(VP9_COMP *cpi) { // and multiple threads match. // It can be used in realtime when adaptive_rd_thresh_row_mt is enabled since // adaptive_rd_thresh is defined per-row for non-rd pickmode. - if (!sf->adaptive_rd_thresh_row_mt && cpi->row_mt_bit_exact) + if (!sf->adaptive_rd_thresh_row_mt && cpi->row_mt_bit_exact && + oxcf->max_threads > 1) sf->adaptive_rd_thresh = 0; // This is only used in motion vector unit test.