xref: /aosp_15_r20/external/libaom/test/video_source.h (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_TEST_VIDEO_SOURCE_H_
12*77c1e3ccSAndroid Build Coastguard Worker #define AOM_TEST_VIDEO_SOURCE_H_
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker #if defined(_WIN32)
15*77c1e3ccSAndroid Build Coastguard Worker #undef NOMINMAX
16*77c1e3ccSAndroid Build Coastguard Worker #define NOMINMAX
17*77c1e3ccSAndroid Build Coastguard Worker #undef WIN32_LEAN_AND_MEAN
18*77c1e3ccSAndroid Build Coastguard Worker #define WIN32_LEAN_AND_MEAN
19*77c1e3ccSAndroid Build Coastguard Worker #include <windows.h>
20*77c1e3ccSAndroid Build Coastguard Worker #endif
21*77c1e3ccSAndroid Build Coastguard Worker #include <cstdio>
22*77c1e3ccSAndroid Build Coastguard Worker #include <cstdlib>
23*77c1e3ccSAndroid Build Coastguard Worker #include <cstring>
24*77c1e3ccSAndroid Build Coastguard Worker #include <memory>
25*77c1e3ccSAndroid Build Coastguard Worker #include <string>
26*77c1e3ccSAndroid Build Coastguard Worker 
27*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_encoder.h"
28*77c1e3ccSAndroid Build Coastguard Worker #include "test/acm_random.h"
29*77c1e3ccSAndroid Build Coastguard Worker #if !defined(_WIN32)
30*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
31*77c1e3ccSAndroid Build Coastguard Worker #endif
32*77c1e3ccSAndroid Build Coastguard Worker 
33*77c1e3ccSAndroid Build Coastguard Worker namespace libaom_test {
34*77c1e3ccSAndroid Build Coastguard Worker 
35*77c1e3ccSAndroid Build Coastguard Worker // Helper macros to ensure LIBAOM_TEST_DATA_PATH is a quoted string.
36*77c1e3ccSAndroid Build Coastguard Worker // These are undefined right below GetDataPath
37*77c1e3ccSAndroid Build Coastguard Worker // NOTE: LIBAOM_TEST_DATA_PATH MUST NOT be a quoted string before
38*77c1e3ccSAndroid Build Coastguard Worker // Stringification or the GetDataPath will fail at runtime
39*77c1e3ccSAndroid Build Coastguard Worker #define TO_STRING(S) #S
40*77c1e3ccSAndroid Build Coastguard Worker #define STRINGIFY(S) TO_STRING(S)
41*77c1e3ccSAndroid Build Coastguard Worker 
42*77c1e3ccSAndroid Build Coastguard Worker // A simple function to encapsulate cross platform retrieval of test data path
GetDataPath()43*77c1e3ccSAndroid Build Coastguard Worker static std::string GetDataPath() {
44*77c1e3ccSAndroid Build Coastguard Worker   const char *const data_path = getenv("LIBAOM_TEST_DATA_PATH");
45*77c1e3ccSAndroid Build Coastguard Worker   if (data_path == nullptr) {
46*77c1e3ccSAndroid Build Coastguard Worker #ifdef LIBAOM_TEST_DATA_PATH
47*77c1e3ccSAndroid Build Coastguard Worker     // In some environments, we cannot set environment variables
48*77c1e3ccSAndroid Build Coastguard Worker     // Instead, we set the data path by using a preprocessor symbol
49*77c1e3ccSAndroid Build Coastguard Worker     // which can be set from make files
50*77c1e3ccSAndroid Build Coastguard Worker     return STRINGIFY(LIBAOM_TEST_DATA_PATH);
51*77c1e3ccSAndroid Build Coastguard Worker #else
52*77c1e3ccSAndroid Build Coastguard Worker     return ".";
53*77c1e3ccSAndroid Build Coastguard Worker #endif
54*77c1e3ccSAndroid Build Coastguard Worker   }
55*77c1e3ccSAndroid Build Coastguard Worker   return data_path;
56*77c1e3ccSAndroid Build Coastguard Worker }
57*77c1e3ccSAndroid Build Coastguard Worker 
58*77c1e3ccSAndroid Build Coastguard Worker // Undefining stringification macros because they are not used elsewhere
59*77c1e3ccSAndroid Build Coastguard Worker #undef TO_STRING
60*77c1e3ccSAndroid Build Coastguard Worker #undef STRINGIFY
61*77c1e3ccSAndroid Build Coastguard Worker 
OpenTestDataFile(const std::string & file_name)62*77c1e3ccSAndroid Build Coastguard Worker inline FILE *OpenTestDataFile(const std::string &file_name) {
63*77c1e3ccSAndroid Build Coastguard Worker   const std::string path_to_source = GetDataPath() + "/" + file_name;
64*77c1e3ccSAndroid Build Coastguard Worker   return fopen(path_to_source.c_str(), "rb");
65*77c1e3ccSAndroid Build Coastguard Worker }
66*77c1e3ccSAndroid Build Coastguard Worker 
GetTempOutFile(std::string * file_name)67*77c1e3ccSAndroid Build Coastguard Worker static FILE *GetTempOutFile(std::string *file_name) {
68*77c1e3ccSAndroid Build Coastguard Worker   file_name->clear();
69*77c1e3ccSAndroid Build Coastguard Worker #if defined(_WIN32)
70*77c1e3ccSAndroid Build Coastguard Worker   char fname[MAX_PATH];
71*77c1e3ccSAndroid Build Coastguard Worker   char tmppath[MAX_PATH];
72*77c1e3ccSAndroid Build Coastguard Worker   if (GetTempPathA(MAX_PATH, tmppath)) {
73*77c1e3ccSAndroid Build Coastguard Worker     // Assume for now that the filename generated is unique per process
74*77c1e3ccSAndroid Build Coastguard Worker     if (GetTempFileNameA(tmppath, "lvx", 0, fname)) {
75*77c1e3ccSAndroid Build Coastguard Worker       file_name->assign(fname);
76*77c1e3ccSAndroid Build Coastguard Worker       return fopen(fname, "wb+");
77*77c1e3ccSAndroid Build Coastguard Worker     }
78*77c1e3ccSAndroid Build Coastguard Worker   }
79*77c1e3ccSAndroid Build Coastguard Worker   return nullptr;
80*77c1e3ccSAndroid Build Coastguard Worker #else
81*77c1e3ccSAndroid Build Coastguard Worker   std::string temp_dir = testing::TempDir();
82*77c1e3ccSAndroid Build Coastguard Worker   if (temp_dir.empty()) return nullptr;
83*77c1e3ccSAndroid Build Coastguard Worker   // Versions of testing::TempDir() prior to release-1.11.0-214-g5e6a5336 may
84*77c1e3ccSAndroid Build Coastguard Worker   // use the value of an environment variable without checking for a trailing
85*77c1e3ccSAndroid Build Coastguard Worker   // path delimiter.
86*77c1e3ccSAndroid Build Coastguard Worker   if (temp_dir[temp_dir.size() - 1] != '/') temp_dir += '/';
87*77c1e3ccSAndroid Build Coastguard Worker   const char name_template[] = "libaomtest.XXXXXX";
88*77c1e3ccSAndroid Build Coastguard Worker   std::unique_ptr<char[]> temp_file_name(
89*77c1e3ccSAndroid Build Coastguard Worker       new char[temp_dir.size() + sizeof(name_template)]);
90*77c1e3ccSAndroid Build Coastguard Worker   if (temp_file_name == nullptr) return nullptr;
91*77c1e3ccSAndroid Build Coastguard Worker   memcpy(temp_file_name.get(), temp_dir.data(), temp_dir.size());
92*77c1e3ccSAndroid Build Coastguard Worker   memcpy(temp_file_name.get() + temp_dir.size(), name_template,
93*77c1e3ccSAndroid Build Coastguard Worker          sizeof(name_template));
94*77c1e3ccSAndroid Build Coastguard Worker   const int fd = mkstemp(temp_file_name.get());
95*77c1e3ccSAndroid Build Coastguard Worker   if (fd == -1) return nullptr;
96*77c1e3ccSAndroid Build Coastguard Worker   *file_name = temp_file_name.get();
97*77c1e3ccSAndroid Build Coastguard Worker   return fdopen(fd, "wb+");
98*77c1e3ccSAndroid Build Coastguard Worker #endif
99*77c1e3ccSAndroid Build Coastguard Worker }
100*77c1e3ccSAndroid Build Coastguard Worker 
101*77c1e3ccSAndroid Build Coastguard Worker class TempOutFile {
102*77c1e3ccSAndroid Build Coastguard Worker  public:
TempOutFile()103*77c1e3ccSAndroid Build Coastguard Worker   TempOutFile() { file_ = GetTempOutFile(&file_name_); }
~TempOutFile()104*77c1e3ccSAndroid Build Coastguard Worker   ~TempOutFile() {
105*77c1e3ccSAndroid Build Coastguard Worker     CloseFile();
106*77c1e3ccSAndroid Build Coastguard Worker     if (!file_name_.empty()) {
107*77c1e3ccSAndroid Build Coastguard Worker       EXPECT_EQ(0, remove(file_name_.c_str()));
108*77c1e3ccSAndroid Build Coastguard Worker     }
109*77c1e3ccSAndroid Build Coastguard Worker   }
file()110*77c1e3ccSAndroid Build Coastguard Worker   FILE *file() { return file_; }
file_name()111*77c1e3ccSAndroid Build Coastguard Worker   const std::string &file_name() { return file_name_; }
112*77c1e3ccSAndroid Build Coastguard Worker 
113*77c1e3ccSAndroid Build Coastguard Worker  protected:
CloseFile()114*77c1e3ccSAndroid Build Coastguard Worker   void CloseFile() {
115*77c1e3ccSAndroid Build Coastguard Worker     if (file_) {
116*77c1e3ccSAndroid Build Coastguard Worker       fclose(file_);
117*77c1e3ccSAndroid Build Coastguard Worker       file_ = nullptr;
118*77c1e3ccSAndroid Build Coastguard Worker     }
119*77c1e3ccSAndroid Build Coastguard Worker   }
120*77c1e3ccSAndroid Build Coastguard Worker   FILE *file_;
121*77c1e3ccSAndroid Build Coastguard Worker   std::string file_name_;
122*77c1e3ccSAndroid Build Coastguard Worker };
123*77c1e3ccSAndroid Build Coastguard Worker 
124*77c1e3ccSAndroid Build Coastguard Worker // Abstract base class for test video sources, which provide a stream of
125*77c1e3ccSAndroid Build Coastguard Worker // aom_image_t images with associated timestamps and duration.
126*77c1e3ccSAndroid Build Coastguard Worker class VideoSource {
127*77c1e3ccSAndroid Build Coastguard Worker  public:
128*77c1e3ccSAndroid Build Coastguard Worker   virtual ~VideoSource() = default;
129*77c1e3ccSAndroid Build Coastguard Worker 
130*77c1e3ccSAndroid Build Coastguard Worker   // Prepare the stream for reading, rewind/open as necessary.
131*77c1e3ccSAndroid Build Coastguard Worker   virtual void Begin() = 0;
132*77c1e3ccSAndroid Build Coastguard Worker 
133*77c1e3ccSAndroid Build Coastguard Worker   // Advance the cursor to the next frame
134*77c1e3ccSAndroid Build Coastguard Worker   virtual void Next() = 0;
135*77c1e3ccSAndroid Build Coastguard Worker 
136*77c1e3ccSAndroid Build Coastguard Worker   // Get the current video frame, or nullptr on End-Of-Stream.
137*77c1e3ccSAndroid Build Coastguard Worker   virtual aom_image_t *img() const = 0;
138*77c1e3ccSAndroid Build Coastguard Worker 
139*77c1e3ccSAndroid Build Coastguard Worker   // Get the presentation timestamp of the current frame.
140*77c1e3ccSAndroid Build Coastguard Worker   virtual aom_codec_pts_t pts() const = 0;
141*77c1e3ccSAndroid Build Coastguard Worker 
142*77c1e3ccSAndroid Build Coastguard Worker   // Get the current frame's duration
143*77c1e3ccSAndroid Build Coastguard Worker   virtual unsigned long duration() const = 0;
144*77c1e3ccSAndroid Build Coastguard Worker 
145*77c1e3ccSAndroid Build Coastguard Worker   // Get the timebase for the stream
146*77c1e3ccSAndroid Build Coastguard Worker   virtual aom_rational_t timebase() const = 0;
147*77c1e3ccSAndroid Build Coastguard Worker 
148*77c1e3ccSAndroid Build Coastguard Worker   // Get the current frame counter, starting at 0.
149*77c1e3ccSAndroid Build Coastguard Worker   virtual unsigned int frame() const = 0;
150*77c1e3ccSAndroid Build Coastguard Worker 
151*77c1e3ccSAndroid Build Coastguard Worker   // Get the current file limit.
152*77c1e3ccSAndroid Build Coastguard Worker   virtual unsigned int limit() const = 0;
153*77c1e3ccSAndroid Build Coastguard Worker };
154*77c1e3ccSAndroid Build Coastguard Worker 
155*77c1e3ccSAndroid Build Coastguard Worker class DummyVideoSource : public VideoSource {
156*77c1e3ccSAndroid Build Coastguard Worker  public:
DummyVideoSource()157*77c1e3ccSAndroid Build Coastguard Worker   DummyVideoSource()
158*77c1e3ccSAndroid Build Coastguard Worker       : img_(nullptr), limit_(100), width_(80), height_(64),
159*77c1e3ccSAndroid Build Coastguard Worker         format_(AOM_IMG_FMT_I420) {
160*77c1e3ccSAndroid Build Coastguard Worker     ReallocImage();
161*77c1e3ccSAndroid Build Coastguard Worker   }
162*77c1e3ccSAndroid Build Coastguard Worker 
~DummyVideoSource()163*77c1e3ccSAndroid Build Coastguard Worker   ~DummyVideoSource() override { aom_img_free(img_); }
164*77c1e3ccSAndroid Build Coastguard Worker 
Begin()165*77c1e3ccSAndroid Build Coastguard Worker   void Begin() override {
166*77c1e3ccSAndroid Build Coastguard Worker     frame_ = 0;
167*77c1e3ccSAndroid Build Coastguard Worker     FillFrame();
168*77c1e3ccSAndroid Build Coastguard Worker   }
169*77c1e3ccSAndroid Build Coastguard Worker 
Next()170*77c1e3ccSAndroid Build Coastguard Worker   void Next() override {
171*77c1e3ccSAndroid Build Coastguard Worker     ++frame_;
172*77c1e3ccSAndroid Build Coastguard Worker     FillFrame();
173*77c1e3ccSAndroid Build Coastguard Worker   }
174*77c1e3ccSAndroid Build Coastguard Worker 
img()175*77c1e3ccSAndroid Build Coastguard Worker   aom_image_t *img() const override {
176*77c1e3ccSAndroid Build Coastguard Worker     return (frame_ < limit_) ? img_ : nullptr;
177*77c1e3ccSAndroid Build Coastguard Worker   }
178*77c1e3ccSAndroid Build Coastguard Worker 
179*77c1e3ccSAndroid Build Coastguard Worker   // Models a stream where Timebase = 1/FPS, so pts == frame.
pts()180*77c1e3ccSAndroid Build Coastguard Worker   aom_codec_pts_t pts() const override { return frame_; }
181*77c1e3ccSAndroid Build Coastguard Worker 
duration()182*77c1e3ccSAndroid Build Coastguard Worker   unsigned long duration() const override { return 1; }
183*77c1e3ccSAndroid Build Coastguard Worker 
timebase()184*77c1e3ccSAndroid Build Coastguard Worker   aom_rational_t timebase() const override {
185*77c1e3ccSAndroid Build Coastguard Worker     const aom_rational_t t = { 1, 30 };
186*77c1e3ccSAndroid Build Coastguard Worker     return t;
187*77c1e3ccSAndroid Build Coastguard Worker   }
188*77c1e3ccSAndroid Build Coastguard Worker 
frame()189*77c1e3ccSAndroid Build Coastguard Worker   unsigned int frame() const override { return frame_; }
190*77c1e3ccSAndroid Build Coastguard Worker 
limit()191*77c1e3ccSAndroid Build Coastguard Worker   unsigned int limit() const override { return limit_; }
192*77c1e3ccSAndroid Build Coastguard Worker 
set_limit(unsigned int limit)193*77c1e3ccSAndroid Build Coastguard Worker   void set_limit(unsigned int limit) { limit_ = limit; }
194*77c1e3ccSAndroid Build Coastguard Worker 
SetSize(unsigned int width,unsigned int height)195*77c1e3ccSAndroid Build Coastguard Worker   void SetSize(unsigned int width, unsigned int height) {
196*77c1e3ccSAndroid Build Coastguard Worker     if (width != width_ || height != height_) {
197*77c1e3ccSAndroid Build Coastguard Worker       width_ = width;
198*77c1e3ccSAndroid Build Coastguard Worker       height_ = height;
199*77c1e3ccSAndroid Build Coastguard Worker       ReallocImage();
200*77c1e3ccSAndroid Build Coastguard Worker     }
201*77c1e3ccSAndroid Build Coastguard Worker   }
202*77c1e3ccSAndroid Build Coastguard Worker 
SetImageFormat(aom_img_fmt_t format)203*77c1e3ccSAndroid Build Coastguard Worker   void SetImageFormat(aom_img_fmt_t format) {
204*77c1e3ccSAndroid Build Coastguard Worker     if (format_ != format) {
205*77c1e3ccSAndroid Build Coastguard Worker       format_ = format;
206*77c1e3ccSAndroid Build Coastguard Worker       ReallocImage();
207*77c1e3ccSAndroid Build Coastguard Worker     }
208*77c1e3ccSAndroid Build Coastguard Worker   }
209*77c1e3ccSAndroid Build Coastguard Worker 
210*77c1e3ccSAndroid Build Coastguard Worker  protected:
FillFrame()211*77c1e3ccSAndroid Build Coastguard Worker   virtual void FillFrame() {
212*77c1e3ccSAndroid Build Coastguard Worker     if (img_) memset(img_->img_data, 0, raw_sz_);
213*77c1e3ccSAndroid Build Coastguard Worker   }
214*77c1e3ccSAndroid Build Coastguard Worker 
ReallocImage()215*77c1e3ccSAndroid Build Coastguard Worker   void ReallocImage() {
216*77c1e3ccSAndroid Build Coastguard Worker     aom_img_free(img_);
217*77c1e3ccSAndroid Build Coastguard Worker     img_ = aom_img_alloc(nullptr, format_, width_, height_, 32);
218*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_NE(img_, nullptr);
219*77c1e3ccSAndroid Build Coastguard Worker     raw_sz_ = ((img_->w + 31) & ~31u) * img_->h * img_->bps / 8;
220*77c1e3ccSAndroid Build Coastguard Worker   }
221*77c1e3ccSAndroid Build Coastguard Worker 
222*77c1e3ccSAndroid Build Coastguard Worker   aom_image_t *img_;
223*77c1e3ccSAndroid Build Coastguard Worker   size_t raw_sz_;
224*77c1e3ccSAndroid Build Coastguard Worker   unsigned int limit_;
225*77c1e3ccSAndroid Build Coastguard Worker   unsigned int frame_;
226*77c1e3ccSAndroid Build Coastguard Worker   unsigned int width_;
227*77c1e3ccSAndroid Build Coastguard Worker   unsigned int height_;
228*77c1e3ccSAndroid Build Coastguard Worker   aom_img_fmt_t format_;
229*77c1e3ccSAndroid Build Coastguard Worker };
230*77c1e3ccSAndroid Build Coastguard Worker 
231*77c1e3ccSAndroid Build Coastguard Worker class RandomVideoSource : public DummyVideoSource {
232*77c1e3ccSAndroid Build Coastguard Worker  public:
233*77c1e3ccSAndroid Build Coastguard Worker   RandomVideoSource(int seed = ACMRandom::DeterministicSeed())
rnd_(seed)234*77c1e3ccSAndroid Build Coastguard Worker       : rnd_(seed), seed_(seed) {}
235*77c1e3ccSAndroid Build Coastguard Worker 
236*77c1e3ccSAndroid Build Coastguard Worker   // Reset the RNG to get a matching stream for the second pass
Begin()237*77c1e3ccSAndroid Build Coastguard Worker   void Begin() override {
238*77c1e3ccSAndroid Build Coastguard Worker     frame_ = 0;
239*77c1e3ccSAndroid Build Coastguard Worker     rnd_.Reset(seed_);
240*77c1e3ccSAndroid Build Coastguard Worker     FillFrame();
241*77c1e3ccSAndroid Build Coastguard Worker   }
242*77c1e3ccSAndroid Build Coastguard Worker 
243*77c1e3ccSAndroid Build Coastguard Worker  protected:
244*77c1e3ccSAndroid Build Coastguard Worker   // 15 frames of noise, followed by 15 static frames. Reset to 0 rather
245*77c1e3ccSAndroid Build Coastguard Worker   // than holding previous frames to encourage keyframes to be thrown.
FillFrame()246*77c1e3ccSAndroid Build Coastguard Worker   void FillFrame() override {
247*77c1e3ccSAndroid Build Coastguard Worker     if (img_) {
248*77c1e3ccSAndroid Build Coastguard Worker       if (frame_ % 30 < 15)
249*77c1e3ccSAndroid Build Coastguard Worker         for (size_t i = 0; i < raw_sz_; ++i) img_->img_data[i] = rnd_.Rand8();
250*77c1e3ccSAndroid Build Coastguard Worker       else
251*77c1e3ccSAndroid Build Coastguard Worker         memset(img_->img_data, 0, raw_sz_);
252*77c1e3ccSAndroid Build Coastguard Worker     }
253*77c1e3ccSAndroid Build Coastguard Worker   }
254*77c1e3ccSAndroid Build Coastguard Worker 
255*77c1e3ccSAndroid Build Coastguard Worker   ACMRandom rnd_;
256*77c1e3ccSAndroid Build Coastguard Worker   int seed_;
257*77c1e3ccSAndroid Build Coastguard Worker };
258*77c1e3ccSAndroid Build Coastguard Worker 
259*77c1e3ccSAndroid Build Coastguard Worker // Abstract base class for test video sources, which provide a stream of
260*77c1e3ccSAndroid Build Coastguard Worker // decompressed images to the decoder.
261*77c1e3ccSAndroid Build Coastguard Worker class CompressedVideoSource {
262*77c1e3ccSAndroid Build Coastguard Worker  public:
263*77c1e3ccSAndroid Build Coastguard Worker   virtual ~CompressedVideoSource() = default;
264*77c1e3ccSAndroid Build Coastguard Worker 
265*77c1e3ccSAndroid Build Coastguard Worker   virtual void Init() = 0;
266*77c1e3ccSAndroid Build Coastguard Worker 
267*77c1e3ccSAndroid Build Coastguard Worker   // Prepare the stream for reading, rewind/open as necessary.
268*77c1e3ccSAndroid Build Coastguard Worker   virtual void Begin() = 0;
269*77c1e3ccSAndroid Build Coastguard Worker 
270*77c1e3ccSAndroid Build Coastguard Worker   // Advance the cursor to the next frame
271*77c1e3ccSAndroid Build Coastguard Worker   virtual void Next() = 0;
272*77c1e3ccSAndroid Build Coastguard Worker 
273*77c1e3ccSAndroid Build Coastguard Worker   virtual const uint8_t *cxdata() const = 0;
274*77c1e3ccSAndroid Build Coastguard Worker 
275*77c1e3ccSAndroid Build Coastguard Worker   virtual size_t frame_size() const = 0;
276*77c1e3ccSAndroid Build Coastguard Worker 
277*77c1e3ccSAndroid Build Coastguard Worker   virtual unsigned int frame_number() const = 0;
278*77c1e3ccSAndroid Build Coastguard Worker };
279*77c1e3ccSAndroid Build Coastguard Worker 
280*77c1e3ccSAndroid Build Coastguard Worker }  // namespace libaom_test
281*77c1e3ccSAndroid Build Coastguard Worker 
282*77c1e3ccSAndroid Build Coastguard Worker #endif  // AOM_TEST_VIDEO_SOURCE_H_
283