// 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(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(ptr) - buffer_ptr_.get(); MOJO_DCHECK(offset < size_); return offset; } void MappedSharedBuffer::OnInit() {} } // namespace media } // namespace mojo