mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
105 lines
2.3 KiB
C++
105 lines
2.3 KiB
C++
// 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
|