Index: mojo/services/media/common/cpp/mapped_shared_buffer.h |
diff --git a/mojo/services/media/common/cpp/mapped_shared_buffer.h b/mojo/services/media/common/cpp/mapped_shared_buffer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5fd7e8a06fb2b7edb0c2a47a29338f503d81dd4f |
--- /dev/null |
+++ b/mojo/services/media/common/cpp/mapped_shared_buffer.h |
@@ -0,0 +1,81 @@ |
+// 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_BUFFER_H_ |
+#define MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_BUFFER_H_ |
+ |
+#include <memory> |
+ |
+#include "mojo/public/cpp/system/buffer.h" |
+#include "mojo/services/media/common/cpp/fifo_allocator.h" |
+ |
+namespace mojo { |
+namespace media { |
+ |
+// MappedSharedBuffer simplifies the use of shared buffers by taking care of |
+// mapping/unmapping and by providing offset/pointer translation. It can be |
+// used when the caller wants to allocate its own buffer (InitNew) and when |
+// the caller needs to use a buffer supplied by another party (InitFromHandle). |
+// It can be used by itself when regions of the buffer are allocated by another |
+// party. If the caller needs to allocate regions, SharedMediaBufferAllocator, |
+// which is derived from MappedSharedBuffer, provides allocation semantics |
+// using FifoAllocator. |
+class MappedSharedBuffer { |
+ public: |
+ MappedSharedBuffer(); |
+ |
+ virtual ~MappedSharedBuffer(); |
+ |
+ // Initializes by creating a new shared buffer of the indicated size. |
+ void InitNew(uint64_t size); |
+ |
+ // Initializes from a handle to an existing shared buffer. |
+ void InitFromHandle(ScopedSharedBufferHandle handle, uint64_t size); |
+ |
+ // Indicates whether the buffer is initialized. |
+ bool initialized() const; |
+ |
+ // Gets the size of the buffer. |
+ uint64_t size() const; |
+ |
+ // Gets a duplicate handle for the shared buffer. |
+ ScopedSharedBufferHandle GetDuplicateHandle() const; |
+ |
+ // Translates an offset into a pointer. |
+ void* PtrFromOffset(uint64_t offset) const; |
+ |
+ // Translates a pointer into an offset. |
+ uint64_t OffsetFromPtr(void *payload_ptr) const; |
+ |
+ protected: |
+ void InitInternal(ScopedSharedBufferHandle& handle, uint64_t size); |
+ |
+ // Does nothing. Called when initialization is complete. Subclasses may |
+ // override. |
+ virtual void OnInit(); |
+ |
+ private: |
+ struct MappedBufferDeleter { |
+ inline void operator()(uint8_t* ptr) const { |
+ UnmapBuffer(ptr); |
+ } |
+ }; |
+ |
+ // Size of the shared buffer. |
+ uint64_t size_; |
+ |
+ // Shared buffer when initialized with InitNew. |
+ std::unique_ptr<SharedBuffer> buffer_; |
+ |
+ // Handle to shared buffer when initialized with InitFromHandle. |
+ ScopedSharedBufferHandle handle_; |
+ |
+ // Pointer to the mapped buffer. |
+ std::unique_ptr<uint8_t, MappedBufferDeleter> buffer_ptr_; |
+}; |
+ |
+} // namespace media |
+} // namespace mojo |
+ |
+#endif // MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_BUFFER_H_ |