blob: 3776de1323e3d2ebd1c27dfbce68269a11b80336 [file] [log] [blame]
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +00001/*
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
pbos@webrtc.orgc69ae692013-06-04 09:02:37 +000011#include "webrtc/common_video/plane.h"
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000012
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000013#include <string.h> // memcpy
14
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000015#include <algorithm> // swap
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000016
17namespace webrtc {
18
mikhal@webrtc.orge4c920f2012-10-09 16:04:48 +000019// Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000020static const int kBufferAlignment = 64;
mikhal@webrtc.orge4c920f2012-10-09 16:04:48 +000021
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000022Plane::Plane()
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000023 : allocated_size_(0),
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000024 plane_size_(0),
25 stride_(0) {}
26
27Plane::~Plane() {}
28
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000029int Plane::CreateEmptyPlane(int allocated_size, int stride, int plane_size) {
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000030 if (allocated_size < 1 || stride < 1 || plane_size < 1)
31 return -1;
32 stride_ = stride;
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000033 if (MaybeResize(allocated_size) < 0)
mikhal@webrtc.org9fedff72012-10-24 18:33:04 +000034 return -1;
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000035 plane_size_ = plane_size;
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000036 return 0;
37}
38
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000039int Plane::MaybeResize(int new_size) {
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000040 if (new_size <= 0)
41 return -1;
42 if (new_size <= allocated_size_)
43 return 0;
andrew@webrtc.orgd617a442014-02-20 21:08:36 +000044 scoped_ptr<uint8_t, AlignedFreeDeleter> new_buffer(static_cast<uint8_t*>(
45 AlignedMalloc(new_size, kBufferAlignment)));
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000046 if (buffer_.get()) {
47 memcpy(new_buffer.get(), buffer_.get(), plane_size_);
48 }
49 buffer_.reset(new_buffer.release());
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000050 allocated_size_ = new_size;
51 return 0;
52}
53
54int Plane::Copy(const Plane& plane) {
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000055 if (MaybeResize(plane.allocated_size_) < 0)
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000056 return -1;
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000057 if (plane.buffer_.get())
58 memcpy(buffer_.get(), plane.buffer_.get(), plane.plane_size_);
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000059 stride_ = plane.stride_;
60 plane_size_ = plane.plane_size_;
61 return 0;
62}
63
sheu@chromium.orgd7056492013-10-31 21:20:15 +000064int Plane::Copy(int size, int stride, const uint8_t* buffer) {
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000065 if (MaybeResize(size) < 0)
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000066 return -1;
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000067 memcpy(buffer_.get(), buffer, size);
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000068 plane_size_ = size;
69 stride_ = stride;
70 return 0;
71}
72
73void Plane::Swap(Plane& plane) {
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000074 std::swap(stride_, plane.stride_);
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000075 std::swap(allocated_size_, plane.allocated_size_);
76 std::swap(plane_size_, plane.plane_size_);
sheu@chromium.org5dd2ecb2013-10-31 23:41:04 +000077 buffer_.swap(plane.buffer_);
mikhal@webrtc.org043ed9e2012-09-18 16:14:26 +000078}
79
80} // namespace webrtc