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 |