/*
 *  Copyright (c) 2012 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.
 */

#ifndef WEBRTC_TEST_TESTSUPPORT_FRAME_WRITER_H_
#define WEBRTC_TEST_TESTSUPPORT_FRAME_WRITER_H_

#include <stdio.h>

#include <string>

#include "webrtc/api/video/video_frame.h"
#include "webrtc/typedefs.h"

namespace webrtc {
namespace test {

// Handles writing of video files.
class FrameWriter {
 public:
  virtual ~FrameWriter() {}

  // Initializes the file handler, i.e. opens the input and output files etc.
  // This must be called before reading or writing frames has started.
  // Returns false if an error has occurred, in addition to printing to stderr.
  virtual bool Init() = 0;

  // Writes a frame of the configured frame length to the output file.
  // Returns true if the write was successful, false otherwise.
  virtual bool WriteFrame(uint8_t* frame_buffer) = 0;

  // Closes the output file if open. Essentially makes this class impossible
  // to use anymore. Will also be invoked by the destructor.
  virtual void Close() = 0;

  // Frame length in bytes of a single frame image.
  virtual size_t FrameLength() = 0;
};

// Writes raw I420 frames in sequence.
class YuvFrameWriterImpl : public FrameWriter {
 public:
  // Creates a file handler. The input file is assumed to exist and be readable
  // and the output file must be writable.
  // Parameters:
  //   output_filename         The file to write. Will be overwritten if already
  //                           existing.
  //   width, height           Size of each frame to read.
  YuvFrameWriterImpl(std::string output_filename, int width, int height);
  ~YuvFrameWriterImpl() override;
  bool Init() override;
  bool WriteFrame(uint8_t* frame_buffer) override;
  void Close() override;
  size_t FrameLength() override;

 protected:
  const std::string output_filename_;
  size_t frame_length_in_bytes_;
  const int width_;
  const int height_;
  FILE* output_file_;
};

// Writes raw I420 frames in sequence, but with Y4M file and frame headers for
// more convenient playback in external media players.
class Y4mFrameWriterImpl : public YuvFrameWriterImpl {
 public:
  Y4mFrameWriterImpl(std::string output_filename,
                     int width,
                     int height,
                     int frame_rate);
  ~Y4mFrameWriterImpl() override;
  bool Init() override;
  bool WriteFrame(uint8_t* frame_buffer) override;

 private:
  const int frame_rate_;
};

// LibJpeg is not available on iOS
#if !defined(is_ios)
class JpegFrameWriter {
 public:
  JpegFrameWriter(const std::string &output_filename);
  bool WriteFrame(const VideoFrame& input_frame, int quality);

 private:
  bool frame_written_;
  const std::string output_filename_;
  FILE* output_file_;
};
#endif

}  // namespace test
}  // namespace webrtc

#endif  // WEBRTC_TEST_TESTSUPPORT_FRAME_WRITER_H_
