Home | History | Annotate | Download | only in common_video
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/common_video/plane.h"
     12 
     13 #include <string.h>  // memcpy
     14 
     15 #include <algorithm>  // swap
     16 
     17 namespace webrtc {
     18 
     19 // Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
     20 static const int kBufferAlignment =  64;
     21 
     22 Plane::Plane()
     23     : allocated_size_(0),
     24       plane_size_(0),
     25       stride_(0) {}
     26 
     27 Plane::~Plane() {}
     28 
     29 int Plane::CreateEmptyPlane(int allocated_size, int stride, int plane_size) {
     30   if (allocated_size < 1 || stride < 1 || plane_size < 1)
     31     return -1;
     32   stride_ = stride;
     33   if (MaybeResize(allocated_size) < 0)
     34     return -1;
     35   plane_size_ = plane_size;
     36   return 0;
     37 }
     38 
     39 int Plane::MaybeResize(int new_size) {
     40   if (new_size <= 0)
     41     return -1;
     42   if (new_size <= allocated_size_)
     43     return 0;
     44   scoped_ptr<uint8_t, AlignedFreeDeleter> new_buffer(static_cast<uint8_t*>(
     45       AlignedMalloc(new_size, kBufferAlignment)));
     46   if (buffer_.get()) {
     47     memcpy(new_buffer.get(), buffer_.get(), plane_size_);
     48   }
     49   buffer_.reset(new_buffer.release());
     50   allocated_size_ = new_size;
     51   return 0;
     52 }
     53 
     54 int Plane::Copy(const Plane& plane) {
     55   if (MaybeResize(plane.allocated_size_) < 0)
     56     return -1;
     57   if (plane.buffer_.get())
     58     memcpy(buffer_.get(), plane.buffer_.get(), plane.plane_size_);
     59   stride_ = plane.stride_;
     60   plane_size_ = plane.plane_size_;
     61   return 0;
     62 }
     63 
     64 int Plane::Copy(int size, int stride, const uint8_t* buffer) {
     65   if (MaybeResize(size) < 0)
     66     return -1;
     67   memcpy(buffer_.get(), buffer, size);
     68   plane_size_ = size;
     69   stride_ = stride;
     70   return 0;
     71 }
     72 
     73 void Plane::Swap(Plane& plane) {
     74   std::swap(stride_, plane.stride_);
     75   std::swap(allocated_size_, plane.allocated_size_);
     76   std::swap(plane_size_, plane.plane_size_);
     77   buffer_.swap(plane.buffer_);
     78 }
     79 
     80 }  // namespace webrtc
     81