Index: chromecast/media/cma/ipc/media_message_fifo.h |
diff --git a/chromecast/media/cma/ipc/media_message_fifo.h b/chromecast/media/cma/ipc/media_message_fifo.h |
deleted file mode 100644 |
index 127ae04417cdd41995e99ed981304bdcbc83408d..0000000000000000000000000000000000000000 |
--- a/chromecast/media/cma/ipc/media_message_fifo.h |
+++ /dev/null |
@@ -1,213 +0,0 @@ |
-// Copyright 2014 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 CHROMECAST_MEDIA_CMA_IPC_MEDIA_MESSAGE_FIFO_H_ |
-#define CHROMECAST_MEDIA_CMA_IPC_MEDIA_MESSAGE_FIFO_H_ |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <list> |
-#include <memory> |
- |
-#include "base/atomicops.h" |
-#include "base/callback.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/threading/thread_checker.h" |
- |
-namespace chromecast { |
-namespace media { |
-class MediaMemoryChunk; |
-class MediaMessage; |
-class MediaMessageFlag; |
- |
-// MediaMessageFifo is a lock free fifo implementation |
-// to pass audio/video data from one thread to another or from one process |
-// to another one (in that case using shared memory). |
-// |
-// Assuming the feeder and the consumer have a common block of shared memory |
-// (representing the serialized structure of the fifo), |
-// the feeder (which must be running on a single thread) instantiates its own |
-// instance of MediaMessageFifo, same applies to the consumer. |
-// |
-// Example: assuming the block of shared memory is given by |mem|, a typical |
-// feeder (using MediaMessageFifo instance fifo_feeder) will push messages |
-// in the following way: |
-// // Create a dummy message to calculate the size of the serialized message. |
-// std::unique_ptr<MediaMessage> dummy_msg( |
-// MediaMessage::CreateDummyMessage(msg_type)); |
-// // ... |
-// // Write all the fields to the dummy message. |
-// // ... |
-// |
-// // Create the real message, once the size of the serialized message |
-// // is known. |
-// std::unique_ptr<MediaMessage> msg( |
-// MediaMessage::CreateMessage( |
-// msg_type, |
-// base::Bind(&MediaMessageFifo::ReserveMemory, |
-// base::Unretained(fifo_feeder.get())), |
-// dummy_msg->content_size())); |
-// if (!msg) { |
-// // Not enough space for the message: |
-// // retry later (e.g. when receiving a read activity event, meaning |
-// // some enough space might have been release). |
-// return; |
-// } |
-// // ... |
-// // Write all the fields to the real message |
-// // in exactly the same way it was done for the dummy message. |
-// // ... |
-// // Once message |msg| is going out of scope, then MediaMessageFifo |
-// // fifo_feeder is informed that the message is not needed anymore |
-// // (i.e. it was fully written), and fifo_feeder can then update |
-// // the external write pointer of the fifo so that the consumer |
-// // can start consuming this message. |
-// |
-// A typical consumer (using MediaMessageFifo instance fifo_consumer) |
-// will retrive messages in the following way: |
-// std::unique_ptr<MediaMessage> msg(fifo_consumer->Pop()); |
-// if (!msg) { |
-// // The fifo is empty, i.e. no message left. |
-// // Try reading again later (e.g. after receiving a write activity event. |
-// return; |
-// } |
-// // Parse the message using Read functions of MediaMessage: |
-// // ... |
-// // Once the message is going out of scope, MediaMessageFifo will receive |
-// // a notification that the underlying memory can be released |
-// // (i.e. the external read pointer can be updated). |
-// |
-// |
-class MediaMessageFifo { |
- private: |
- struct Descriptor { |
- size_t size; |
- size_t rd_offset; |
- size_t wr_offset; |
- |
- // Ensure the first item has the same alignment as an int64_t. |
- int64_t first_item; |
- }; |
- |
- public: |
- static const int kDescriptorSize = sizeof(Descriptor); |
- |
- // Creates a media message fifo using |mem| as the underlying serialized |
- // structure. |
- // If |init| is true, the underlying fifo structure is initialized. |
- MediaMessageFifo(std::unique_ptr<MediaMemoryChunk> mem, bool init); |
- ~MediaMessageFifo(); |
- |
- // When the consumer and the feeder are living in two different processes, |
- // we might want to convey some messages between these two processes to notify |
- // about some fifo activity. |
- void ObserveReadActivity(const base::Closure& read_event_cb); |
- void ObserveWriteActivity(const base::Closure& write_event_cb); |
- |
- // Reserves a writeable block of memory at the back of the fifo, |
- // corresponding to the serialized structure of the message. |
- // Returns NULL if the required size cannot be allocated. |
- std::unique_ptr<MediaMemoryChunk> ReserveMemory(size_t size); |
- |
- // Pop a message from the queue. |
- // Returns a null pointer if there is no message left. |
- std::unique_ptr<MediaMessage> Pop(); |
- |
- // Flush the fifo. |
- void Flush(); |
- |
- private: |
- // Add some accessors to ensure security on the browser process side. |
- size_t current_rd_offset() const; |
- size_t current_wr_offset() const; |
- size_t internal_rd_offset() const { |
- DCHECK_LT(internal_rd_offset_, size_); |
- return internal_rd_offset_; |
- } |
- size_t internal_wr_offset() const { |
- DCHECK_LT(internal_wr_offset_, size_); |
- return internal_wr_offset_; |
- } |
- |
- // Reserve a block of free memory without doing any check on the available |
- // space. Invoke this function only when all the checks have been done. |
- std::unique_ptr<MediaMemoryChunk> ReserveMemoryNoCheck(size_t size); |
- |
- // Invoked each time there is a memory region in the free space of the fifo |
- // that has possibly been written. |
- void OnWrMemoryReleased(); |
- |
- // Invoked each time there is a memory region in the allocated space |
- // of the fifo that has possibly been released. |
- void OnRdMemoryReleased(); |
- |
- // Functions to modify the internal/external read/write pointers. |
- void CommitRead(size_t new_rd_offset); |
- void CommitWrite(size_t new_wr_offset); |
- void CommitInternalRead(size_t new_rd_offset); |
- void CommitInternalWrite(size_t new_wr_offset); |
- |
- // An instance of MediaMessageFifo must be running on a single thread. |
- // If the fifo feeder and consumer are living on 2 different threads |
- // or 2 different processes, they must create their own instance |
- // of MediaMessageFifo using the same underlying block of (shared) memory |
- // in the constructor. |
- base::ThreadChecker thread_checker_; |
- |
- // Callbacks invoked to notify either of some read or write activity on the |
- // fifo. This is especially useful when the feeder and consumer are living in |
- // two different processes. |
- base::Closure read_event_cb_; |
- base::Closure write_event_cb_; |
- |
- // The serialized structure of the fifo. |
- std::unique_ptr<MediaMemoryChunk> mem_; |
- |
- // The size in bytes of the fifo is cached locally for security purpose. |
- // (the renderer process cannot modify the size and make the browser process |
- // access out of range addresses). |
- size_t size_; |
- |
- // TODO(damienv): This is a work-around since atomicops.h does not define |
- // an atomic size_t type. |
-#if SIZE_MAX == UINT32_MAX |
- typedef base::subtle::Atomic32 AtomicSize; |
-#elif SIZE_MAX == UINT64_MAX |
- typedef base::subtle::Atomic64 AtomicSize; |
-#else |
-#error "Unsupported size_t" |
-#endif |
- AtomicSize* rd_offset_; |
- AtomicSize* wr_offset_; |
- |
- // Internal read offset: this is where data is actually read from. |
- // The external offset |rd_offset_| is only used to protect data from being |
- // overwritten by the feeder. |
- // At any time, the internal read pointer must be between the external read |
- // offset and the write offset (circular fifo definition of "between"). |
- size_t internal_rd_offset_; |
- size_t internal_wr_offset_; |
- |
- // Note: all the memory read/write are followed by a memory fence before |
- // updating the rd/wr pointer. |
- void* base_; |
- |
- // Protects the messages that are either being read or written. |
- std::list<scoped_refptr<MediaMessageFlag> > rd_flags_; |
- std::list<scoped_refptr<MediaMessageFlag> > wr_flags_; |
- |
- base::WeakPtr<MediaMessageFifo> weak_this_; |
- base::WeakPtrFactory<MediaMessageFifo> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MediaMessageFifo); |
-}; |
- |
-} // namespace media |
-} // namespace chromecast |
- |
-#endif // CHROMECAST_MEDIA_CMA_IPC_MEDIA_MESSAGE_FIFO_H_ |