From: angiebird Date: Tue, 3 Dec 2019 23:34:03 +0000 (-0800) Subject: Fix the encode inconsistency of SimpleEncode X-Git-Tag: v1.8.2~7^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42916ce60416d00f1188afd09c6a088ae9c91de9;p=libvpx Fix the encode inconsistency of SimpleEncode Make sure restore_coding_context() is always called in the end of encode_with_recode_loop(). Add EncodeConsistencyTest. Change-Id: I3c8e4c8fcff4e3f7afef9bec469beef2a5fb6eeb --- diff --git a/test/simple_encode_test.cc b/test/simple_encode_test.cc index 8caf8bfe2..e93a1a469 100644 --- a/test/simple_encode_test.cc +++ b/test/simple_encode_test.cc @@ -107,6 +107,48 @@ TEST(SimpleEncode, EncodeFrameWithQuantizeIndex) { } simple_encode.EndEncode(); } + +TEST(SimpleEncode, EncodeConsistencyTest) { + std::vector quantize_index_list; + std::vector ref_sse_list; + std::vector ref_psnr_list; + std::vector ref_bit_size_list; + { + SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den, + target_bitrate, num_frames, infile_path); + simple_encode.ComputeFirstPassStats(); + const int num_coding_frames = simple_encode.GetCodingFrameNum(); + simple_encode.StartEncode(); + for (int i = 0; i < num_coding_frames; ++i) { + EncodeFrameResult encode_frame_result; + simple_encode.EncodeFrame(&encode_frame_result); + quantize_index_list.push_back(encode_frame_result.quantize_index); + ref_sse_list.push_back(encode_frame_result.sse); + ref_psnr_list.push_back(encode_frame_result.psnr); + ref_bit_size_list.push_back(encode_frame_result.coding_data_bit_size); + } + simple_encode.EndEncode(); + } + { + SimpleEncode simple_encode(w, h, frame_rate_num, frame_rate_den, + target_bitrate, num_frames, infile_path); + simple_encode.ComputeFirstPassStats(); + const int num_coding_frames = simple_encode.GetCodingFrameNum(); + EXPECT_EQ(static_cast(num_coding_frames), + quantize_index_list.size()); + simple_encode.StartEncode(); + for (int i = 0; i < num_coding_frames; ++i) { + EncodeFrameResult encode_frame_result; + simple_encode.EncodeFrameWithQuantizeIndex(&encode_frame_result, + quantize_index_list[i]); + EXPECT_EQ(encode_frame_result.quantize_index, quantize_index_list[i]); + EXPECT_EQ(encode_frame_result.sse, ref_sse_list[i]); + EXPECT_DOUBLE_EQ(encode_frame_result.psnr, ref_psnr_list[i]); + EXPECT_EQ(encode_frame_result.coding_data_bit_size, ref_bit_size_list[i]); + } + simple_encode.EndEncode(); + } +} } // namespace } // namespace vp9 diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 8ca7eb653..de8f384a5 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -4334,7 +4334,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, #if CONFIG_RATE_CTRL // This part needs to be after save_coding_context() because - // restore_coding_context may be called in the end of this function. + // restore_coding_context will be called in the end of this function. // TODO(angiebird): This is a hack for making sure the encoder use the // external_quantize_index exactly. Avoid this kind of hack later. if (cpi->encode_command.use_external_quantize_index) { @@ -4518,7 +4518,7 @@ static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, } if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) - if (loop || !enable_acl) restore_coding_context(cpi); + if (loop) restore_coding_context(cpi); } while (loop); #ifdef AGGRESSIVE_VBR @@ -4544,13 +4544,11 @@ static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, // Skip recoding, if model diff is below threshold const int thresh = compute_context_model_thresh(cpi); const int diff = compute_context_model_diff(cm); - if (diff < thresh) { - vpx_clear_system_state(); - restore_coding_context(cpi); - return; + if (diff >= thresh) { + vp9_encode_frame(cpi); } - - vp9_encode_frame(cpi); + } + if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) { vpx_clear_system_state(); restore_coding_context(cpi); }