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