12ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian/* 22ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * Copyright (c) 2012 The WebM project authors. All Rights Reserved. 32ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * 42ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 52ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 62ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 72ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 82ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 92ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian */ 102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#ifndef TEST_Y4M_VIDEO_SOURCE_H_ 112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define TEST_Y4M_VIDEO_SOURCE_H_ 122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include <string> 132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "test/video_source.h" 152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#include "./y4minput.h" 162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramaniannamespace libvpx_test { 182ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 192ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// This class extends VideoSource to allow parsing of raw yv12 202ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian// so that we can do actual file encodes. 212ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanianclass Y4mVideoSource : public VideoSource { 222ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian public: 232ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian Y4mVideoSource(const std::string &file_name, 242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int start, int limit) 252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian : file_name_(file_name), 262ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input_file_(NULL), 272ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian img_(new vpx_image_t()), 282ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian start_(start), 292ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian limit_(limit), 302ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian frame_(0), 312ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian framerate_numerator_(0), 322ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian framerate_denominator_(0), 332ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_() { 342ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 352ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 362ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual ~Y4mVideoSource() { 372ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian vpx_img_free(img_.get()); 382ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CloseSource(); 392ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 402ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian virtual void OpenSource() { 422ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian CloseSource(); 432ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input_file_ = OpenTestDataFile(file_name_); 442ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: " 45ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian << file_name_; 46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 472ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian virtual void ReadSourceToStart() { 49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ASSERT_TRUE(input_file_ != NULL); 50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ASSERT_FALSE(y4m_input_open(&y4m_, input_file_, NULL, 0, 0)); 512ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian framerate_numerator_ = y4m_.fps_n; 522ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian framerate_denominator_ = y4m_.fps_d; 532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian frame_ = 0; 542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian for (unsigned int i = 0; i < start_; i++) { 55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian Next(); 562ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FillFrame(); 582ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 592ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 60ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian virtual void Begin() { 61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian OpenSource(); 62ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ReadSourceToStart(); 63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian } 64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 652ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual void Next() { 662ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ++frame_; 672ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FillFrame(); 682ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 692ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 702ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual vpx_image_t *img() const { 712ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian return (frame_ < limit_) ? img_.get() : NULL; 722ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 732ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 742ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Models a stream where Timebase = 1/FPS, so pts == frame. 752ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual vpx_codec_pts_t pts() const { return frame_; } 762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual unsigned long duration() const { return 1; } 782ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 792ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual vpx_rational_t timebase() const { 802ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ }; 812ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian return t; 822ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 832ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 842ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual unsigned int frame() const { return frame_; } 852ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 862ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual unsigned int limit() const { return limit_; } 872ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 882ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian virtual void FillFrame() { 892ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian ASSERT_TRUE(input_file_ != NULL); 902ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian // Read a frame from input_file. 912ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_input_fetch_frame(&y4m_, input_file_, img_.get()); 922ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 932ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 942ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian protected: 952ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian void CloseSource() { 962ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_input_close(&y4m_); 972ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_ = y4m_input(); 982ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian if (input_file_ != NULL) { 992ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian fclose(input_file_); 1002ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian input_file_ = NULL; 1012ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 1022ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian } 1032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1042ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian std::string file_name_; 1052ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian FILE *input_file_; 1062ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian testing::internal::scoped_ptr<vpx_image_t> img_; 1072ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int start_; 1082ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int limit_; 1092ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian unsigned int frame_; 1102ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int framerate_numerator_; 1112ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian int framerate_denominator_; 1122ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian y4m_input y4m_; 1132ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian}; 1142ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1152ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian} // namespace libvpx_test 1162ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian 1172ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#endif // TEST_Y4M_VIDEO_SOURCE_H_ 118