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