external_frame_buffer_test.cc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. /*
  2. * Copyright (c) 2014 The WebM project authors. All Rights Reserved.
  3. *
  4. * Use of this source code is governed by a BSD-style license
  5. * that can be found in the LICENSE file in the root of the source
  6. * tree. An additional intellectual property rights grant can be found
  7. * in the file PATENTS. All contributing project authors may
  8. * be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #include <memory>
  11. #include <string>
  12. #include "./vpx_config.h"
  13. #include "test/codec_factory.h"
  14. #include "test/decode_test_driver.h"
  15. #include "test/ivf_video_source.h"
  16. #include "test/md5_helper.h"
  17. #include "test/test_vectors.h"
  18. #include "test/util.h"
  19. #if CONFIG_WEBM_IO
  20. #include "test/webm_video_source.h"
  21. #endif
  22. namespace {
  23. const int kVideoNameParam = 1;
  24. struct ExternalFrameBuffer {
  25. uint8_t *data;
  26. size_t size;
  27. int in_use;
  28. };
  29. // Class to manipulate a list of external frame buffers.
  30. class ExternalFrameBufferList {
  31. public:
  32. ExternalFrameBufferList()
  33. : num_buffers_(0), num_used_buffers_(0), ext_fb_list_(NULL) {}
  34. virtual ~ExternalFrameBufferList() {
  35. for (int i = 0; i < num_buffers_; ++i) {
  36. delete[] ext_fb_list_[i].data;
  37. }
  38. delete[] ext_fb_list_;
  39. }
  40. // Creates the list to hold the external buffers. Returns true on success.
  41. bool CreateBufferList(int num_buffers) {
  42. if (num_buffers < 0) return false;
  43. num_buffers_ = num_buffers;
  44. ext_fb_list_ = new ExternalFrameBuffer[num_buffers_];
  45. EXPECT_TRUE(ext_fb_list_ != NULL);
  46. memset(ext_fb_list_, 0, sizeof(ext_fb_list_[0]) * num_buffers_);
  47. return true;
  48. }
  49. // Searches the frame buffer list for a free frame buffer. Makes sure
  50. // that the frame buffer is at least |min_size| in bytes. Marks that the
  51. // frame buffer is in use by libvpx. Finally sets |fb| to point to the
  52. // external frame buffer. Returns < 0 on an error.
  53. int GetFreeFrameBuffer(size_t min_size, vpx_codec_frame_buffer_t *fb) {
  54. EXPECT_TRUE(fb != NULL);
  55. const int idx = FindFreeBufferIndex();
  56. if (idx == num_buffers_) return -1;
  57. if (ext_fb_list_[idx].size < min_size) {
  58. delete[] ext_fb_list_[idx].data;
  59. ext_fb_list_[idx].data = new uint8_t[min_size];
  60. memset(ext_fb_list_[idx].data, 0, min_size);
  61. ext_fb_list_[idx].size = min_size;
  62. }
  63. SetFrameBuffer(idx, fb);
  64. num_used_buffers_++;
  65. return 0;
  66. }
  67. // Test function that will not allocate any data for the frame buffer.
  68. // Returns < 0 on an error.
  69. int GetZeroFrameBuffer(size_t min_size, vpx_codec_frame_buffer_t *fb) {
  70. EXPECT_TRUE(fb != NULL);
  71. const int idx = FindFreeBufferIndex();
  72. if (idx == num_buffers_) return -1;
  73. if (ext_fb_list_[idx].size < min_size) {
  74. delete[] ext_fb_list_[idx].data;
  75. ext_fb_list_[idx].data = NULL;
  76. ext_fb_list_[idx].size = min_size;
  77. }
  78. SetFrameBuffer(idx, fb);
  79. return 0;
  80. }
  81. // Marks the external frame buffer that |fb| is pointing to as free.
  82. // Returns < 0 on an error.
  83. int ReturnFrameBuffer(vpx_codec_frame_buffer_t *fb) {
  84. if (fb == NULL) {
  85. EXPECT_TRUE(fb != NULL);
  86. return -1;
  87. }
  88. ExternalFrameBuffer *const ext_fb =
  89. reinterpret_cast<ExternalFrameBuffer *>(fb->priv);
  90. if (ext_fb == NULL) {
  91. EXPECT_TRUE(ext_fb != NULL);
  92. return -1;
  93. }
  94. EXPECT_EQ(1, ext_fb->in_use);
  95. ext_fb->in_use = 0;
  96. num_used_buffers_--;
  97. return 0;
  98. }
  99. // Checks that the vpx_image_t data is contained within the external frame
  100. // buffer private data passed back in the vpx_image_t.
  101. void CheckImageFrameBuffer(const vpx_image_t *img) {
  102. if (img->fb_priv != NULL) {
  103. const struct ExternalFrameBuffer *const ext_fb =
  104. reinterpret_cast<ExternalFrameBuffer *>(img->fb_priv);
  105. ASSERT_TRUE(img->planes[0] >= ext_fb->data &&
  106. img->planes[0] < (ext_fb->data + ext_fb->size));
  107. }
  108. }
  109. int num_used_buffers() const { return num_used_buffers_; }
  110. private:
  111. // Returns the index of the first free frame buffer. Returns |num_buffers_|
  112. // if there are no free frame buffers.
  113. int FindFreeBufferIndex() {
  114. int i;
  115. // Find a free frame buffer.
  116. for (i = 0; i < num_buffers_; ++i) {
  117. if (!ext_fb_list_[i].in_use) break;
  118. }
  119. return i;
  120. }
  121. // Sets |fb| to an external frame buffer. idx is the index into the frame
  122. // buffer list.
  123. void SetFrameBuffer(int idx, vpx_codec_frame_buffer_t *fb) {
  124. ASSERT_TRUE(fb != NULL);
  125. fb->data = ext_fb_list_[idx].data;
  126. fb->size = ext_fb_list_[idx].size;
  127. ASSERT_EQ(0, ext_fb_list_[idx].in_use);
  128. ext_fb_list_[idx].in_use = 1;
  129. fb->priv = &ext_fb_list_[idx];
  130. }
  131. int num_buffers_;
  132. int num_used_buffers_;
  133. ExternalFrameBuffer *ext_fb_list_;
  134. };
  135. #if CONFIG_WEBM_IO
  136. // Callback used by libvpx to request the application to return a frame
  137. // buffer of at least |min_size| in bytes.
  138. int get_vp9_frame_buffer(void *user_priv, size_t min_size,
  139. vpx_codec_frame_buffer_t *fb) {
  140. ExternalFrameBufferList *const fb_list =
  141. reinterpret_cast<ExternalFrameBufferList *>(user_priv);
  142. return fb_list->GetFreeFrameBuffer(min_size, fb);
  143. }
  144. // Callback used by libvpx to tell the application that |fb| is not needed
  145. // anymore.
  146. int release_vp9_frame_buffer(void *user_priv, vpx_codec_frame_buffer_t *fb) {
  147. ExternalFrameBufferList *const fb_list =
  148. reinterpret_cast<ExternalFrameBufferList *>(user_priv);
  149. return fb_list->ReturnFrameBuffer(fb);
  150. }
  151. // Callback will not allocate data for frame buffer.
  152. int get_vp9_zero_frame_buffer(void *user_priv, size_t min_size,
  153. vpx_codec_frame_buffer_t *fb) {
  154. ExternalFrameBufferList *const fb_list =
  155. reinterpret_cast<ExternalFrameBufferList *>(user_priv);
  156. return fb_list->GetZeroFrameBuffer(min_size, fb);
  157. }
  158. // Callback will allocate one less byte than |min_size|.
  159. int get_vp9_one_less_byte_frame_buffer(void *user_priv, size_t min_size,
  160. vpx_codec_frame_buffer_t *fb) {
  161. ExternalFrameBufferList *const fb_list =
  162. reinterpret_cast<ExternalFrameBufferList *>(user_priv);
  163. return fb_list->GetFreeFrameBuffer(min_size - 1, fb);
  164. }
  165. // Callback will not release the external frame buffer.
  166. int do_not_release_vp9_frame_buffer(void *user_priv,
  167. vpx_codec_frame_buffer_t *fb) {
  168. (void)user_priv;
  169. (void)fb;
  170. return 0;
  171. }
  172. #endif // CONFIG_WEBM_IO
  173. // Class for testing passing in external frame buffers to libvpx.
  174. class ExternalFrameBufferMD5Test
  175. : public ::libvpx_test::DecoderTest,
  176. public ::libvpx_test::CodecTestWithParam<const char *> {
  177. protected:
  178. ExternalFrameBufferMD5Test()
  179. : DecoderTest(GET_PARAM(::libvpx_test::kCodecFactoryParam)),
  180. md5_file_(NULL), num_buffers_(0) {}
  181. virtual ~ExternalFrameBufferMD5Test() {
  182. if (md5_file_ != NULL) fclose(md5_file_);
  183. }
  184. virtual void PreDecodeFrameHook(
  185. const libvpx_test::CompressedVideoSource &video,
  186. libvpx_test::Decoder *decoder) {
  187. if (num_buffers_ > 0 && video.frame_number() == 0) {
  188. // Have libvpx use frame buffers we create.
  189. ASSERT_TRUE(fb_list_.CreateBufferList(num_buffers_));
  190. ASSERT_EQ(VPX_CODEC_OK,
  191. decoder->SetFrameBufferFunctions(GetVP9FrameBuffer,
  192. ReleaseVP9FrameBuffer, this));
  193. }
  194. }
  195. void OpenMD5File(const std::string &md5_file_name_) {
  196. md5_file_ = libvpx_test::OpenTestDataFile(md5_file_name_);
  197. ASSERT_TRUE(md5_file_ != NULL)
  198. << "Md5 file open failed. Filename: " << md5_file_name_;
  199. }
  200. virtual void DecompressedFrameHook(const vpx_image_t &img,
  201. const unsigned int frame_number) {
  202. ASSERT_TRUE(md5_file_ != NULL);
  203. char expected_md5[33];
  204. char junk[128];
  205. // Read correct md5 checksums.
  206. const int res = fscanf(md5_file_, "%s %s", expected_md5, junk);
  207. ASSERT_NE(EOF, res) << "Read md5 data failed";
  208. expected_md5[32] = '\0';
  209. ::libvpx_test::MD5 md5_res;
  210. md5_res.Add(&img);
  211. const char *const actual_md5 = md5_res.Get();
  212. // Check md5 match.
  213. ASSERT_STREQ(expected_md5, actual_md5)
  214. << "Md5 checksums don't match: frame number = " << frame_number;
  215. }
  216. // Callback to get a free external frame buffer. Return value < 0 is an
  217. // error.
  218. static int GetVP9FrameBuffer(void *user_priv, size_t min_size,
  219. vpx_codec_frame_buffer_t *fb) {
  220. ExternalFrameBufferMD5Test *const md5Test =
  221. reinterpret_cast<ExternalFrameBufferMD5Test *>(user_priv);
  222. return md5Test->fb_list_.GetFreeFrameBuffer(min_size, fb);
  223. }
  224. // Callback to release an external frame buffer. Return value < 0 is an
  225. // error.
  226. static int ReleaseVP9FrameBuffer(void *user_priv,
  227. vpx_codec_frame_buffer_t *fb) {
  228. ExternalFrameBufferMD5Test *const md5Test =
  229. reinterpret_cast<ExternalFrameBufferMD5Test *>(user_priv);
  230. return md5Test->fb_list_.ReturnFrameBuffer(fb);
  231. }
  232. void set_num_buffers(int num_buffers) { num_buffers_ = num_buffers; }
  233. int num_buffers() const { return num_buffers_; }
  234. private:
  235. FILE *md5_file_;
  236. int num_buffers_;
  237. ExternalFrameBufferList fb_list_;
  238. };
  239. #if CONFIG_WEBM_IO
  240. const char kVP9TestFile[] = "vp90-2-02-size-lf-1920x1080.webm";
  241. const char kVP9NonRefTestFile[] = "vp90-2-22-svc_1280x720_1.webm";
  242. // Class for testing passing in external frame buffers to libvpx.
  243. class ExternalFrameBufferTest : public ::testing::Test {
  244. protected:
  245. ExternalFrameBufferTest() : video_(NULL), decoder_(NULL), num_buffers_(0) {}
  246. virtual void SetUp() {
  247. video_ = new libvpx_test::WebMVideoSource(kVP9TestFile);
  248. ASSERT_TRUE(video_ != NULL);
  249. video_->Init();
  250. video_->Begin();
  251. vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
  252. decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
  253. ASSERT_TRUE(decoder_ != NULL);
  254. }
  255. virtual void TearDown() {
  256. delete decoder_;
  257. decoder_ = NULL;
  258. delete video_;
  259. video_ = NULL;
  260. }
  261. // Passes the external frame buffer information to libvpx.
  262. vpx_codec_err_t SetFrameBufferFunctions(
  263. int num_buffers, vpx_get_frame_buffer_cb_fn_t cb_get,
  264. vpx_release_frame_buffer_cb_fn_t cb_release) {
  265. if (num_buffers > 0) {
  266. num_buffers_ = num_buffers;
  267. EXPECT_TRUE(fb_list_.CreateBufferList(num_buffers_));
  268. }
  269. return decoder_->SetFrameBufferFunctions(cb_get, cb_release, &fb_list_);
  270. }
  271. vpx_codec_err_t DecodeOneFrame() {
  272. const vpx_codec_err_t res =
  273. decoder_->DecodeFrame(video_->cxdata(), video_->frame_size());
  274. CheckDecodedFrames();
  275. if (res == VPX_CODEC_OK) video_->Next();
  276. return res;
  277. }
  278. vpx_codec_err_t DecodeRemainingFrames() {
  279. for (; video_->cxdata() != NULL; video_->Next()) {
  280. const vpx_codec_err_t res =
  281. decoder_->DecodeFrame(video_->cxdata(), video_->frame_size());
  282. if (res != VPX_CODEC_OK) return res;
  283. CheckDecodedFrames();
  284. }
  285. return VPX_CODEC_OK;
  286. }
  287. void CheckDecodedFrames() {
  288. libvpx_test::DxDataIterator dec_iter = decoder_->GetDxData();
  289. const vpx_image_t *img = NULL;
  290. // Get decompressed data
  291. while ((img = dec_iter.Next()) != NULL) {
  292. fb_list_.CheckImageFrameBuffer(img);
  293. }
  294. }
  295. libvpx_test::WebMVideoSource *video_;
  296. libvpx_test::VP9Decoder *decoder_;
  297. int num_buffers_;
  298. ExternalFrameBufferList fb_list_;
  299. };
  300. class ExternalFrameBufferNonRefTest : public ExternalFrameBufferTest {
  301. protected:
  302. virtual void SetUp() {
  303. video_ = new libvpx_test::WebMVideoSource(kVP9NonRefTestFile);
  304. ASSERT_TRUE(video_ != NULL);
  305. video_->Init();
  306. video_->Begin();
  307. vpx_codec_dec_cfg_t cfg = vpx_codec_dec_cfg_t();
  308. decoder_ = new libvpx_test::VP9Decoder(cfg, 0);
  309. ASSERT_TRUE(decoder_ != NULL);
  310. }
  311. virtual void CheckFrameBufferRelease() {
  312. TearDown();
  313. ASSERT_EQ(0, fb_list_.num_used_buffers());
  314. }
  315. };
  316. #endif // CONFIG_WEBM_IO
  317. // This test runs through the set of test vectors, and decodes them.
  318. // Libvpx will call into the application to allocate a frame buffer when
  319. // needed. The md5 checksums are computed for each frame in the video file.
  320. // If md5 checksums match the correct md5 data, then the test is passed.
  321. // Otherwise, the test failed.
  322. TEST_P(ExternalFrameBufferMD5Test, ExtFBMD5Match) {
  323. const std::string filename = GET_PARAM(kVideoNameParam);
  324. // Number of buffers equals #VP9_MAXIMUM_REF_BUFFERS +
  325. // #VPX_MAXIMUM_WORK_BUFFERS + four jitter buffers.
  326. const int jitter_buffers = 4;
  327. const int num_buffers =
  328. VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS + jitter_buffers;
  329. set_num_buffers(num_buffers);
  330. #if CONFIG_VP8_DECODER
  331. // Tell compiler we are not using kVP8TestVectors.
  332. (void)libvpx_test::kVP8TestVectors;
  333. #endif
  334. // Open compressed video file.
  335. std::unique_ptr<libvpx_test::CompressedVideoSource> video;
  336. if (filename.substr(filename.length() - 3, 3) == "ivf") {
  337. video.reset(new libvpx_test::IVFVideoSource(filename));
  338. } else {
  339. #if CONFIG_WEBM_IO
  340. video.reset(new libvpx_test::WebMVideoSource(filename));
  341. #else
  342. fprintf(stderr, "WebM IO is disabled, skipping test vector %s\n",
  343. filename.c_str());
  344. return;
  345. #endif
  346. }
  347. ASSERT_TRUE(video.get() != NULL);
  348. video->Init();
  349. // Construct md5 file name.
  350. const std::string md5_filename = filename + ".md5";
  351. OpenMD5File(md5_filename);
  352. // Decode frame, and check the md5 matching.
  353. ASSERT_NO_FATAL_FAILURE(RunLoop(video.get()));
  354. }
  355. #if CONFIG_WEBM_IO
  356. TEST_F(ExternalFrameBufferTest, MinFrameBuffers) {
  357. // Minimum number of external frame buffers for VP9 is
  358. // #VP9_MAXIMUM_REF_BUFFERS + #VPX_MAXIMUM_WORK_BUFFERS.
  359. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  360. ASSERT_EQ(VPX_CODEC_OK,
  361. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  362. release_vp9_frame_buffer));
  363. ASSERT_EQ(VPX_CODEC_OK, DecodeRemainingFrames());
  364. }
  365. TEST_F(ExternalFrameBufferTest, EightJitterBuffers) {
  366. // Number of buffers equals #VP9_MAXIMUM_REF_BUFFERS +
  367. // #VPX_MAXIMUM_WORK_BUFFERS + eight jitter buffers.
  368. const int jitter_buffers = 8;
  369. const int num_buffers =
  370. VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS + jitter_buffers;
  371. ASSERT_EQ(VPX_CODEC_OK,
  372. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  373. release_vp9_frame_buffer));
  374. ASSERT_EQ(VPX_CODEC_OK, DecodeRemainingFrames());
  375. }
  376. TEST_F(ExternalFrameBufferTest, NotEnoughBuffers) {
  377. // Minimum number of external frame buffers for VP9 is
  378. // #VP9_MAXIMUM_REF_BUFFERS + #VPX_MAXIMUM_WORK_BUFFERS. Most files will
  379. // only use 5 frame buffers at one time.
  380. const int num_buffers = 2;
  381. ASSERT_EQ(VPX_CODEC_OK,
  382. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  383. release_vp9_frame_buffer));
  384. ASSERT_EQ(VPX_CODEC_OK, DecodeOneFrame());
  385. // Only run this on long clips. Decoding a very short clip will return
  386. // VPX_CODEC_OK even with only 2 buffers.
  387. ASSERT_EQ(VPX_CODEC_MEM_ERROR, DecodeRemainingFrames());
  388. }
  389. TEST_F(ExternalFrameBufferTest, NoRelease) {
  390. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  391. ASSERT_EQ(VPX_CODEC_OK,
  392. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  393. do_not_release_vp9_frame_buffer));
  394. ASSERT_EQ(VPX_CODEC_OK, DecodeOneFrame());
  395. ASSERT_EQ(VPX_CODEC_MEM_ERROR, DecodeRemainingFrames());
  396. }
  397. TEST_F(ExternalFrameBufferTest, NullRealloc) {
  398. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  399. ASSERT_EQ(VPX_CODEC_OK,
  400. SetFrameBufferFunctions(num_buffers, get_vp9_zero_frame_buffer,
  401. release_vp9_frame_buffer));
  402. ASSERT_EQ(VPX_CODEC_MEM_ERROR, DecodeOneFrame());
  403. }
  404. TEST_F(ExternalFrameBufferTest, ReallocOneLessByte) {
  405. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  406. ASSERT_EQ(VPX_CODEC_OK, SetFrameBufferFunctions(
  407. num_buffers, get_vp9_one_less_byte_frame_buffer,
  408. release_vp9_frame_buffer));
  409. ASSERT_EQ(VPX_CODEC_MEM_ERROR, DecodeOneFrame());
  410. }
  411. TEST_F(ExternalFrameBufferTest, NullGetFunction) {
  412. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  413. ASSERT_EQ(
  414. VPX_CODEC_INVALID_PARAM,
  415. SetFrameBufferFunctions(num_buffers, NULL, release_vp9_frame_buffer));
  416. }
  417. TEST_F(ExternalFrameBufferTest, NullReleaseFunction) {
  418. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  419. ASSERT_EQ(VPX_CODEC_INVALID_PARAM,
  420. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer, NULL));
  421. }
  422. TEST_F(ExternalFrameBufferTest, SetAfterDecode) {
  423. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  424. ASSERT_EQ(VPX_CODEC_OK, DecodeOneFrame());
  425. ASSERT_EQ(VPX_CODEC_ERROR,
  426. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  427. release_vp9_frame_buffer));
  428. }
  429. TEST_F(ExternalFrameBufferNonRefTest, ReleaseNonRefFrameBuffer) {
  430. const int num_buffers = VP9_MAXIMUM_REF_BUFFERS + VPX_MAXIMUM_WORK_BUFFERS;
  431. ASSERT_EQ(VPX_CODEC_OK,
  432. SetFrameBufferFunctions(num_buffers, get_vp9_frame_buffer,
  433. release_vp9_frame_buffer));
  434. ASSERT_EQ(VPX_CODEC_OK, DecodeRemainingFrames());
  435. CheckFrameBufferRelease();
  436. }
  437. #endif // CONFIG_WEBM_IO
  438. VP9_INSTANTIATE_TEST_CASE(
  439. ExternalFrameBufferMD5Test,
  440. ::testing::ValuesIn(libvpx_test::kVP9TestVectors,
  441. libvpx_test::kVP9TestVectors +
  442. libvpx_test::kNumVP9TestVectors));
  443. } // namespace