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/single_thread_task_runner.h" 9 #include "content/child/thread_safe_sender.h" 10 #include "content/common/media/media_player_messages_android.h" 11 #include "content/renderer/media/android/media_source_delegate.h" 12 #include "content/renderer/media/android/renderer_media_player_manager.h" 13 #include "content/renderer/media/android/webmediaplayer_android.h" 14 #include "content/renderer/render_thread_impl.h" 15 16 namespace content { 17 18 RendererDemuxerAndroid::RendererDemuxerAndroid() 19 : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()), 20 media_task_runner_( 21 RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {} 22 23 RendererDemuxerAndroid::~RendererDemuxerAndroid() {} 24 25 int RendererDemuxerAndroid::GetNextDemuxerClientID() { 26 // Don't use zero for IDs since it can be interpreted as having no ID. 27 return next_demuxer_client_id_.GetNext() + 1; 28 } 29 30 void RendererDemuxerAndroid::AddDelegate(int demuxer_client_id, 31 MediaSourceDelegate* delegate) { 32 DCHECK(media_task_runner_->BelongsToCurrentThread()); 33 delegates_.AddWithID(delegate, demuxer_client_id); 34 } 35 36 void RendererDemuxerAndroid::RemoveDelegate(int demuxer_client_id) { 37 DCHECK(media_task_runner_->BelongsToCurrentThread()); 38 delegates_.Remove(demuxer_client_id); 39 } 40 41 bool RendererDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { 42 switch (message.type()) { 43 case MediaPlayerMsg_DemuxerSeekRequest::ID: 44 case MediaPlayerMsg_ReadFromDemuxer::ID: 45 media_task_runner_->PostTask(FROM_HERE, base::Bind( 46 &RendererDemuxerAndroid::DispatchMessage, this, message)); 47 return true; 48 } 49 return false; 50 } 51 52 void RendererDemuxerAndroid::DemuxerReady( 53 int demuxer_client_id, 54 const media::DemuxerConfigs& configs) { 55 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerReady( 56 demuxer_client_id, configs)); 57 } 58 59 void RendererDemuxerAndroid::ReadFromDemuxerAck( 60 int demuxer_client_id, 61 const media::DemuxerData& data) { 62 thread_safe_sender_->Send(new MediaPlayerHostMsg_ReadFromDemuxerAck( 63 demuxer_client_id, data)); 64 } 65 66 void RendererDemuxerAndroid::DemuxerSeekDone( 67 int demuxer_client_id, 68 const base::TimeDelta& actual_browser_seek_time) { 69 thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerSeekDone( 70 demuxer_client_id, actual_browser_seek_time)); 71 } 72 73 void RendererDemuxerAndroid::DurationChanged(int demuxer_client_id, 74 const base::TimeDelta& duration) { 75 thread_safe_sender_->Send(new MediaPlayerHostMsg_DurationChanged( 76 demuxer_client_id, duration)); 77 } 78 79 void RendererDemuxerAndroid::DispatchMessage(const IPC::Message& message) { 80 IPC_BEGIN_MESSAGE_MAP(RendererDemuxerAndroid, message) 81 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DemuxerSeekRequest, OnDemuxerSeekRequest) 82 IPC_MESSAGE_HANDLER(MediaPlayerMsg_ReadFromDemuxer, OnReadFromDemuxer) 83 IPC_END_MESSAGE_MAP() 84 } 85 86 void RendererDemuxerAndroid::OnReadFromDemuxer( 87 int demuxer_client_id, 88 media::DemuxerStream::Type type) { 89 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 90 if (delegate) 91 delegate->OnReadFromDemuxer(type); 92 } 93 94 void RendererDemuxerAndroid::OnDemuxerSeekRequest( 95 int demuxer_client_id, 96 const base::TimeDelta& time_to_seek, 97 bool is_browser_seek) { 98 MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 99 if (delegate) 100 delegate->Seek(time_to_seek, is_browser_seek); 101 } 102 103 } // namespace content 104