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. 4 5 #include "content/renderer/media/android/renderer_demuxer_android.h" 6 7 #include "base/bind.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" 16 17 namespace content { 18 19 RendererDemuxerAndroid::RendererDemuxerAndroid() 20 : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()), 21 media_message_loop_( 22 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()) {} 23 24 RendererDemuxerAndroid::~RendererDemuxerAndroid() {} 25 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; 29 } 30 31 void RendererDemuxerAndroid::AddDelegate(int demuxer_client_id, 32 MediaSourceDelegate* delegate) { 33 DCHECK(media_message_loop_->BelongsToCurrentThread()); 34 delegates_.AddWithID(delegate, demuxer_client_id); 35 } 36 37 void RendererDemuxerAndroid::RemoveDelegate(int demuxer_client_id) { 38 DCHECK(media_message_loop_->BelongsToCurrentThread()); 39 delegates_.Remove(demuxer_client_id); 40 } 41 42 bool RendererDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { 43 switch (message.type()) { 44 case MediaPlayerMsg_DemuxerSeekRequest::ID: 45 case MediaPlayerMsg_ReadFromDemuxer::ID: 46 media_message_loop_->PostTask(FROM_HERE, base::Bind( 47 &RendererDemuxerAndroid::DispatchMessage, this, message)); 48 return true; 49 } 50 return false; 51 } 52 53 void RendererDemuxerAndroid::DemuxerReady( 54 int demuxer_client_id, 55 const media::DemuxerConfigs& configs) { 56 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerReady( 57 demuxer_client_id, configs)); 58 } 59 60 void RendererDemuxerAndroid::ReadFromDemuxerAck( 61 int demuxer_client_id, 62 const media::DemuxerData& data) { 63 thread_safe_sender_->Send(new MediaPlayerHostMsg_ReadFromDemuxerAck( 64 demuxer_client_id, data)); 65 } 66 67 void RendererDemuxerAndroid::DemuxerSeekDone( 68 int demuxer_client_id, 69 const base::TimeDelta& actual_browser_seek_time) { 70 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerSeekDone( 71 demuxer_client_id, actual_browser_seek_time)); 72 } 73 74 void RendererDemuxerAndroid::DurationChanged(int demuxer_client_id, 75 const base::TimeDelta& duration) { 76 thread_safe_sender_->Send(new MediaPlayerHostMsg_DurationChanged( 77 demuxer_client_id, duration)); 78 } 79 80 void RendererDemuxerAndroid::DispatchMessage(const IPC::Message& message) { 81 IPC_BEGIN_MESSAGE_MAP(RendererDemuxerAndroid, message) 82 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DemuxerSeekRequest, OnDemuxerSeekRequest) 83 IPC_MESSAGE_HANDLER(MediaPlayerMsg_ReadFromDemuxer, OnReadFromDemuxer) 84 IPC_END_MESSAGE_MAP() 85 } 86 87 void RendererDemuxerAndroid::OnReadFromDemuxer( 88 int demuxer_client_id, 89 media::DemuxerStream::Type type) { 90 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 91 if (delegate) 92 delegate->OnReadFromDemuxer(type); 93 } 94 95 void RendererDemuxerAndroid::OnDemuxerSeekRequest( 96 int demuxer_client_id, 97 const base::TimeDelta& time_to_seek, 98 bool is_browser_seek) { 99 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 100 if (delegate) 101 delegate->Seek(time_to_seek, is_browser_seek); 102 } 103 104 } // namespace content 105