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

#include "system_wrappers/interface/aligned_malloc.h"
#include "typedefs.h"  //NOLINT

namespace webrtc {

// Helper class for I420VideoFrame: Store plane data and perform basic plane
// operations.
class Plane {
 public:
  Plane();
  ~Plane();
  // CreateEmptyPlane - set allocated size, actual plane size and stride:
  // If current size is smaller than current size, then a buffer of sufficient
  // size will be allocated.
  // Return value: 0 on success ,-1 on error.
  int CreateEmptyPlane(int allocated_size, int stride, int plane_size);

  // Copy the entire plane data.
  // Return value: 0 on success ,-1 on error.
  int Copy(const Plane& plane);

  // Copy buffer: If current size is smaller
  // than current size, then a buffer of sufficient size will be allocated.
  // Return value: 0 on success ,-1 on error.
  int Copy(int size, int stride, const uint8_t* buffer);

  // Swap plane data.
  void Swap(Plane& plane);

  // Get allocated size.
  int allocated_size() const {return allocated_size_;}

  // Set actual size.
  void ResetSize() {plane_size_ = 0;};

  // Return true is plane size is zero, false if not.
  bool IsZeroSize() {return plane_size_ == 0;};

  // Get stride value.
  int stride() const {return stride_;}

  // Return data pointer.
  const uint8_t* buffer() const {return buffer_.get();}
  // Overloading with non-const.
  uint8_t* buffer() {return buffer_.get();}

 private:
  // Resize when needed: If current allocated size is less than new_size, buffer
  // will be updated. Old data will be copied to new buffer.
  // Return value: 0 on success ,-1 on error.
  int MaybeResize(int new_size);

  Allocator<uint8_t>::scoped_ptr_aligned buffer_;
  int allocated_size_;
  int plane_size_;
  int stride_;
};  // Plane

}  // namespace webrtc

#endif  // COMMON_VIDEO_PLANE_H
