Add an AlignedFreeDeleter and remove scoped_ptr_malloc.
- Transition scoped_ptr_mallocs to scoped_ptr. - AlignedFreeDeleter matches Chromium's version. TESTED=try bots R=turaj@webrtc.org Review URL: https://webrtc-codereview.appspot.com/8969005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5587 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@ -146,12 +146,12 @@ class SincResampler {
|
|||||||
// Contains kKernelOffsetCount kernels back-to-back, each of size kKernelSize.
|
// Contains kKernelOffsetCount kernels back-to-back, each of size kKernelSize.
|
||||||
// The kernel offsets are sub-sample shifts of a windowed sinc shifted from
|
// The kernel offsets are sub-sample shifts of a windowed sinc shifted from
|
||||||
// 0.0 to 1.0 sample.
|
// 0.0 to 1.0 sample.
|
||||||
scoped_ptr_malloc<float, AlignedFree> kernel_storage_;
|
scoped_ptr<float, AlignedFreeDeleter> kernel_storage_;
|
||||||
scoped_ptr_malloc<float, AlignedFree> kernel_pre_sinc_storage_;
|
scoped_ptr<float, AlignedFreeDeleter> kernel_pre_sinc_storage_;
|
||||||
scoped_ptr_malloc<float, AlignedFree> kernel_window_storage_;
|
scoped_ptr<float, AlignedFreeDeleter> kernel_window_storage_;
|
||||||
|
|
||||||
// Data from the source is copied into this buffer for each processing pass.
|
// Data from the source is copied into this buffer for each processing pass.
|
||||||
scoped_ptr_malloc<float, AlignedFree> input_buffer_;
|
scoped_ptr<float, AlignedFreeDeleter> input_buffer_;
|
||||||
|
|
||||||
// Stores the runtime selection of which Convolve function to use.
|
// Stores the runtime selection of which Convolve function to use.
|
||||||
// TODO(ajm): Move to using a global static which must only be initialized
|
// TODO(ajm): Move to using a global static which must only be initialized
|
||||||
|
@ -20,8 +20,7 @@ namespace webrtc {
|
|||||||
static const int kBufferAlignment = 64;
|
static const int kBufferAlignment = 64;
|
||||||
|
|
||||||
Plane::Plane()
|
Plane::Plane()
|
||||||
: buffer_(NULL),
|
: allocated_size_(0),
|
||||||
allocated_size_(0),
|
|
||||||
plane_size_(0),
|
plane_size_(0),
|
||||||
stride_(0) {}
|
stride_(0) {}
|
||||||
|
|
||||||
@ -42,8 +41,8 @@ int Plane::MaybeResize(int new_size) {
|
|||||||
return -1;
|
return -1;
|
||||||
if (new_size <= allocated_size_)
|
if (new_size <= allocated_size_)
|
||||||
return 0;
|
return 0;
|
||||||
Allocator<uint8_t>::scoped_ptr_aligned new_buffer(
|
scoped_ptr<uint8_t, AlignedFreeDeleter> new_buffer(static_cast<uint8_t*>(
|
||||||
AlignedMalloc<uint8_t>(new_size, kBufferAlignment));
|
AlignedMalloc(new_size, kBufferAlignment)));
|
||||||
if (buffer_.get()) {
|
if (buffer_.get()) {
|
||||||
memcpy(new_buffer.get(), buffer_.get(), plane_size_);
|
memcpy(new_buffer.get(), buffer_.get(), plane_size_);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#define COMMON_VIDEO_PLANE_H
|
#define COMMON_VIDEO_PLANE_H
|
||||||
|
|
||||||
#include "webrtc/system_wrappers/interface/aligned_malloc.h"
|
#include "webrtc/system_wrappers/interface/aligned_malloc.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
|
||||||
#include "webrtc/typedefs.h"
|
#include "webrtc/typedefs.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@ -63,7 +64,7 @@ class Plane {
|
|||||||
// Return value: 0 on success ,-1 on error.
|
// Return value: 0 on success ,-1 on error.
|
||||||
int MaybeResize(int new_size);
|
int MaybeResize(int new_size);
|
||||||
|
|
||||||
Allocator<uint8_t>::scoped_ptr_aligned buffer_;
|
scoped_ptr<uint8_t, AlignedFreeDeleter> buffer_;
|
||||||
int allocated_size_;
|
int allocated_size_;
|
||||||
int plane_size_;
|
int plane_size_;
|
||||||
int stride_;
|
int stride_;
|
||||||
|
@ -22,7 +22,12 @@ extern "C" {
|
|||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
typedef scoped_ptr_malloc<RingBuffer, WebRtc_FreeBuffer> scoped_ring_buffer;
|
struct FreeBufferDeleter {
|
||||||
|
inline void operator()(void* ptr) const {
|
||||||
|
WebRtc_FreeBuffer(ptr);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef scoped_ptr<RingBuffer, FreeBufferDeleter> scoped_ring_buffer;
|
||||||
|
|
||||||
static void AssertElementEq(int expected, int actual) {
|
static void AssertElementEq(int expected, int actual) {
|
||||||
ASSERT_EQ(expected, actual);
|
ASSERT_EQ(expected, actual);
|
||||||
|
@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
|
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
// Returns a pointer to the first boundry of |alignment| bytes following the
|
// Returns a pointer to the first boundry of |alignment| bytes following the
|
||||||
@ -48,10 +46,12 @@ T* AlignedMalloc(size_t size, size_t alignment) {
|
|||||||
return reinterpret_cast<T*>(AlignedMalloc(size, alignment));
|
return reinterpret_cast<T*>(AlignedMalloc(size, alignment));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scoped pointer to AlignedMalloc-memory.
|
// Deleter for use with scoped_ptr. E.g., use as
|
||||||
template<typename T>
|
// scoped_ptr<Foo, AlignedFreeDeleter> foo;
|
||||||
struct Allocator {
|
struct AlignedFreeDeleter {
|
||||||
typedef scoped_ptr_malloc<T, AlignedFree> scoped_ptr_aligned;
|
inline void operator()(void* ptr) const {
|
||||||
|
AlignedFree(ptr);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
@ -96,7 +96,7 @@
|
|||||||
#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SCOPED_PTR_H_
|
#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SCOPED_PTR_H_
|
||||||
|
|
||||||
// This is an implementation designed to match the anticipated future TR2
|
// This is an implementation designed to match the anticipated future TR2
|
||||||
// implementation of the scoped_ptr class and scoped_ptr_malloc (deprecated).
|
// implementation of the scoped_ptr class.
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@ -639,77 +639,6 @@ void swap(scoped_array<T>& a, scoped_array<T>& b) {
|
|||||||
a.swap(b);
|
a.swap(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED: Use scoped_ptr<C, webrtc::FreeDeleter> instead.
|
|
||||||
// TODO(ajm): Remove scoped_ptr_malloc.
|
|
||||||
//
|
|
||||||
// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
|
|
||||||
// second template argument, the function used to free the object.
|
|
||||||
|
|
||||||
template<typename T, void (*FF)(void*) = free> class scoped_ptr_malloc {
|
|
||||||
private:
|
|
||||||
|
|
||||||
T* ptr;
|
|
||||||
|
|
||||||
scoped_ptr_malloc(scoped_ptr_malloc const &);
|
|
||||||
scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
typedef T element_type;
|
|
||||||
|
|
||||||
explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
|
|
||||||
|
|
||||||
~scoped_ptr_malloc() {
|
|
||||||
FF(static_cast<void*>(ptr));
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset(T* p = 0) {
|
|
||||||
if (ptr != p) {
|
|
||||||
FF(static_cast<void*>(ptr));
|
|
||||||
ptr = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
T& operator*() const {
|
|
||||||
assert(ptr != 0);
|
|
||||||
return *ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* operator->() const {
|
|
||||||
assert(ptr != 0);
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* get() const {
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void swap(scoped_ptr_malloc & b) {
|
|
||||||
T* tmp = b.ptr;
|
|
||||||
b.ptr = ptr;
|
|
||||||
ptr = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* release() {
|
|
||||||
T* tmp = ptr;
|
|
||||||
ptr = 0;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
T** accept() {
|
|
||||||
if (ptr) {
|
|
||||||
FF(static_cast<void*>(ptr));
|
|
||||||
ptr = 0;
|
|
||||||
}
|
|
||||||
return &ptr;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T, void (*FF)(void*)> inline
|
|
||||||
void swap(scoped_ptr_malloc<T,FF>& a, scoped_ptr_malloc<T,FF>& b) {
|
|
||||||
a.swap(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
||||||
#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SCOPED_PTR_H_
|
#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_SCOPED_PTR_H_
|
||||||
|
@ -16,14 +16,16 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
|
||||||
#include "webrtc/typedefs.h"
|
#include "webrtc/typedefs.h"
|
||||||
|
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
namespace webrtc {
|
||||||
|
|
||||||
// Returns true if |size| and |alignment| are valid combinations.
|
// Returns true if |size| and |alignment| are valid combinations.
|
||||||
bool CorrectUsage(size_t size, size_t alignment) {
|
bool CorrectUsage(size_t size, size_t alignment) {
|
||||||
webrtc::Allocator<char>::scoped_ptr_aligned scoped(
|
scoped_ptr<char, AlignedFreeDeleter> scoped(
|
||||||
webrtc::AlignedMalloc<char>(size, alignment));
|
static_cast<char*>(AlignedMalloc(size, alignment)));
|
||||||
if (scoped.get() == NULL) {
|
if (scoped.get() == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -34,16 +36,15 @@ bool CorrectUsage(size_t size, size_t alignment) {
|
|||||||
TEST(AlignedMalloc, GetRightAlign) {
|
TEST(AlignedMalloc, GetRightAlign) {
|
||||||
const size_t size = 100;
|
const size_t size = 100;
|
||||||
const size_t alignment = 32;
|
const size_t alignment = 32;
|
||||||
const size_t left_missalignment = 8;
|
const size_t left_misalignment = 1;
|
||||||
webrtc::Allocator<char>::scoped_ptr_aligned scoped(
|
scoped_ptr<char, AlignedFreeDeleter> scoped(
|
||||||
webrtc::AlignedMalloc<char>(size, alignment));
|
static_cast<char*>(AlignedMalloc(size, alignment)));
|
||||||
EXPECT_TRUE(scoped.get() != NULL);
|
EXPECT_TRUE(scoped.get() != NULL);
|
||||||
const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
|
const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
|
||||||
const uintptr_t missaligned_address = aligned_address - left_missalignment;
|
const uintptr_t misaligned_address = aligned_address - left_misalignment;
|
||||||
const char* missaligned_ptr = reinterpret_cast<const char*>(
|
const char* misaligned_ptr = reinterpret_cast<const char*>(
|
||||||
missaligned_address);
|
misaligned_address);
|
||||||
const char* realigned_ptr = webrtc::GetRightAlign(
|
const char* realigned_ptr = GetRightAlign(misaligned_ptr, alignment);
|
||||||
missaligned_ptr, alignment);
|
|
||||||
EXPECT_EQ(scoped.get(), realigned_ptr);
|
EXPECT_EQ(scoped.get(), realigned_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,3 +77,6 @@ TEST(AlignedMalloc, AlignTo128Bytes) {
|
|||||||
size_t alignment = 128;
|
size_t alignment = 128;
|
||||||
EXPECT_TRUE(CorrectUsage(size, alignment));
|
EXPECT_TRUE(CorrectUsage(size, alignment));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user