Home | History | Annotate | Download | only in testsupport
      1 /*
      2  *  Copyright (c) 2011 The WebRTC 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 
     11 #include "webrtc/test/testsupport/frame_reader.h"
     12 
     13 #include <assert.h>
     14 
     15 #include "webrtc/test/testsupport/fileutils.h"
     16 
     17 namespace webrtc {
     18 namespace test {
     19 
     20 FrameReaderImpl::FrameReaderImpl(std::string input_filename,
     21                                  size_t frame_length_in_bytes)
     22     : input_filename_(input_filename),
     23       frame_length_in_bytes_(frame_length_in_bytes),
     24       input_file_(NULL) {
     25 }
     26 
     27 FrameReaderImpl::~FrameReaderImpl() {
     28   Close();
     29 }
     30 
     31 bool FrameReaderImpl::Init() {
     32   if (frame_length_in_bytes_ <= 0) {
     33     fprintf(stderr, "Frame length must be >0, was %zu\n",
     34             frame_length_in_bytes_);
     35     return false;
     36   }
     37   input_file_ = fopen(input_filename_.c_str(), "rb");
     38   if (input_file_ == NULL) {
     39     fprintf(stderr, "Couldn't open input file for reading: %s\n",
     40             input_filename_.c_str());
     41     return false;
     42   }
     43   // Calculate total number of frames.
     44   size_t source_file_size = GetFileSize(input_filename_);
     45   if (source_file_size <= 0u) {
     46     fprintf(stderr, "Found empty file: %s\n", input_filename_.c_str());
     47     return false;
     48   }
     49   number_of_frames_ = static_cast<int>(source_file_size /
     50                                        frame_length_in_bytes_);
     51   return true;
     52 }
     53 
     54 void FrameReaderImpl::Close() {
     55   if (input_file_ != NULL) {
     56     fclose(input_file_);
     57     input_file_ = NULL;
     58   }
     59 }
     60 
     61 bool FrameReaderImpl::ReadFrame(uint8_t* source_buffer) {
     62   assert(source_buffer);
     63   if (input_file_ == NULL) {
     64     fprintf(stderr, "FrameReader is not initialized (input file is NULL)\n");
     65     return false;
     66   }
     67   size_t nbr_read = fread(source_buffer, 1, frame_length_in_bytes_,
     68                           input_file_);
     69   if (nbr_read != static_cast<unsigned int>(frame_length_in_bytes_) &&
     70       ferror(input_file_)) {
     71     fprintf(stderr, "Error reading from input file: %s\n",
     72             input_filename_.c_str());
     73     return false;
     74   }
     75   if (feof(input_file_) != 0) {
     76     return false;  // No more frames to process.
     77   }
     78   return true;
     79 }
     80 
     81 size_t FrameReaderImpl::FrameLength() { return frame_length_in_bytes_; }
     82 int FrameReaderImpl::NumberOfFrames() { return number_of_frames_; }
     83 
     84 }  // namespace test
     85 }  // namespace webrtc
     86