1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/media/android/renderer_demuxer_android.h" 6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/bind.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/single_thread_task_runner.h" 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/child/thread_safe_sender.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/common/media/media_player_messages_android.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/media/android/media_source_delegate.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/media/android/renderer_media_player_manager.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/media/android/webmediaplayer_android.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/renderer/render_thread_impl.h" 15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace content { 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)RendererDemuxerAndroid::RendererDemuxerAndroid() 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()), 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_( 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {} 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)RendererDemuxerAndroid::~RendererDemuxerAndroid() {} 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int RendererDemuxerAndroid::GetNextDemuxerClientID() { 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Don't use zero for IDs since it can be interpreted as having no ID. 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return next_demuxer_client_id_.GetNext() + 1; 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::AddDelegate(int demuxer_client_id, 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaSourceDelegate* delegate) { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(media_task_runner_->BelongsToCurrentThread()); 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegates_.AddWithID(delegate, demuxer_client_id); 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::RemoveDelegate(int demuxer_client_id) { 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(media_task_runner_->BelongsToCurrentThread()); 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegates_.Remove(demuxer_client_id); 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool RendererDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (message.type()) { 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case MediaPlayerMsg_DemuxerSeekRequest::ID: 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case MediaPlayerMsg_ReadFromDemuxer::ID: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_task_runner_->PostTask(FROM_HERE, base::Bind( 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &RendererDemuxerAndroid::DispatchMessage, this, message)); 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::DemuxerReady( 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int demuxer_client_id, 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const media::DemuxerConfigs& configs) { 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerReady( 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) demuxer_client_id, configs)); 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::ReadFromDemuxerAck( 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int demuxer_client_id, 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const media::DemuxerData& data) { 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) thread_safe_sender_->Send(new MediaPlayerHostMsg_ReadFromDemuxerAck( 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) demuxer_client_id, data)); 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void RendererDemuxerAndroid::DemuxerSeekDone( 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int demuxer_client_id, 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const base::TimeDelta& actual_browser_seek_time) { 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerSeekDone( 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) demuxer_client_id, actual_browser_seek_time)); 71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::DurationChanged(int demuxer_client_id, 74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::TimeDelta& duration) { 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) thread_safe_sender_->Send(new MediaPlayerHostMsg_DurationChanged( 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) demuxer_client_id, duration)); 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void RendererDemuxerAndroid::DispatchMessage(const IPC::Message& message) { 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(RendererDemuxerAndroid, message) 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerMsg_DemuxerSeekRequest, OnDemuxerSeekRequest) 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPC_MESSAGE_HANDLER(MediaPlayerMsg_ReadFromDemuxer, OnReadFromDemuxer) 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPC_END_MESSAGE_MAP() 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void RendererDemuxerAndroid::OnReadFromDemuxer( 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int demuxer_client_id, 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) media::DemuxerStream::Type type) { 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate) 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate->OnReadFromDemuxer(type); 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void RendererDemuxerAndroid::OnDemuxerSeekRequest( 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int demuxer_client_id, 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const base::TimeDelta& time_to_seek, 971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_browser_seek) { 98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id); 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (delegate) 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) delegate->Seek(time_to_seek, is_browser_seek); 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace content 104