Unit test for invalid resolution changes BUG=aomedia:3349 Change-Id: I72d482f320774e05be8e88e1e9ff98d4f6904c5e
diff --git a/test/frame_size_tests.cc b/test/frame_size_tests.cc index 7f61169..eadfc42 100644 --- a/test/frame_size_tests.cc +++ b/test/frame_size_tests.cc
@@ -160,6 +160,75 @@ EXPECT_EQ(frame_count, kNumFramesPerResolution * kFrameSizes.size()); } +TEST_P(AV1ResolutionChange, InvalidInputSize) { + struct FrameSize { + unsigned int width; + unsigned int height; + }; + static constexpr std::array<FrameSize, 3> kFrameSizes = { { + { 1768, 0 }, + { 0, 200 }, + { 850, 200 }, + } }; + + aom_codec_iface_t *iface = aom_codec_av1_cx(); + aom_codec_enc_cfg_t cfg; + ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, usage_), AOM_CODEC_OK); + + // Resolution changes are only permitted with one pass encoding with no lag. + cfg.g_pass = AOM_RC_ONE_PASS; + cfg.g_lag_in_frames = 0; + cfg.rc_end_usage = rc_mode_; + + aom_codec_ctx_t ctx; + EXPECT_EQ(aom_codec_enc_init(&ctx, iface, &cfg, 0), AOM_CODEC_OK); + std::unique_ptr<aom_codec_ctx_t, decltype(&aom_codec_destroy)> enc( + &ctx, &aom_codec_destroy); + EXPECT_EQ(aom_codec_control(enc.get(), AOME_SET_CPUUSED, cpu_used_), + AOM_CODEC_OK); + + int frame_count = 0; + ::libaom_test::RandomVideoSource video; + video.Begin(); + constexpr int kNumFramesPerResolution = 2; + for (const auto &frame_size : kFrameSizes) { + cfg.g_w = frame_size.width; + cfg.g_h = frame_size.height; + if (cfg.g_w < 1 || cfg.g_w > 65536 || cfg.g_h < 1 || cfg.g_h > 65536) { + EXPECT_EQ(aom_codec_enc_config_set(enc.get(), &cfg), + AOM_CODEC_INVALID_PARAM); + continue; + } + + EXPECT_EQ(aom_codec_enc_config_set(enc.get(), &cfg), AOM_CODEC_OK); + video.SetSize(cfg.g_w, cfg.g_h); + + aom_codec_iter_t iter; + const aom_codec_cx_pkt_t *pkt; + + for (int i = 0; i < kNumFramesPerResolution; ++i) { + video.Next(); // SetSize() does not call FillFrame(). + EXPECT_EQ(aom_codec_encode(enc.get(), video.img(), video.pts(), + video.duration(), /*flags=*/0), + AOM_CODEC_OK); + + iter = nullptr; + while ((pkt = aom_codec_get_cx_data(enc.get(), &iter)) != nullptr) { + ASSERT_EQ(pkt->kind, AOM_CODEC_CX_FRAME_PKT); + // The frame following a resolution change should be a keyframe as the + // change is too extreme to allow previous references to be used. + if (i == 0 || usage_ == AOM_USAGE_ALL_INTRA) { + EXPECT_NE(pkt->data.frame.flags & AOM_FRAME_IS_KEY, 0u) + << "frame " << frame_count; + } + frame_count++; + } + } + } + + EXPECT_EQ(frame_count, 2); +} + INSTANTIATE_TEST_SUITE_P( Realtime, AV1ResolutionChange, ::testing::Combine(::testing::Values(AOM_USAGE_REALTIME),