/*
 *  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 COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H
#define COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H

// I420VideoFrame class
//
// Storing and handling of YUV (I420) video frames.

#include "common_video/plane.h"
#include "typedefs.h"  //NOLINT

namespace webrtc {

enum PlaneType {
  kYPlane = 0,
  kUPlane = 1,
  kVPlane = 2,
  KNumOfPlanes = 3
};

class I420VideoFrame {
 public:
  I420VideoFrame();
  ~I420VideoFrame();

  // CreateEmptyFrame: Sets frame dimensions and allocates buffers based
  // on set dimensions - height and plane stride.
  // If required size is bigger than the allocated one, new buffers of adequate
  // size will be allocated.
  // Return value: 0 on success ,-1 on error.
  int CreateEmptyFrame(int width, int height,
                       int stride_y, int stride_u, int stride_v);

  // CreateFrame: Sets the frame's members and buffers. If required size is
  // bigger than allocated one, new buffers of adequate size will be allocated.
  // Return value: 0 on success ,-1 on error.
  int CreateFrame(int size_y, const uint8_t* buffer_y,
                  int size_u, const uint8_t* buffer_u,
                  int size_v, const uint8_t* buffer_v,
                  int width, int height,
                  int stride_y, int stride_u, int stride_v);

  // Copy frame: If required size is bigger than allocated one, new buffers of
  // adequate size will be allocated.
  // Return value: 0 on success ,-1 on error.
  int CopyFrame(const I420VideoFrame& videoFrame);

  // Swap Frame.
  void SwapFrame(I420VideoFrame* videoFrame);

  // Get pointer to buffer per plane.
  uint8_t* buffer(PlaneType type);
  // Overloading with const.
  const uint8_t* buffer(PlaneType type) const;

  // Get allocated size per plane.
  int allocated_size(PlaneType type) const;

  // Get allocated stride per plane.
  int stride(PlaneType type) const;

  // Set frame width.
  int set_width(int width);

  // Set frame height.
  int set_height(int height);

  // Get frame width.
  int width() const {return width_;}

  // Get frame height.
  int height() const {return height_;}

  // Set frame timestamp (90kHz).
  void set_timestamp(const uint32_t timestamp) {timestamp_ = timestamp;}

  // Get frame timestamp (90kHz).
  uint32_t timestamp() const {return timestamp_;}

  // Set render time in miliseconds.
  void set_render_time_ms(int64_t render_time_ms) {render_time_ms_ =
                                                   render_time_ms;}

  // Get render time in miliseconds.
  int64_t render_time_ms() const {return render_time_ms_;}

  // Return true if underlying plane buffers are of zero size, false if not.
  bool IsZeroSize();

  // Reset underlying plane buffers sizes to 0. This function doesn't
  // clear memory.
  void ResetSize();

 private:
  // Verifies legality of parameters.
  // Return value: 0 on success ,-1 on error.
  int CheckDimensions(int width, int height,
                      int stride_y, int stride_u, int stride_v);
  // Get the pointer to a specific plane.
  const Plane* GetPlane(PlaneType type) const;
  // Overloading with non-const.
  Plane* GetPlane(PlaneType type);

  Plane y_plane_;
  Plane u_plane_;
  Plane v_plane_;
  int width_;
  int height_;
  uint32_t timestamp_;
  int64_t render_time_ms_;
};  // I420VideoFrame

}  // namespace webrtc

#endif  // COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H

