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