1ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org/*
2ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *
4ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  Use of this source code is governed by a BSD-style license
5ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  that can be found in the LICENSE file in the root of the source
6ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  tree. An additional intellectual property rights grant can be found
7ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  in the file PATENTS.  All contributing project authors may
8ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org */
10ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#ifndef TEST_VIDEO_SOURCE_H_
11ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#define TEST_VIDEO_SOURCE_H_
12ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
13ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#if defined(_WIN32)
14ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#include <windows.h>
15ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#endif
16ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <cstdio>
17ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <cstdlib>
18ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include <string>
19ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "test/acm_random.h"
20ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#include "vpx/vpx_encoder.h"
21ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
22ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgnamespace libvpx_test {
23ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
24d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// Helper macros to ensure LIBVPX_TEST_DATA_PATH is a quoted string.
25d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// These are undefined right below GetDataPath
26d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// NOTE: LIBVPX_TEST_DATA_PATH MUST NOT be a quoted string before
27d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// Stringification or the GetDataPath will fail at runtime
28d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define TO_STRING(S) #S
29d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#define STRINGIFY(S) TO_STRING(S)
30ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
31d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// A simple function to encapsulate cross platform retrieval of test data path
32d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstatic std::string GetDataPath() {
33d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const char *const data_path = getenv("LIBVPX_TEST_DATA_PATH");
34d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  if (data_path == NULL) {
35d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#ifdef LIBVPX_TEST_DATA_PATH
36d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    // In some environments, we cannot set environment variables
37d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    // Instead, we set the data path by using a preprocessor symbol
38d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    // which can be set from make files
39d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    return STRINGIFY(LIBVPX_TEST_DATA_PATH);
40d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#else
41d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org    return ".";
42d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#endif
43ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
44d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  return data_path;
45d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org}
46ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
47d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org// Undefining stringification macros because they are not used elsewhere
48d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#undef TO_STRING
49d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org#undef STRINGIFY
50d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org
51d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.orgstatic FILE *OpenTestDataFile(const std::string& file_name) {
52d851b91d14ef0bd71acdce7b90c9a8f1af1181adjohannkoenig@chromium.org  const std::string path_to_source = GetDataPath() + "/" + file_name;
53ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  return fopen(path_to_source.c_str(), "rb");
54ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}
55ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
5641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgstatic FILE *GetTempOutFile(std::string *file_name) {
5741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  file_name->clear();
58ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#if defined(_WIN32)
59ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  char fname[MAX_PATH];
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  char tmppath[MAX_PATH];
6141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  if (GetTempPathA(MAX_PATH, tmppath)) {
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    // Assume for now that the filename generated is unique per process
6341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (GetTempFileNameA(tmppath, "lvx", 0, fname)) {
6441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      file_name->assign(fname);
6541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      return fopen(fname, "wb+");
6641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
67ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
6841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  return NULL;
69ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#else
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  return tmpfile();
71ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org#endif
72e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org}
73e2064011d36b2008099446503f28e64d445060ecjohannkoenig@chromium.org
74ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.orgclass TempOutFile {
75ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org public:
76ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  TempOutFile() {
7741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    file_ = GetTempOutFile(&file_name_);
78ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
79ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  ~TempOutFile() {
80ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    CloseFile();
81ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    if (!file_name_.empty()) {
8241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      EXPECT_EQ(0, remove(file_name_.c_str()));
83ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    }
84ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
85ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  FILE *file() {
86ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    return file_;
87ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
88ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  const std::string& file_name() {
89ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    return file_name_;
90ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
9141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
9241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org protected:
93ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  void CloseFile() {
94ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    if (file_) {
95ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      fclose(file_);
96ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      file_ = NULL;
97ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    }
98ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
99ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  FILE *file_;
100ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  std::string file_name_;
101ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org};
102ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
103ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org// Abstract base class for test video sources, which provide a stream of
104ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org// vpx_image_t images with associated timestamps and duration.
105ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgclass VideoSource {
106ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public:
107ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual ~VideoSource() {}
108ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
109ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Prepare the stream for reading, rewind/open as necessary.
110ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Begin() = 0;
111ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
112ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Advance the cursor to the next frame
113ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Next() = 0;
114ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
115ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the current video frame, or NULL on End-Of-Stream.
116ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_image_t *img() const = 0;
117ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
118ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the presentation timestamp of the current frame.
119ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_codec_pts_t pts() const = 0;
120ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
121ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the current frame's duration
122ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned long duration() const = 0;
123ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
124ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the timebase for the stream
125ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_rational_t timebase() const = 0;
126ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
127ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the current frame counter, starting at 0.
128ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned int frame() const = 0;
129ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
130ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Get the current file limit.
131ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned int limit() const = 0;
132ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org};
133ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
134ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
135ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgclass DummyVideoSource : public VideoSource {
136ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public:
137ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  DummyVideoSource() : img_(NULL), limit_(100), width_(0), height_(0) {
138ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    SetSize(80, 64);
139ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
140ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
141ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual ~DummyVideoSource() { vpx_img_free(img_); }
142ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
143ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Begin() {
144ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    frame_ = 0;
145ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    FillFrame();
146ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
147ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
148ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Next() {
149ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    ++frame_;
150ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    FillFrame();
151ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
152ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
153ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_image_t *img() const {
154ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    return (frame_ < limit_) ? img_ : NULL;
155ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
156ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
157ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Models a stream where Timebase = 1/FPS, so pts == frame.
158ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_codec_pts_t pts() const { return frame_; }
159ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
160ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned long duration() const { return 1; }
161ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
162ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual vpx_rational_t timebase() const {
163ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    const vpx_rational_t t = {1, 30};
164ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    return t;
165ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
166ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
167ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned int frame() const { return frame_; }
168ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
169ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual unsigned int limit() const { return limit_; }
170ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
171ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  void set_limit(unsigned int limit) {
172ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    limit_ = limit;
173ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  }
174ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org
175ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  void SetSize(unsigned int width, unsigned int height) {
176ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    if (width != width_ || height != height_) {
177ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      vpx_img_free(img_);
178ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      raw_sz_ = ((width + 31)&~31) * height * 3 / 2;
17910a9a0d835561a7f2300c561c514efcf374554d6fgalligan@chromium.org      img_ = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, width, height, 32);
180ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      width_ = width;
181ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      height_ = height;
182ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    }
183ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
184ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
185ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org protected:
186ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org  virtual void FillFrame() { if (img_) memset(img_->img_data, 0, raw_sz_); }
187ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
188ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  vpx_image_t *img_;
189ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  size_t       raw_sz_;
190ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int limit_;
191ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int frame_;
192ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int width_;
193ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  unsigned int height_;
194ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org};
195ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
196ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgclass RandomVideoSource : public DummyVideoSource {
198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public:
199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  RandomVideoSource(int seed = ACMRandom::DeterministicSeed())
200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org      : rnd_(seed),
201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org        seed_(seed) { }
202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
203ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org protected:
204ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Reset the RNG to get a matching stream for the second pass
205ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Begin() {
206ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    frame_ = 0;
207ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    rnd_.Reset(seed_);
208ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org    FillFrame();
209ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
210ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
211ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // 15 frames of noise, followed by 15 static frames. Reset to 0 rather
212ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // than holding previous frames to encourage keyframes to be thrown.
213ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void FillFrame() {
214ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    if (img_) {
215ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      if (frame_ % 30 < 15)
216ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org        for (size_t i = 0; i < raw_sz_; ++i)
217ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org          img_->img_data[i] = rnd_.Rand8();
218ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org      else
219ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org        memset(img_->img_data, 0, raw_sz_);
220ac4e313c19203132648a2a271703b6ee76fe4284johannkoenig@chromium.org    }
221ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  }
222ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
223ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  ACMRandom rnd_;
224ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  int seed_;
225ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org};
226ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
227ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org// Abstract base class for test video sources, which provide a stream of
228ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org// decompressed images to the decoder.
229ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.orgclass CompressedVideoSource {
230ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org public:
231ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual ~CompressedVideoSource() {}
232ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
233ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Init() = 0;
234ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
235ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Prepare the stream for reading, rewind/open as necessary.
236ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Begin() = 0;
237ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
238ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  // Advance the cursor to the next frame
239ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual void Next() = 0;
240ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
241ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org  virtual const uint8_t *cxdata() const = 0;
242ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
243411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org  virtual size_t frame_size() const = 0;
244ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
245411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org  virtual unsigned int frame_number() const = 0;
246ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org};
247ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
248ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org}  // namespace libvpx_test
249ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org
250ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif  // TEST_VIDEO_SOURCE_H_
251