/*
 *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <stdio.h>
#include <string>

#include "api/video/i420_buffer.h"
#include "rtc_base/scoped_ref_ptr.h"
#include "test/frame_utils.h"
#include "test/testsupport/fileutils.h"
#include "test/testsupport/frame_reader.h"

namespace webrtc {
namespace test {

YuvFrameReaderImpl::YuvFrameReaderImpl(std::string input_filename,
                                       int width,
                                       int height)
    : input_filename_(input_filename),
      frame_length_in_bytes_(0),
      width_(width),
      height_(height),
      number_of_frames_(-1),
      input_file_(nullptr) {}

YuvFrameReaderImpl::~YuvFrameReaderImpl() {
  Close();
}

bool YuvFrameReaderImpl::Init() {
  if (width_ <= 0 || height_ <= 0) {
    fprintf(stderr, "Frame width and height must be >0, was %d x %d\n", width_,
            height_);
    return false;
  }
  frame_length_in_bytes_ =
      width_ * height_ + 2 * ((width_ + 1) / 2) * ((height_ + 1) / 2);

  input_file_ = fopen(input_filename_.c_str(), "rb");
  if (input_file_ == nullptr) {
    fprintf(stderr, "Couldn't open input file for reading: %s\n",
            input_filename_.c_str());
    return false;
  }
  // Calculate total number of frames.
  size_t source_file_size = GetFileSize(input_filename_);
  if (source_file_size <= 0u) {
    fprintf(stderr, "Found empty file: %s\n", input_filename_.c_str());
    return false;
  }
  number_of_frames_ =
      static_cast<int>(source_file_size / frame_length_in_bytes_);
  return true;
}

rtc::scoped_refptr<I420Buffer> YuvFrameReaderImpl::ReadFrame() {
  if (input_file_ == nullptr) {
    fprintf(stderr,
            "YuvFrameReaderImpl is not initialized (input file is NULL)\n");
    return nullptr;
  }
  rtc::scoped_refptr<I420Buffer> buffer(
      ReadI420Buffer(width_, height_, input_file_));
  if (!buffer && ferror(input_file_)) {
    fprintf(stderr, "Error reading from input file: %s\n",
            input_filename_.c_str());
  }
  return buffer;
}

void YuvFrameReaderImpl::Close() {
  if (input_file_ != nullptr) {
    fclose(input_file_);
    input_file_ = nullptr;
  }
}

size_t YuvFrameReaderImpl::FrameLength() {
  return frame_length_in_bytes_;
}

int YuvFrameReaderImpl::NumberOfFrames() {
  return number_of_frames_;
}

}  // namespace test
}  // namespace webrtc
