11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2012 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann#ifndef TEST_I420_VIDEO_SOURCE_H_
111b362b15af34006e6a11974088a46d42b903418eJohann#define TEST_I420_VIDEO_SOURCE_H_
121b362b15af34006e6a11974088a46d42b903418eJohann#include <cstdio>
131b362b15af34006e6a11974088a46d42b903418eJohann#include <cstdlib>
143df0563f1b24dac6c0bd122fc922a48211269061hkuang#include <string>
151b362b15af34006e6a11974088a46d42b903418eJohann
161b362b15af34006e6a11974088a46d42b903418eJohann#include "test/video_source.h"
171b362b15af34006e6a11974088a46d42b903418eJohann
181b362b15af34006e6a11974088a46d42b903418eJohannnamespace libvpx_test {
191b362b15af34006e6a11974088a46d42b903418eJohann
201b362b15af34006e6a11974088a46d42b903418eJohann// This class extends VideoSource to allow parsing of raw yv12
211b362b15af34006e6a11974088a46d42b903418eJohann// so that we can do actual file encodes.
221b362b15af34006e6a11974088a46d42b903418eJohannclass I420VideoSource : public VideoSource {
231b362b15af34006e6a11974088a46d42b903418eJohann public:
241b362b15af34006e6a11974088a46d42b903418eJohann  I420VideoSource(const std::string &file_name,
251b362b15af34006e6a11974088a46d42b903418eJohann                  unsigned int width, unsigned int height,
261b362b15af34006e6a11974088a46d42b903418eJohann                  int rate_numerator, int rate_denominator,
271b362b15af34006e6a11974088a46d42b903418eJohann                  unsigned int start, int limit)
281b362b15af34006e6a11974088a46d42b903418eJohann      : file_name_(file_name),
291b362b15af34006e6a11974088a46d42b903418eJohann        input_file_(NULL),
301b362b15af34006e6a11974088a46d42b903418eJohann        img_(NULL),
311b362b15af34006e6a11974088a46d42b903418eJohann        start_(start),
321b362b15af34006e6a11974088a46d42b903418eJohann        limit_(limit),
331b362b15af34006e6a11974088a46d42b903418eJohann        frame_(0),
341b362b15af34006e6a11974088a46d42b903418eJohann        width_(0),
351b362b15af34006e6a11974088a46d42b903418eJohann        height_(0),
361b362b15af34006e6a11974088a46d42b903418eJohann        framerate_numerator_(rate_numerator),
371b362b15af34006e6a11974088a46d42b903418eJohann        framerate_denominator_(rate_denominator) {
381b362b15af34006e6a11974088a46d42b903418eJohann    // This initializes raw_sz_, width_, height_ and allocates an img.
391b362b15af34006e6a11974088a46d42b903418eJohann    SetSize(width, height);
401b362b15af34006e6a11974088a46d42b903418eJohann  }
411b362b15af34006e6a11974088a46d42b903418eJohann
421b362b15af34006e6a11974088a46d42b903418eJohann  virtual ~I420VideoSource() {
431b362b15af34006e6a11974088a46d42b903418eJohann    vpx_img_free(img_);
441b362b15af34006e6a11974088a46d42b903418eJohann    if (input_file_)
451b362b15af34006e6a11974088a46d42b903418eJohann      fclose(input_file_);
461b362b15af34006e6a11974088a46d42b903418eJohann  }
471b362b15af34006e6a11974088a46d42b903418eJohann
481b362b15af34006e6a11974088a46d42b903418eJohann  virtual void Begin() {
491b362b15af34006e6a11974088a46d42b903418eJohann    if (input_file_)
501b362b15af34006e6a11974088a46d42b903418eJohann      fclose(input_file_);
511b362b15af34006e6a11974088a46d42b903418eJohann    input_file_ = OpenTestDataFile(file_name_);
5291037db265ecdd914a26e056cf69207b4f50924ehkuang    ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: "
531b362b15af34006e6a11974088a46d42b903418eJohann        << file_name_;
541b362b15af34006e6a11974088a46d42b903418eJohann    if (start_) {
55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian      fseek(input_file_, static_cast<unsigned>(raw_sz_) * start_, SEEK_SET);
561b362b15af34006e6a11974088a46d42b903418eJohann    }
571b362b15af34006e6a11974088a46d42b903418eJohann
581b362b15af34006e6a11974088a46d42b903418eJohann    frame_ = start_;
591b362b15af34006e6a11974088a46d42b903418eJohann    FillFrame();
601b362b15af34006e6a11974088a46d42b903418eJohann  }
611b362b15af34006e6a11974088a46d42b903418eJohann
621b362b15af34006e6a11974088a46d42b903418eJohann  virtual void Next() {
631b362b15af34006e6a11974088a46d42b903418eJohann    ++frame_;
641b362b15af34006e6a11974088a46d42b903418eJohann    FillFrame();
651b362b15af34006e6a11974088a46d42b903418eJohann  }
661b362b15af34006e6a11974088a46d42b903418eJohann
671b362b15af34006e6a11974088a46d42b903418eJohann  virtual vpx_image_t *img() const { return (frame_ < limit_) ? img_ : NULL;  }
681b362b15af34006e6a11974088a46d42b903418eJohann
691b362b15af34006e6a11974088a46d42b903418eJohann  // Models a stream where Timebase = 1/FPS, so pts == frame.
701b362b15af34006e6a11974088a46d42b903418eJohann  virtual vpx_codec_pts_t pts() const { return frame_; }
711b362b15af34006e6a11974088a46d42b903418eJohann
721b362b15af34006e6a11974088a46d42b903418eJohann  virtual unsigned long duration() const { return 1; }
731b362b15af34006e6a11974088a46d42b903418eJohann
741b362b15af34006e6a11974088a46d42b903418eJohann  virtual vpx_rational_t timebase() const {
751b362b15af34006e6a11974088a46d42b903418eJohann    const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ };
761b362b15af34006e6a11974088a46d42b903418eJohann    return t;
771b362b15af34006e6a11974088a46d42b903418eJohann  }
781b362b15af34006e6a11974088a46d42b903418eJohann
791b362b15af34006e6a11974088a46d42b903418eJohann  virtual unsigned int frame() const { return frame_; }
801b362b15af34006e6a11974088a46d42b903418eJohann
811b362b15af34006e6a11974088a46d42b903418eJohann  virtual unsigned int limit() const { return limit_; }
821b362b15af34006e6a11974088a46d42b903418eJohann
831b362b15af34006e6a11974088a46d42b903418eJohann  void SetSize(unsigned int width, unsigned int height) {
841b362b15af34006e6a11974088a46d42b903418eJohann    if (width != width_ || height != height_) {
851b362b15af34006e6a11974088a46d42b903418eJohann      vpx_img_free(img_);
86ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang      img_ = vpx_img_alloc(NULL, VPX_IMG_FMT_I420, width, height, 1);
871b362b15af34006e6a11974088a46d42b903418eJohann      ASSERT_TRUE(img_ != NULL);
881b362b15af34006e6a11974088a46d42b903418eJohann      width_ = width;
891b362b15af34006e6a11974088a46d42b903418eJohann      height_ = height;
901b362b15af34006e6a11974088a46d42b903418eJohann      raw_sz_ = width * height * 3 / 2;
911b362b15af34006e6a11974088a46d42b903418eJohann    }
921b362b15af34006e6a11974088a46d42b903418eJohann  }
931b362b15af34006e6a11974088a46d42b903418eJohann
941b362b15af34006e6a11974088a46d42b903418eJohann  virtual void FillFrame() {
9591037db265ecdd914a26e056cf69207b4f50924ehkuang    ASSERT_TRUE(input_file_ != NULL);
961b362b15af34006e6a11974088a46d42b903418eJohann    // Read a frame from input_file.
971b362b15af34006e6a11974088a46d42b903418eJohann    if (fread(img_->img_data, raw_sz_, 1, input_file_) == 0) {
981b362b15af34006e6a11974088a46d42b903418eJohann      limit_ = frame_;
991b362b15af34006e6a11974088a46d42b903418eJohann    }
1001b362b15af34006e6a11974088a46d42b903418eJohann  }
1011b362b15af34006e6a11974088a46d42b903418eJohann
1021b362b15af34006e6a11974088a46d42b903418eJohann protected:
1031b362b15af34006e6a11974088a46d42b903418eJohann  std::string file_name_;
1041b362b15af34006e6a11974088a46d42b903418eJohann  FILE *input_file_;
1051b362b15af34006e6a11974088a46d42b903418eJohann  vpx_image_t *img_;
1061b362b15af34006e6a11974088a46d42b903418eJohann  size_t raw_sz_;
1071b362b15af34006e6a11974088a46d42b903418eJohann  unsigned int start_;
1081b362b15af34006e6a11974088a46d42b903418eJohann  unsigned int limit_;
1091b362b15af34006e6a11974088a46d42b903418eJohann  unsigned int frame_;
1101b362b15af34006e6a11974088a46d42b903418eJohann  unsigned int width_;
1111b362b15af34006e6a11974088a46d42b903418eJohann  unsigned int height_;
11291037db265ecdd914a26e056cf69207b4f50924ehkuang  int framerate_numerator_;
11391037db265ecdd914a26e056cf69207b4f50924ehkuang  int framerate_denominator_;
1141b362b15af34006e6a11974088a46d42b903418eJohann};
1151b362b15af34006e6a11974088a46d42b903418eJohann
1161b362b15af34006e6a11974088a46d42b903418eJohann}  // namespace libvpx_test
1171b362b15af34006e6a11974088a46d42b903418eJohann
1181b362b15af34006e6a11974088a46d42b903418eJohann#endif  // TEST_I420_VIDEO_SOURCE_H_
119