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