/*
 *  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.
 */

#include "webrtc/common_video/plane.h"

#include <string.h>  // memcpy

#include <algorithm>  // swap

namespace webrtc {

// Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
static const int kBufferAlignment =  64;

Plane::Plane()
    : allocated_size_(0),
      plane_size_(0),
      stride_(0) {}

Plane::~Plane() {}

int Plane::CreateEmptyPlane(int allocated_size, int stride, int plane_size) {
  if (allocated_size < 1 || stride < 1 || plane_size < 1)
    return -1;
  stride_ = stride;
  if (MaybeResize(allocated_size) < 0)
    return -1;
  plane_size_ = plane_size;
  return 0;
}

int Plane::MaybeResize(int new_size) {
  if (new_size <= 0)
    return -1;
  if (new_size <= allocated_size_)
    return 0;
  rtc::scoped_ptr<uint8_t, AlignedFreeDeleter> new_buffer(
      static_cast<uint8_t*>(AlignedMalloc(new_size, kBufferAlignment)));
  if (buffer_.get()) {
    memcpy(new_buffer.get(), buffer_.get(), plane_size_);
  }
  buffer_.reset(new_buffer.release());
  allocated_size_ = new_size;
  return 0;
}

int Plane::Copy(const Plane& plane) {
  if (MaybeResize(plane.allocated_size_) < 0)
    return -1;
  if (plane.buffer_.get())
    memcpy(buffer_.get(), plane.buffer_.get(), plane.plane_size_);
  stride_ = plane.stride_;
  plane_size_ = plane.plane_size_;
  return 0;
}

int Plane::Copy(int size, int stride, const uint8_t* buffer) {
  if (MaybeResize(size) < 0)
    return -1;
  memcpy(buffer_.get(), buffer, size);
  plane_size_ = size;
  stride_ = stride;
  return 0;
}

void Plane::Swap(Plane& plane) {
  std::swap(stride_, plane.stride_);
  std::swap(allocated_size_, plane.allocated_size_);
  std::swap(plane_size_, plane.plane_size_);
  buffer_.swap(plane.buffer_);
}

}  // namespace webrtc
