kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 1 | /* |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 2 | * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 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 | |
pbos@webrtc.org | 34741c8 | 2013-05-27 08:02:22 +0000 | [diff] [blame] | 11 | #include "webrtc/test/testsupport/frame_reader.h" |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 12 | |
nisse | af91689 | 2017-01-10 07:44:26 -0800 | [diff] [blame] | 13 | #include "webrtc/api/video/i420_buffer.h" |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 14 | #include "webrtc/test/frame_utils.h" |
kjellander@webrtc.org | 9c4e662 | 2013-02-13 09:35:12 +0000 | [diff] [blame] | 15 | #include "webrtc/test/testsupport/fileutils.h" |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 16 | |
| 17 | namespace webrtc { |
| 18 | namespace test { |
| 19 | |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 20 | YuvFrameReaderImpl::YuvFrameReaderImpl(std::string input_filename, |
| 21 | int width, |
| 22 | int height) |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 23 | : input_filename_(input_filename), |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 24 | frame_length_in_bytes_(0), |
| 25 | width_(width), |
| 26 | height_(height), |
| 27 | number_of_frames_(-1), |
| 28 | input_file_(nullptr) {} |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 29 | |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 30 | YuvFrameReaderImpl::~YuvFrameReaderImpl() { |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 31 | Close(); |
| 32 | } |
| 33 | |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 34 | bool YuvFrameReaderImpl::Init() { |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 35 | if (width_ <= 0 || height_ <= 0) { |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 36 | fprintf(stderr, "Frame width and height must be >0, was %d x %d\n", width_, |
| 37 | height_); |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 38 | return false; |
| 39 | } |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 40 | frame_length_in_bytes_ = |
| 41 | width_ * height_ + 2 * ((width_ + 1) / 2) * ((height_ + 1) / 2); |
| 42 | |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 43 | input_file_ = fopen(input_filename_.c_str(), "rb"); |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 44 | if (input_file_ == nullptr) { |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 45 | fprintf(stderr, "Couldn't open input file for reading: %s\n", |
| 46 | input_filename_.c_str()); |
| 47 | return false; |
| 48 | } |
| 49 | // Calculate total number of frames. |
| 50 | size_t source_file_size = GetFileSize(input_filename_); |
| 51 | if (source_file_size <= 0u) { |
| 52 | fprintf(stderr, "Found empty file: %s\n", input_filename_.c_str()); |
| 53 | return false; |
| 54 | } |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 55 | number_of_frames_ = |
| 56 | static_cast<int>(source_file_size / frame_length_in_bytes_); |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 57 | return true; |
| 58 | } |
| 59 | |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 60 | rtc::scoped_refptr<I420Buffer> YuvFrameReaderImpl::ReadFrame() { |
| 61 | if (input_file_ == nullptr) { |
| 62 | fprintf(stderr, |
| 63 | "YuvFrameReaderImpl is not initialized (input file is NULL)\n"); |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 64 | return nullptr; |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 65 | } |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 66 | rtc::scoped_refptr<I420Buffer> buffer( |
| 67 | ReadI420Buffer(width_, height_, input_file_)); |
| 68 | if (!buffer && ferror(input_file_)) { |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 69 | fprintf(stderr, "Error reading from input file: %s\n", |
| 70 | input_filename_.c_str()); |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 71 | } |
nisse | 115bd15 | 2016-09-30 04:14:07 -0700 | [diff] [blame] | 72 | return buffer; |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 73 | } |
| 74 | |
brandtr | b78bc75 | 2017-02-22 01:26:59 -0800 | [diff] [blame] | 75 | void YuvFrameReaderImpl::Close() { |
| 76 | if (input_file_ != nullptr) { |
| 77 | fclose(input_file_); |
| 78 | input_file_ = nullptr; |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | size_t YuvFrameReaderImpl::FrameLength() { |
| 83 | return frame_length_in_bytes_; |
| 84 | } |
| 85 | |
| 86 | int YuvFrameReaderImpl::NumberOfFrames() { |
| 87 | return number_of_frames_; |
| 88 | } |
pbos@webrtc.org | e6c3966 | 2013-07-30 13:08:38 +0000 | [diff] [blame] | 89 | |
kjellander@webrtc.org | 5b97b12 | 2011-12-08 07:42:18 +0000 | [diff] [blame] | 90 | } // namespace test |
| 91 | } // namespace webrtc |