From a68bbcff290c2f75d7ee35b91d16df66ef9d8dfd Mon Sep 17 00:00:00 2001 From: Jerome Jiang Date: Tue, 7 Nov 2017 17:20:34 -0800 Subject: [PATCH] vp9: Add nonref frame buffer test. The new test will run a SVC bitstream which has non ref frames. It checks the number of buffer acquired and released to make sure all external frame buffers are released. Add a new test bitstream: vp90-2-22-svc_1280x720_1.webm which has 400 frames in total, and 1 spatial layer and 2 temporal layers. There is one non ref frame every other frame. Disabled for now. Will be enabled with the fix. BUG=b/68819248 Change-Id: I0515336fd9809a9e1fceba90e4dce53dabaf53a5 --- test/external_frame_buffer_test.cc | 44 ++++++++++++++++++++++++++++-- test/test-data.mk | 2 ++ test/test-data.sha1 | 2 ++ test/test_vectors.cc | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/test/external_frame_buffer_test.cc b/test/external_frame_buffer_test.cc index e474e2d52..045d579e0 100644 --- a/test/external_frame_buffer_test.cc +++ b/test/external_frame_buffer_test.cc @@ -34,7 +34,8 @@ struct ExternalFrameBuffer { // Class to manipulate a list of external frame buffers. class ExternalFrameBufferList { public: - ExternalFrameBufferList() : num_buffers_(0), ext_fb_list_(NULL) {} + ExternalFrameBufferList() + : num_buffers_(0), num_used_buffers_(0), ext_fb_list_(NULL) {} virtual ~ExternalFrameBufferList() { for (int i = 0; i < num_buffers_; ++i) { @@ -71,6 +72,8 @@ class ExternalFrameBufferList { } SetFrameBuffer(idx, fb); + + num_used_buffers_++; return 0; } @@ -106,6 +109,7 @@ class ExternalFrameBufferList { } EXPECT_EQ(1, ext_fb->in_use); ext_fb->in_use = 0; + num_used_buffers_--; return 0; } @@ -121,6 +125,8 @@ class ExternalFrameBufferList { } } + int num_used_buffers() const { return num_used_buffers_; } + private: // Returns the index of the first free frame buffer. Returns |num_buffers_| // if there are no free frame buffers. @@ -145,6 +151,7 @@ class ExternalFrameBufferList { } int num_buffers_; + int num_used_buffers_; ExternalFrameBuffer *ext_fb_list_; }; @@ -273,6 +280,7 @@ class ExternalFrameBufferMD5Test #if CONFIG_WEBM_IO const char kVP9TestFile[] = "vp90-2-02-size-lf-1920x1080.webm"; +const char kVP9NonRefTestFile[] = "vp90-2-22-svc_1280x720_1.webm"; // Class for testing passing in external frame buffers to libvpx. class ExternalFrameBufferTest : public ::testing::Test { @@ -292,7 +300,9 @@ class ExternalFrameBufferTest : public ::testing::Test { virtual void TearDown() { delete decoder_; + decoder_ = NULL; delete video_; + video_ = NULL; } // Passes the external frame buffer information to libvpx. @@ -325,7 +335,7 @@ class ExternalFrameBufferTest : public ::testing::Test { return VPX_CODEC_OK; } - private: + protected: void CheckDecodedFrames() { libvpx_test::DxDataIterator dec_iter = decoder_->GetDxData(); const vpx_image_t *img = NULL; @@ -341,6 +351,25 @@ class ExternalFrameBufferTest : public ::testing::Test { int num_buffers_; ExternalFrameBufferList fb_list_; }; + +class ExternalFrameBufferNonRefTest : public ExternalFrameBufferTest { + protected: + virtual void SetUp() { + video_ = new libvpx_test::WebMVideoSource(kVP9NonRefTestFile); + ASSERT_TRUE(video_ != NULL); + video_->Init(); + video_->Begin(); + + vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t(); + decoder_ = new libvpx_test::VP9Decoder(cfg, 0); + ASSERT_TRUE(decoder_ != NULL); + } + + virtual void CheckFrameBufferRelease() { + TearDown(); + ASSERT_EQ(0, fb_list_.num_used_buffers()); + } +}; #endif // CONFIG_WEBM_IO // This test runs through the set of test vectors, and decodes them. @@ -419,6 +448,8 @@ TEST_F(ExternalFrameBufferTest, NotEnoughBuffers) { SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, release_vp9_frame_buffer)); ASSERT_EQ(VPX_CODEC_OK, DecodeOneFrame()); + // Only run this on long clips. Decoding a very short clip will return + // VPX_CODEC_OK even with only 2 buffers. ASSERT_EQ(VPX_CODEC_MEM_ERROR, DecodeRemainingFrames()); } @@ -467,6 +498,15 @@ TEST_F(ExternalFrameBufferTest, SetAfterDecode) { SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, release_vp9_frame_buffer)); } + +TEST_F(ExternalFrameBufferNonRefTest, DISABLED_ReleaseNonRefFrameBuffer) { + const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS; + ASSERT_EQ(VPX_CODEC_OK, + SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, + release_vp9_frame_buffer)); + ASSERT_EQ(VPX_CODEC_OK, DecodeRemainingFrames()); + CheckFrameBufferRelease(); +} #endif // CONFIG_WEBM_IO VP9_INSTANTIATE_TEST_CASE( diff --git a/test/test-data.mk b/test/test-data.mk index 67a2568bd..f405e4ef1 100644 --- a/test/test-data.mk +++ b/test/test-data.mk @@ -878,3 +878,5 @@ LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-21-resize_inter_1920x1080_7_3-4 LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-21-resize_inter_1920x1080_7_3-4.webm.md5 LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-22-svc_1280x720_3.ivf LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-22-svc_1280x720_3.ivf.md5 +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-22-svc_1280x720_1.webm +LIBVPX_TEST_DATA-$(CONFIG_VP9_DECODER) += vp90-2-22-svc_1280x720_1.webm.md5 diff --git a/test/test-data.sha1 b/test/test-data.sha1 index 57d6502a9..99b4e1e46 100644 --- a/test/test-data.sha1 +++ b/test/test-data.sha1 @@ -852,3 +852,5 @@ e402cbbf9e550ae017a1e9f1f73931c1d18474e8 *invalid-crbug-667044.webm d3964f9dad9f60363c81b688324d95b4ec7c8038 *invalid-crbug-667044.webm.res fd9df7f3f6992af1d7a9dde975c9a0d6f28c053d *invalid-bug-1443.ivf fd3020fa6e9ca5966206738654c97dec313b0a95 *invalid-bug-1443.ivf.res +17696cd21e875f1d6e5d418cbf89feab02c8850a *vp90-2-22-svc_1280x720_1.webm +e2f9e1e47a791b4e939a9bdc50bf7a25b3761f77 *vp90-2-22-svc_1280x720_1.webm.md5 diff --git a/test/test_vectors.cc b/test/test_vectors.cc index def78da28..3ffc3efc4 100644 --- a/test/test_vectors.cc +++ b/test/test_vectors.cc @@ -371,6 +371,7 @@ const char *const kVP9TestVectors[] = { #endif // CONFIG_VP9_HIGHBITDEPTH "vp90-2-20-big_superframe-01.webm", "vp90-2-20-big_superframe-02.webm", + "vp90-2-22-svc_1280x720_1.webm", RESIZE_TEST_VECTORS }; const char *const kVP9TestVectorsSvc[] = { "vp90-2-22-svc_1280x720_3.ivf" }; -- 2.40.0