• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2014 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 #ifndef TEST_YUV_VIDEO_SOURCE_H_
11 #define TEST_YUV_VIDEO_SOURCE_H_
12 
13 #include <cstdio>
14 #include <cstdlib>
15 #include <string>
16 
17 #include "test/video_source.h"
18 #include "vpx/vpx_image.h"
19 
20 namespace libvpx_test {
21 
22 // This class extends VideoSource to allow parsing of raw YUV
23 // formats of various color sampling and bit-depths so that we can
24 // do actual file encodes.
25 class YUVVideoSource : public VideoSource {
26  public:
YUVVideoSource(const std::string & file_name,vpx_img_fmt format,unsigned int width,unsigned int height,int rate_numerator,int rate_denominator,unsigned int start,int limit)27   YUVVideoSource(const std::string &file_name, vpx_img_fmt format,
28                  unsigned int width, unsigned int height,
29                  int rate_numerator, int rate_denominator,
30                  unsigned int start, int limit)
31       : file_name_(file_name),
32         input_file_(NULL),
33         img_(NULL),
34         start_(start),
35         limit_(limit),
36         frame_(0),
37         width_(0),
38         height_(0),
39         format_(VPX_IMG_FMT_NONE),
40         framerate_numerator_(rate_numerator),
41         framerate_denominator_(rate_denominator) {
42     // This initializes format_, raw_size_, width_, height_ and allocates img.
43     SetSize(width, height, format);
44   }
45 
~YUVVideoSource()46   virtual ~YUVVideoSource() {
47     vpx_img_free(img_);
48     if (input_file_)
49       fclose(input_file_);
50   }
51 
Begin()52   virtual void Begin() {
53     if (input_file_)
54       fclose(input_file_);
55     input_file_ = OpenTestDataFile(file_name_);
56     ASSERT_TRUE(input_file_ != NULL) << "Input file open failed. Filename: "
57                                      << file_name_;
58     if (start_)
59       fseek(input_file_, static_cast<unsigned>(raw_size_) * start_, SEEK_SET);
60 
61     frame_ = start_;
62     FillFrame();
63   }
64 
Next()65   virtual void Next() {
66     ++frame_;
67     FillFrame();
68   }
69 
img()70   virtual vpx_image_t *img() const { return (frame_ < limit_) ? img_ : NULL;  }
71 
72   // Models a stream where Timebase = 1/FPS, so pts == frame.
pts()73   virtual vpx_codec_pts_t pts() const { return frame_; }
74 
duration()75   virtual unsigned long duration() const { return 1; }
76 
timebase()77   virtual vpx_rational_t timebase() const {
78     const vpx_rational_t t = { framerate_denominator_, framerate_numerator_ };
79     return t;
80   }
81 
frame()82   virtual unsigned int frame() const { return frame_; }
83 
limit()84   virtual unsigned int limit() const { return limit_; }
85 
SetSize(unsigned int width,unsigned int height,vpx_img_fmt format)86   virtual void SetSize(unsigned int width, unsigned int height,
87                        vpx_img_fmt format) {
88     if (width != width_ || height != height_ || format != format_) {
89       vpx_img_free(img_);
90       img_ = vpx_img_alloc(NULL, format, width, height, 1);
91       ASSERT_TRUE(img_ != NULL);
92       width_ = width;
93       height_ = height;
94       format_ = format;
95       switch (format) {
96         case VPX_IMG_FMT_I420:
97           raw_size_ = width * height * 3 / 2;
98           break;
99         case VPX_IMG_FMT_I422:
100           raw_size_ = width * height * 2;
101           break;
102         case VPX_IMG_FMT_I440:
103           raw_size_ = width * height * 2;
104           break;
105         case VPX_IMG_FMT_I444:
106           raw_size_ = width * height * 3;
107           break;
108         case VPX_IMG_FMT_I42016:
109           raw_size_ = width * height * 3;
110           break;
111         case VPX_IMG_FMT_I42216:
112           raw_size_ = width * height * 4;
113           break;
114         case VPX_IMG_FMT_I44016:
115           raw_size_ = width * height * 4;
116           break;
117         case VPX_IMG_FMT_I44416:
118           raw_size_ = width * height * 6;
119           break;
120         default:
121           ASSERT_TRUE(0);
122       }
123     }
124   }
125 
FillFrame()126   virtual void FillFrame() {
127     ASSERT_TRUE(input_file_ != NULL);
128     // Read a frame from input_file.
129     if (fread(img_->img_data, raw_size_, 1, input_file_) == 0) {
130       limit_ = frame_;
131     }
132   }
133 
134  protected:
135   std::string file_name_;
136   FILE *input_file_;
137   vpx_image_t *img_;
138   size_t raw_size_;
139   unsigned int start_;
140   unsigned int limit_;
141   unsigned int frame_;
142   unsigned int width_;
143   unsigned int height_;
144   vpx_img_fmt format_;
145   int framerate_numerator_;
146   int framerate_denominator_;
147 };
148 
149 }  // namespace libvpx_test
150 
151 #endif  // TEST_YUV_VIDEO_SOURCE_H_
152