Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5940)

Unified Diff: chromecast/media/cma/ipc/media_message_fifo.h

Issue 2300993003: CmaRenderer is dead. Long live MojoRenderer. (Closed)
Patch Set: update OWNERS file Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromecast/media/cma/ipc/media_message.cc ('k') | chromecast/media/cma/ipc/media_message_fifo.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « chromecast/media/cma/ipc/media_message.cc ('k') | chromecast/media/cma/ipc/media_message_fifo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698