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