Index: media/gpu/ipc/service/media_channel.cc |
diff --git a/media/gpu/ipc/service/media_channel.cc b/media/gpu/ipc/service/media_channel.cc |
index 0d1023180190ed3a1377e1406d32dd9c94e445e5..54a0f0f6b19c960d50e6944855c248a13c14bbd3 100644 |
--- a/media/gpu/ipc/service/media_channel.cc |
+++ b/media/gpu/ipc/service/media_channel.cc |
@@ -4,7 +4,9 @@ |
#include "media/gpu/ipc/service/media_channel.h" |
+#include "base/rand_util.h" |
#include "gpu/ipc/service/gpu_channel.h" |
+#include "ipc/message_filter.h" |
#include "media/gpu/ipc/common/media_messages.h" |
#include "media/gpu/ipc/service/gpu_video_decode_accelerator.h" |
#include "media/gpu/ipc/service/gpu_video_encode_accelerator.h" |
@@ -55,7 +57,44 @@ class MediaChannelDispatchHelper { |
DISALLOW_COPY_AND_ASSIGN(MediaChannelDispatchHelper); |
}; |
-MediaChannel::MediaChannel(gpu::GpuChannel* channel) : channel_(channel) {} |
+// Filter to respond to GetChannelToken on the IO thread. |
+class MediaChannelFilter : public IPC::MessageFilter { |
+ public: |
+ explicit MediaChannelFilter(uint64_t channel_token) |
+ : channel_token_(channel_token) {} |
+ |
+ void OnFilterAdded(IPC::Sender* sender) override { sender_ = sender; } |
+ bool Send(IPC::Message* msg) { return sender_->Send(msg); } |
+ |
+ bool OnMessageReceived(const IPC::Message& msg) override { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(MediaChannelFilter, msg) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetChannelToken, |
+ OnGetChannelToken) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+ } |
+ |
+ void OnGetChannelToken(IPC::Message* reply_message) { |
+ GpuCommandBufferMsg_GetChannelToken::WriteReplyParams(reply_message, |
+ channel_token_); |
+ Send(reply_message); |
+ } |
+ |
+ private: |
+ ~MediaChannelFilter() override {} |
+ |
+ IPC::Sender* sender_; |
+ uint64_t channel_token_; |
+}; |
+ |
+MediaChannel::MediaChannel(gpu::GpuChannel* channel) : channel_(channel) { |
+ uint64_t channel_token; |
+ base::RandBytes(&channel_token, sizeof(channel_token)); |
+ channel_filter_ = new MediaChannelFilter(channel_token); |
+ channel_->AddFilter(channel_filter_.get()); |
+} |
MediaChannel::~MediaChannel() {} |