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