1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/renderer/media/android/renderer_demuxer_android.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "content/child/thread_safe_sender.h"
11 #include "content/common/media/media_player_messages_android.h"
12 #include "content/renderer/media/android/media_source_delegate.h"
13 #include "content/renderer/media/android/renderer_media_player_manager.h"
14 #include "content/renderer/media/android/webmediaplayer_android.h"
15 #include "content/renderer/render_thread_impl.h"
19 RendererDemuxerAndroid::RendererDemuxerAndroid()
20 : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()),
22 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()) {}
24 RendererDemuxerAndroid::~RendererDemuxerAndroid() {}
26 int RendererDemuxerAndroid::GetNextDemuxerClientID() {
27 // Don't use zero for IDs since it can be interpreted as having no ID.
28 return next_demuxer_client_id_.GetNext() + 1;
31 void RendererDemuxerAndroid::AddDelegate(int demuxer_client_id,
32 MediaSourceDelegate* delegate) {
33 DCHECK(media_message_loop_->BelongsToCurrentThread());
34 delegates_.AddWithID(delegate, demuxer_client_id);
37 void RendererDemuxerAndroid::RemoveDelegate(int demuxer_client_id) {
38 DCHECK(media_message_loop_->BelongsToCurrentThread());
39 delegates_.Remove(demuxer_client_id);
42 bool RendererDemuxerAndroid::OnMessageReceived(const IPC::Message& message) {
43 switch (message.type()) {
44 case MediaPlayerMsg_DemuxerSeekRequest::ID:
45 case MediaPlayerMsg_ReadFromDemuxer::ID:
46 case MediaPlayerMsg_MediaConfigRequest::ID:
47 media_message_loop_->PostTask(FROM_HERE, base::Bind(
48 &RendererDemuxerAndroid::DispatchMessage, this, message));
54 void RendererDemuxerAndroid::DemuxerReady(
55 int demuxer_client_id,
56 const media::DemuxerConfigs& configs) {
57 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerReady(
58 demuxer_client_id, configs));
61 void RendererDemuxerAndroid::ReadFromDemuxerAck(
62 int demuxer_client_id,
63 const media::DemuxerData& data) {
64 thread_safe_sender_->Send(new MediaPlayerHostMsg_ReadFromDemuxerAck(
65 demuxer_client_id, data));
68 void RendererDemuxerAndroid::DemuxerSeekDone(
69 int demuxer_client_id,
70 const base::TimeDelta& actual_browser_seek_time) {
71 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerSeekDone(
72 demuxer_client_id, actual_browser_seek_time));
75 void RendererDemuxerAndroid::DurationChanged(int demuxer_client_id,
76 const base::TimeDelta& duration) {
77 thread_safe_sender_->Send(new MediaPlayerHostMsg_DurationChanged(
78 demuxer_client_id, duration));
81 void RendererDemuxerAndroid::DispatchMessage(const IPC::Message& message) {
82 IPC_BEGIN_MESSAGE_MAP(RendererDemuxerAndroid, message)
83 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DemuxerSeekRequest, OnDemuxerSeekRequest)
84 IPC_MESSAGE_HANDLER(MediaPlayerMsg_ReadFromDemuxer, OnReadFromDemuxer)
85 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaConfigRequest, OnMediaConfigRequest)
89 void RendererDemuxerAndroid::OnReadFromDemuxer(
90 int demuxer_client_id,
91 media::DemuxerStream::Type type) {
92 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id);
94 delegate->OnReadFromDemuxer(type);
97 void RendererDemuxerAndroid::OnDemuxerSeekRequest(
98 int demuxer_client_id,
99 const base::TimeDelta& time_to_seek,
100 bool is_browser_seek) {
101 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id);
103 delegate->Seek(time_to_seek, is_browser_seek);
106 void RendererDemuxerAndroid::OnMediaConfigRequest(int demuxer_client_id) {
107 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id);
109 delegate->OnMediaConfigRequest();
112 } // namespace content