lc-dec: Add unit tests for lc-dec mode
This patch adds unit tests (EndToEndLcModeTest and
EndToEndLcModeTestLarge) to check encoder-decoder compliance
and validate PSNR for low complexity decode mode using 2 vertical videos.
Change-Id: Iae6d70bff754a016c37e6b232aa1274d4b6ad092
diff --git a/test/encode_test_driver.cc b/test/encode_test_driver.cc
index 79299a7..6ad10bd 100644
--- a/test/encode_test_driver.cc
+++ b/test/encode_test_driver.cc
@@ -88,13 +88,14 @@
int usage = AOM_USAGE_GOOD_QUALITY;
switch (mode) {
case kOnePassGood:
- case kTwoPassGood: break;
+ case kTwoPassGood:
+ case kLowComplexityDecode: break;
case kRealTime: usage = AOM_USAGE_REALTIME; break;
case kAllIntra: usage = AOM_USAGE_ALL_INTRA; break;
default: ASSERT_TRUE(false) << "Unexpected mode " << mode;
}
mode_ = mode;
- passes_ = (mode == kTwoPassGood) ? 2 : 1;
+ passes_ = (mode == kTwoPassGood || mode == kLowComplexityDecode) ? 2 : 1;
const aom_codec_err_t res = codec_->DefaultEncoderConfig(&cfg_, usage);
ASSERT_EQ(AOM_CODEC_OK, res);
diff --git a/test/encode_test_driver.h b/test/encode_test_driver.h
index 1dd7b21..a589ae2 100644
--- a/test/encode_test_driver.h
+++ b/test/encode_test_driver.h
@@ -28,7 +28,13 @@
class CodecFactory;
class VideoSource;
-enum TestMode { kRealTime, kOnePassGood, kTwoPassGood, kAllIntra };
+enum TestMode {
+ kRealTime,
+ kOnePassGood,
+ kTwoPassGood,
+ kAllIntra,
+ kLowComplexityDecode
+};
#define ALL_TEST_MODES \
::testing::Values(::libaom_test::kRealTime, ::libaom_test::kOnePassGood, \
::libaom_test::kTwoPassGood)
diff --git a/test/end_to_end_psnr_test.cc b/test/end_to_end_psnr_test.cc
index 0daa44d..e0e744b 100644
--- a/test/end_to_end_psnr_test.cc
+++ b/test/end_to_end_psnr_test.cc
@@ -11,6 +11,7 @@
#include <memory>
#include <ostream>
+#include <unordered_map>
#include "gtest/gtest.h"
@@ -66,6 +67,22 @@
#endif
};
+// List of psnr thresholds for speed settings 1-3 and low complexity decode mode
+// keys: content -> speed -> PSNR threshold
+std::unordered_map<std::string, std::unordered_map<int, double>>
+ kPsnrThresholdLcMode = { { "SDR_Animal_oqo7.y4m",
+ {
+ { 1, 27.9 },
+ { 2, 27.8 },
+ { 3, 27.3 },
+ } },
+ { "SDR_Health_rtd0_720p.y4m",
+ {
+ { 1, 41.8 },
+ { 2, 41.4 },
+ { 3, 41.1 },
+ } } };
+
// Encoding modes tested
const libaom_test::TestMode kEncodingModeVectors[] = {
::libaom_test::kTwoPassGood,
@@ -73,6 +90,11 @@
::libaom_test::kRealTime,
};
+const TestVideoParam kTestVectorsLcMode[] = {
+ { "SDR_Animal_oqo7.y4m", 8, AOM_IMG_FMT_I420, AOM_BITS_8, 0 },
+ { "SDR_Health_rtd0_720p.y4m", 8, AOM_IMG_FMT_I420, AOM_BITS_8, 0 },
+};
+
// Speed settings tested
const int kCpuUsedVectors[] = { 1, 2, 3, 5, 6 };
@@ -91,7 +113,8 @@
void SetUp() override {
InitializeConfig(encoding_mode_);
if (encoding_mode_ == ::libaom_test::kOnePassGood ||
- encoding_mode_ == ::libaom_test::kTwoPassGood) {
+ encoding_mode_ == ::libaom_test::kTwoPassGood ||
+ encoding_mode_ == ::libaom_test::kLowComplexityDecode) {
cfg_.g_lag_in_frames = 5;
} else if (encoding_mode_ == ::libaom_test::kRealTime) {
cfg_.rc_buf_sz = 1000;
@@ -113,8 +136,16 @@
void PreEncodeFrameHook(::libaom_test::VideoSource *video,
::libaom_test::Encoder *encoder) override {
if (video->frame() == 0) {
- encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1);
- encoder->Control(AV1E_SET_TILE_COLUMNS, 4);
+ if (encoding_mode_ == ::libaom_test::kLowComplexityDecode) {
+ ASSERT_LE(cpu_used_, 3);
+ encoder->Control(AV1E_SET_TILE_COLUMNS, 1);
+ encoder->Control(AV1E_SET_TILE_ROWS, 1);
+ encoder->Control(AV1E_SET_ENABLE_CDEF, 0);
+ encoder->Control(AV1E_SET_ENABLE_LOW_COMPLEXITY_DECODE, 1);
+ } else {
+ encoder->Control(AV1E_SET_FRAME_PARALLEL_DECODING, 1);
+ encoder->Control(AV1E_SET_TILE_COLUMNS, 4);
+ }
encoder->Control(AOME_SET_CPUUSED, cpu_used_);
// Test screen coding tools at cpu_used = 1 && encoding mode is two-pass.
if (cpu_used_ == 1 && encoding_mode_ == ::libaom_test::kTwoPassGood)
@@ -122,7 +153,8 @@
else
encoder->Control(AV1E_SET_TUNE_CONTENT, AOM_CONTENT_DEFAULT);
if (encoding_mode_ == ::libaom_test::kOnePassGood ||
- encoding_mode_ == ::libaom_test::kTwoPassGood) {
+ encoding_mode_ == ::libaom_test::kTwoPassGood ||
+ encoding_mode_ == ::libaom_test::kLowComplexityDecode) {
encoder->Control(AOME_SET_ENABLEAUTOALTREF, 1);
encoder->Control(AOME_SET_ARNR_MAXFRAMES, 7);
encoder->Control(AOME_SET_ARNR_STRENGTH, 5);
@@ -138,7 +170,10 @@
}
double GetPsnrThreshold() {
- return kPsnrThreshold[cpu_used_][encoding_mode_];
+ if (encoding_mode_ == ::libaom_test::kLowComplexityDecode)
+ return kPsnrThresholdLcMode[test_video_param_.filename][cpu_used_];
+ else
+ return kPsnrThreshold[cpu_used_][encoding_mode_];
}
void DoTest() {
@@ -182,6 +217,10 @@
class EndToEndAllIntraTest : public EndToEndTest {};
+class EndToEndLcModeTestLarge : public EndToEndTest {};
+
+class EndToEndLcModeTest : public EndToEndTest {};
+
TEST_P(EndToEndTestLarge, EndtoEndPSNRTest) { DoTest(); }
TEST_P(EndToEndTest, EndtoEndPSNRTest) { DoTest(); }
@@ -190,6 +229,10 @@
TEST_P(EndToEndAllIntraTest, EndtoEndPSNRTest) { DoTest(); }
+TEST_P(EndToEndLcModeTestLarge, EndtoEndPSNRTest) { DoTest(); }
+
+TEST_P(EndToEndLcModeTest, EndtoEndPSNRTest) { DoTest(); }
+
AV1_INSTANTIATE_TEST_SUITE(EndToEndTestLarge,
::testing::ValuesIn(kEncodingModeVectors),
::testing::ValuesIn(kTestVectors),
@@ -209,4 +252,15 @@
::testing::Values(::libaom_test::kAllIntra),
::testing::Values(kTestVectors[0]), // 420
::testing::Values(6)); // cpu_used
+
+AV1_INSTANTIATE_TEST_SUITE(
+ EndToEndLcModeTestLarge,
+ ::testing::Values(::libaom_test::kLowComplexityDecode),
+ ::testing::ValuesIn(kTestVectorsLcMode),
+ ::testing::Values(1, 3)); // cpu_used
+
+AV1_INSTANTIATE_TEST_SUITE(
+ EndToEndLcModeTest, ::testing::Values(::libaom_test::kLowComplexityDecode),
+ ::testing::ValuesIn(kTestVectorsLcMode),
+ ::testing::Values(2)); // cpu_used
} // namespace