| Index: mojo/services/media/common/cpp/mapped_shared_buffer.cc
|
| diff --git a/mojo/services/media/common/cpp/mapped_shared_buffer.cc b/mojo/services/media/common/cpp/mapped_shared_buffer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5d0cb4b6f4ea1dac946a7f74c477c58b522f902c
|
| --- /dev/null
|
| +++ b/mojo/services/media/common/cpp/mapped_shared_buffer.cc
|
| @@ -0,0 +1,104 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "mojo/public/cpp/environment/logging.h"
|
| +#include "mojo/services/media/common/cpp/mapped_shared_buffer.h"
|
| +
|
| +namespace mojo {
|
| +namespace media {
|
| +
|
| +MappedSharedBuffer::MappedSharedBuffer() {}
|
| +
|
| +MappedSharedBuffer::~MappedSharedBuffer() {}
|
| +
|
| +void MappedSharedBuffer::InitNew(uint64_t size) {
|
| + MOJO_DCHECK(size > 0);
|
| +
|
| + buffer_.reset(new SharedBuffer(size));
|
| + handle_.reset();
|
| +
|
| + InitInternal(buffer_->handle, size);
|
| +}
|
| +
|
| +void MappedSharedBuffer::InitFromHandle(
|
| + ScopedSharedBufferHandle handle,
|
| + uint64_t size) {
|
| + MOJO_DCHECK(handle.is_valid());
|
| + MOJO_DCHECK(size > 0);
|
| +
|
| + buffer_.reset();
|
| + handle_ = handle.Pass();
|
| +
|
| + InitInternal(handle_, size);
|
| +}
|
| +
|
| +void MappedSharedBuffer::InitInternal(
|
| + ScopedSharedBufferHandle& handle,
|
| + uint64_t size) {
|
| + MOJO_DCHECK(handle.is_valid());
|
| + MOJO_DCHECK(size > 0);
|
| +
|
| + size_ = size;
|
| + buffer_ptr_.reset();
|
| +
|
| + void* ptr;
|
| + auto result = MapBuffer(
|
| + handle.get(),
|
| + 0, // offset
|
| + size,
|
| + &ptr,
|
| + MOJO_MAP_BUFFER_FLAG_NONE);
|
| + MOJO_DCHECK(result == MOJO_RESULT_OK);
|
| + MOJO_DCHECK(ptr);
|
| +
|
| + buffer_ptr_.reset(reinterpret_cast<uint8_t*>(ptr));
|
| +
|
| + OnInit();
|
| +}
|
| +
|
| +bool MappedSharedBuffer::initialized() const {
|
| + return buffer_ptr_ != nullptr;
|
| +}
|
| +
|
| +uint64_t MappedSharedBuffer::size() const {
|
| + return size_;
|
| +}
|
| +
|
| +ScopedSharedBufferHandle MappedSharedBuffer::GetDuplicateHandle() const {
|
| + MOJO_DCHECK(initialized());
|
| + ScopedSharedBufferHandle handle;
|
| + if (buffer_) {
|
| + DuplicateBuffer(buffer_->handle.get(), nullptr, &handle);
|
| + } else {
|
| + MOJO_DCHECK(handle_.is_valid());
|
| + DuplicateBuffer(handle_.get(), nullptr, &handle);
|
| + }
|
| + return handle.Pass();
|
| +}
|
| +
|
| +void* MappedSharedBuffer::PtrFromOffset(uint64_t offset) const {
|
| + MOJO_DCHECK(buffer_ptr_);
|
| +
|
| + if (offset == FifoAllocator::kNullOffset) {
|
| + return nullptr;
|
| + }
|
| +
|
| + MOJO_DCHECK(offset < size_);
|
| + return buffer_ptr_.get() + offset;
|
| +}
|
| +
|
| +uint64_t MappedSharedBuffer::OffsetFromPtr(void *ptr) const {
|
| + MOJO_DCHECK(buffer_ptr_);
|
| + if (ptr == nullptr) {
|
| + return FifoAllocator::kNullOffset;
|
| + }
|
| + uint64_t offset = reinterpret_cast<uint8_t*>(ptr) - buffer_ptr_.get();
|
| + MOJO_DCHECK(offset < size_);
|
| + return offset;
|
| +}
|
| +
|
| +void MappedSharedBuffer::OnInit() {}
|
| +
|
| +} // namespace media
|
| +} // namespace mojo
|
|
|