Enhance error-resilience test to set S-frames Also includes some minor refactoring. Change-Id: If6644f4f126bb0e6e0d7788fc5d3740bfec6dfb5
diff --git a/test/error_resilience_test.cc b/test/error_resilience_test.cc index 76322fc..2bd75ef 100644 --- a/test/error_resilience_test.cc +++ b/test/error_resilience_test.cc
@@ -21,6 +21,7 @@ const int kMaxDroppableFrames = 12; const int kMaxErrorResilientFrames = 12; const int kMaxNoMFMVFrames = 12; +const int kMaxSFrames = 12; const int kCpuUsed = 1; class ErrorResilienceTestLarge @@ -40,7 +41,16 @@ droppable_nframes_ = 0; error_resilient_nframes_ = 0; nomfmv_nframes_ = 0; - pattern_switch_ = 0; + s_nframes_ = 0; + } + + void SetupEncoder(int bitrate, int lag) { + const aom_rational timebase = { 33333333, 1000000000 }; + cfg_.g_timebase = timebase; + cfg_.rc_target_bitrate = bitrate; + cfg_.kf_mode = AOM_KF_DISABLED; + cfg_.g_lag_in_frames = lag; + init_flags_ = AOM_CODEC_USE_PSNR; } virtual void SetUp() { @@ -64,6 +74,7 @@ virtual void PreEncodeFrameHook(libaom_test::VideoSource *video, libaom_test::Encoder *encoder) { if (video->frame() == 0) encoder->Control(AOME_SET_CPUUSED, kCpuUsed); + if (droppable_nframes_ > 0 && (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { for (unsigned int i = 0; i < droppable_nframes_; ++i) { @@ -76,6 +87,7 @@ } } } + encoder->Control(AV1E_SET_ERROR_RESILIENT_MODE, 0); if (error_resilient_nframes_ > 0 && (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { @@ -88,6 +100,7 @@ } } } + encoder->Control(AV1E_SET_ALLOW_REF_FRAME_MVS, 1); if (nomfmv_nframes_ > 0 && (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { @@ -100,6 +113,19 @@ } } } + + encoder->Control(AV1E_SET_S_FRAME_MODE, 0); + if (s_nframes_ > 0 && + (cfg_.g_pass == AOM_RC_LAST_PASS || cfg_.g_pass == AOM_RC_ONE_PASS)) { + for (unsigned int i = 0; i < s_nframes_; ++i) { + if (s_frames_[i] == video->frame()) { + std::cout << " Encoding S frame: " << s_frames_[i] + << "\n"; + encoder->Control(AV1E_SET_S_FRAME_MODE, 1); + break; + } + } + } } double GetAveragePsnr() const { @@ -184,12 +210,20 @@ nomfmv_frames_[i] = list[i]; } + void SetSFrames(int num, unsigned int *list) { + if (num > kMaxSFrames) + num = kMaxSFrames; + else if (num < 0) + num = 0; + s_nframes_ = num; + for (unsigned int i = 0; i < s_nframes_; ++i) s_frames_[i] = list[i]; + } + unsigned int GetMismatchFrames() { return mismatch_nframes_; } unsigned int GetEncodedFrames() { return nframes_; } unsigned int GetDecodedFrames() { return decoded_nframes_; } void SetAllowMismatch(int allow) { allow_mismatch_ = allow; } - void SetPatternSwitch(int frame_switch) { pattern_switch_ = frame_switch; } private: double psnr_; @@ -199,27 +233,23 @@ unsigned int droppable_nframes_; unsigned int error_resilient_nframes_; unsigned int nomfmv_nframes_; - unsigned int pattern_switch_; + unsigned int s_nframes_; double mismatch_psnr_; unsigned int mismatch_nframes_; unsigned int error_frames_[kMaxErrorFrames]; unsigned int droppable_frames_[kMaxDroppableFrames]; unsigned int error_resilient_frames_[kMaxErrorResilientFrames]; unsigned int nomfmv_frames_[kMaxNoMFMVFrames]; + unsigned int s_frames_[kMaxSFrames]; libaom_test::TestMode encoding_mode_; int allow_mismatch_; }; TEST_P(ErrorResilienceTestLarge, OnVersusOff) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 2000; - cfg_.g_lag_in_frames = 10; - - init_flags_ = AOM_CODEC_USE_PSNR; - + SetupEncoder(2000, 10); libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 12); + cfg_.g_timebase.den, cfg_.g_timebase.num, + 0, 12); // Global error resilient mode OFF. cfg_.g_error_resilient = 0; @@ -249,17 +279,10 @@ // if we lose (i.e., drop before decoding) a set of droppable // frames (i.e., frames that don't update any reference buffers). TEST_P(ErrorResilienceTestLarge, DropFramesWithoutRecovery) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 500; - cfg_.g_lag_in_frames = 10; - - init_flags_ = AOM_CODEC_USE_PSNR; - + SetupEncoder(500, 10); libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 20); - - cfg_.kf_mode = AOM_KF_DISABLED; + cfg_.g_timebase.den, cfg_.g_timebase.num, + 0, 20); // Set an arbitrary set of error frames same as droppable frames. unsigned int num_droppable_frames = 3; @@ -279,19 +302,13 @@ // subsequent frames from using MFMV. If frames are dropped before the // E frame, all frames starting from the E frame should be parse-able. TEST_P(ErrorResilienceTestLarge, ParseAbilityTest) { - const aom_rational timebase = { 33333333, 1000000000 }; - cfg_.g_timebase = timebase; - cfg_.rc_target_bitrate = 500; // TODO(sarahparker, debargha): Make control setting work correctly for // lag_in_frames > 0 - cfg_.g_lag_in_frames = 0; - - init_flags_ = AOM_CODEC_USE_PSNR; + SetupEncoder(500, 0); libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288, - timebase.den, timebase.num, 0, 15); - - cfg_.kf_mode = AOM_KF_DISABLED; + cfg_.g_timebase.den, cfg_.g_timebase.num, + 0, 15); SetAllowMismatch(1);