ref: a68bbcff290c2f75d7ee35b91d16df66ef9d8dfd
parent: eb7d431cb55c8254fcd0a362e269c1d7a25409ba
author: Jerome Jiang <jianj@google.com>
date: Tue Nov 7 12:20:34 EST 2017
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
--- a/test/external_frame_buffer_test.cc
+++ b/test/external_frame_buffer_test.cc
@@ -34,7 +34,8 @@
// 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 @@
}
SetFrameBuffer(idx, fb);
+
+ num_used_buffers_++;
return 0;
}
@@ -106,6 +109,7 @@
}
EXPECT_EQ(1, ext_fb->in_use);
ext_fb->in_use = 0;
+ num_used_buffers_--;
return 0;
}
@@ -121,6 +125,8 @@
}
}
+ 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 @@
}
int num_buffers_;
+ int num_used_buffers_;
ExternalFrameBuffer *ext_fb_list_;
};
@@ -273,6 +280,7 @@
#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 @@
virtual void TearDown() {
delete decoder_;
+ decoder_ = NULL;
delete video_;
+ video_ = NULL;
}
// Passes the external frame buffer information to libvpx.
@@ -325,7 +335,7 @@
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 @@
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 @@
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());
}
@@ -466,6 +497,15 @@
ASSERT_EQ(VPX_CODEC_ERROR,
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
--- 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.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
--- a/test/test-data.sha1
+++ b/test/test-data.sha1
@@ -852,3 +852,5 @@
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
--- a/test/test_vectors.cc
+++ b/test/test_vectors.cc
@@ -371,6 +371,7 @@
#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" };