aboutsummaryrefslogtreecommitdiff
path: root/webrtc/common_video/plane.cc
blob: e0bbba10bac1b7b5625b92b3cfe2affb4caf0904 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
 *  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