| Index: mojo/services/media/common/cpp/shared_media_buffer_allocator.h
|
| diff --git a/mojo/services/media/common/cpp/shared_media_buffer_allocator.h b/mojo/services/media/common/cpp/shared_media_buffer_allocator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d7b701194f4d97e0802099ab261a56b4ad3cb17d
|
| --- /dev/null
|
| +++ b/mojo/services/media/common/cpp/shared_media_buffer_allocator.h
|
| @@ -0,0 +1,67 @@
|
| +// 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.
|
| +
|
| +#ifndef MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_MEDIA_BUFFER_ALLOCATOR_H_
|
| +#define MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_MEDIA_BUFFER_ALLOCATOR_H_
|
| +
|
| +#include <memory>
|
| +#include <mutex> // NOLINT(build/c++11)
|
| +
|
| +#include "mojo/services/media/common/cpp/fifo_allocator.h"
|
| +#include "mojo/services/media/common/cpp/mapped_shared_buffer.h"
|
| +
|
| +namespace mojo {
|
| +namespace media {
|
| +
|
| +// SharedMediaBufferAllocator enhances MappedSharedBuffer by adding allocation
|
| +// semantics (allocate and release) using FifoAllocator. This is useful in media
|
| +// applications in which media buffers are typically allocated and released in
|
| +// a first-allocated, first-released manner. SharedMediaBufferAllocator is
|
| +// thread-safe.
|
| +class SharedMediaBufferAllocator : public MappedSharedBuffer {
|
| + public:
|
| + static const uint64_t kNullOffset = FifoAllocator::kNullOffset;
|
| +
|
| + SharedMediaBufferAllocator() : fifo_allocator_(0) {}
|
| +
|
| + ~SharedMediaBufferAllocator() override;
|
| +
|
| + // Allocates a region of the buffer returning an offset. If the requested
|
| + // region could not be allocated, returns kNullOffset.
|
| + uint64_t AllocateRegionByOffset(uint64_t size) {
|
| + std::lock_guard<std::mutex> lock(lock_);
|
| + return fifo_allocator_.AllocateRegion(size);
|
| + }
|
| +
|
| + // Releases a region of the buffer previously allocated by calling
|
| + // AllocateRegionByOffset.
|
| + void ReleaseRegionByOffset(uint64_t size, uint64_t offset) {
|
| + std::lock_guard<std::mutex> lock(lock_);
|
| + fifo_allocator_.ReleaseRegion(size, offset);
|
| + }
|
| +
|
| + // Allocates a region of the buffer returning a pointer. If the requested
|
| + // region could not be allocated, returns nullptr.
|
| + void* AllocateRegion(uint64_t size) {
|
| + return PtrFromOffset(AllocateRegionByOffset(size));
|
| + }
|
| +
|
| + // Releases a region of the buffer previously allocated by calling
|
| + // AllocateRegion.
|
| + void ReleaseRegion(uint64_t size, void* ptr) {
|
| + ReleaseRegionByOffset(size, OffsetFromPtr(ptr));
|
| + }
|
| +
|
| + protected:
|
| + void OnInit() override;
|
| +
|
| + private:
|
| + mutable std::mutex lock_;
|
| + FifoAllocator fifo_allocator_;
|
| +};
|
| +
|
| +} // namespace media
|
| +} // namespace mojo
|
| +
|
| +#endif // MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_MEDIA_BUFFER_ALLOCATOR_H_
|
|
|