Index: chromecast/renderer/media/cma_message_filter_proxy.h |
diff --git a/chromecast/renderer/media/cma_message_filter_proxy.h b/chromecast/renderer/media/cma_message_filter_proxy.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0930f19938e62768fc71dcbb948d6f50d51bdfed |
--- /dev/null |
+++ b/chromecast/renderer/media/cma_message_filter_proxy.h |
@@ -0,0 +1,135 @@ |
+// 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_RENDERER_MEDIA_CMA_MESSAGE_FILTER_PROXY_H_ |
+#define CHROMECAST_RENDERER_MEDIA_CMA_MESSAGE_FILTER_PROXY_H_ |
+ |
+#include "base/id_map.h" |
+#include "base/macros.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/shared_memory.h" |
+#include "base/sync_socket.h" |
+#include "chromecast/common/media/cma_ipc_common.h" |
+#include "chromecast/media/cma/pipeline/av_pipeline_client.h" |
+#include "chromecast/media/cma/pipeline/media_pipeline_client.h" |
+#include "chromecast/media/cma/pipeline/video_pipeline_client.h" |
+#include "ipc/message_filter.h" |
+#include "media/base/buffering_state.h" |
+#include "media/base/pipeline_status.h" |
+ |
+namespace base { |
+class MessageLoopProxy; |
+} |
+ |
+namespace chromecast { |
+namespace media { |
+ |
+typedef base::Callback<void( |
+ bool, base::SharedMemoryHandle, base::FileDescriptor)> AvPipeCB; |
+ |
+class CmaMessageFilterProxy : public IPC::MessageFilter { |
+ public: |
+ struct MediaDelegate { |
+ MediaDelegate(); |
+ ~MediaDelegate(); |
+ |
+ ::media::PipelineStatusCB state_changed_cb; |
+ MediaPipelineClient client; |
+ }; |
+ |
+ struct AudioDelegate { |
+ AudioDelegate(); |
+ ~AudioDelegate(); |
+ |
+ AvPipeCB av_pipe_cb; |
+ base::Closure pipe_read_cb; |
+ ::media::PipelineStatusCB state_changed_cb; |
+ AvPipelineClient client; |
+ }; |
+ |
+ struct VideoDelegate { |
+ VideoDelegate(); |
+ ~VideoDelegate(); |
+ |
+ AvPipeCB av_pipe_cb; |
+ base::Closure pipe_read_cb; |
+ ::media::PipelineStatusCB state_changed_cb; |
+ VideoPipelineClient client; |
+ }; |
+ |
+ explicit CmaMessageFilterProxy( |
+ const scoped_refptr<base::MessageLoopProxy>& io_message_loop); |
+ |
+ // Getter for the one CmaMessageFilterHost object. |
+ static CmaMessageFilterProxy* Get(); |
+ |
+ int CreateChannel(); |
+ void DestroyChannel(int id); |
+ |
+ // For adding/removing delegates. |
+ bool SetMediaDelegate(int id, const MediaDelegate& media_delegate); |
+ bool SetAudioDelegate(int id, const AudioDelegate& audio_delegate); |
+ bool SetVideoDelegate(int id, const VideoDelegate& video_delegate); |
+ |
+ // Sends an IPC message using |channel_|. |
+ bool Send(scoped_ptr<IPC::Message> message); |
+ |
+ // IPC::ChannelProxy::MessageFilter implementation. Called on IO thread. |
+ bool OnMessageReceived(const IPC::Message& message) override; |
+ void OnFilterAdded(IPC::Sender* sender) override; |
+ void OnFilterRemoved() override; |
+ void OnChannelClosing() override; |
+ |
+ protected: |
+ ~CmaMessageFilterProxy() override; |
+ |
+ private: |
+ struct DelegateEntry { |
+ DelegateEntry(); |
+ ~DelegateEntry(); |
+ |
+ MediaDelegate media_delegate; |
+ AudioDelegate audio_delegate; |
+ VideoDelegate video_delegate; |
+ }; |
+ |
+ void OnAvPipeCreated(int id, |
+ TrackId track_id, |
+ bool status, |
+ base::SharedMemoryHandle shared_memory_handle, |
+ base::FileDescriptor socket_handle); |
+ void OnPipeRead(int id, TrackId track_id); |
+ void OnMediaStateChanged(int id, ::media::PipelineStatus status); |
+ void OnTrackStateChanged(int id, TrackId track_id, |
+ ::media::PipelineStatus status); |
+ void OnEos(int id, TrackId track_id); |
+ void OnTimeUpdate(int id, |
+ base::TimeDelta time, |
+ base::TimeDelta max_time, |
+ base::TimeTicks stc); |
+ void OnBufferingNotification(int id, ::media::BufferingState state); |
+ void OnPlaybackError(int id, TrackId track_id, |
+ ::media::PipelineStatus status); |
+ void OnStatisticsUpdated(int id, TrackId track_id, |
+ const ::media::PipelineStatistics& stats); |
+ void OnNaturalSizeChanged(int id, TrackId track_id, |
+ const gfx::Size& natural_size); |
+ |
+ // The singleton instance for this filter. |
+ static CmaMessageFilterProxy* filter_; |
+ |
+ // A map of media ids to delegates. |
+ IDMap<DelegateEntry> delegates_; |
+ |
+ IPC::Sender* sender_; |
+ |
+ scoped_refptr<base::MessageLoopProxy> const io_message_loop_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CmaMessageFilterProxy); |
+}; |
+ |
+} // namespace media |
+} // namespace chromecast |
+ |
+#endif // CHROMECAST_RENDERER_MEDIA_CMA_MESSAGE_FILTER_PROXY_H_ |