| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/media/android/browser_demuxer_android.h" |
| |
| #include "content/common/media/media_player_messages_android.h" |
| |
| namespace content { |
| |
| class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { |
| public: |
| Internal(const scoped_refptr<BrowserDemuxerAndroid>& demuxer, |
| int demuxer_client_id) |
| : demuxer_(demuxer), |
| demuxer_client_id_(demuxer_client_id) {} |
| |
| virtual ~Internal() { |
| DCHECK(ClientIDExists()) << demuxer_client_id_; |
| demuxer_->RemoveDemuxerClient(demuxer_client_id_); |
| } |
| |
| // media::DemuxerAndroid implementation. |
| virtual void Initialize(media::DemuxerAndroidClient* client) OVERRIDE { |
| DCHECK(!ClientIDExists()) << demuxer_client_id_; |
| demuxer_->AddDemuxerClient(demuxer_client_id_, client); |
| } |
| |
| virtual void RequestDemuxerConfigs() OVERRIDE { |
| DCHECK(ClientIDExists()) << demuxer_client_id_; |
| demuxer_->Send(new MediaPlayerMsg_MediaConfigRequest(demuxer_client_id_)); |
| } |
| |
| virtual void RequestDemuxerData(media::DemuxerStream::Type type) OVERRIDE { |
| DCHECK(ClientIDExists()) << demuxer_client_id_; |
| demuxer_->Send(new MediaPlayerMsg_ReadFromDemuxer( |
| demuxer_client_id_, type)); |
| } |
| |
| virtual void RequestDemuxerSeek( |
| const base::TimeDelta& time_to_seek, |
| bool is_browser_seek) OVERRIDE { |
| DCHECK(ClientIDExists()) << demuxer_client_id_; |
| demuxer_->Send(new MediaPlayerMsg_DemuxerSeekRequest( |
| demuxer_client_id_, time_to_seek, is_browser_seek)); |
| } |
| |
| private: |
| // Helper for DCHECKing that the ID is still registered. |
| bool ClientIDExists() { |
| return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); |
| } |
| |
| scoped_refptr<BrowserDemuxerAndroid> demuxer_; |
| int demuxer_client_id_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Internal); |
| }; |
| |
| BrowserDemuxerAndroid::BrowserDemuxerAndroid() {} |
| |
| BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} |
| |
| void BrowserDemuxerAndroid::OverrideThreadForMessage( |
| const IPC::Message& message, |
| BrowserThread::ID* thread) { |
| switch (message.type()) { |
| case MediaPlayerHostMsg_DemuxerReady::ID: |
| case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: |
| case MediaPlayerHostMsg_DurationChanged::ID: |
| case MediaPlayerHostMsg_DemuxerSeekDone::ID: |
| *thread = BrowserThread::UI; |
| return; |
| } |
| } |
| |
| bool BrowserDemuxerAndroid::OnMessageReceived(const IPC::Message& message, |
| bool* message_was_ok) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP_EX(BrowserDemuxerAndroid, message, *message_was_ok) |
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) |
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, |
| OnReadFromDemuxerAck) |
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, |
| OnDurationChanged) |
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, |
| OnDemuxerSeekDone) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| return handled; |
| } |
| |
| scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( |
| int demuxer_client_id) { |
| return scoped_ptr<media::DemuxerAndroid>( |
| new Internal(this, demuxer_client_id)); |
| } |
| |
| void BrowserDemuxerAndroid::AddDemuxerClient( |
| int demuxer_client_id, |
| media::DemuxerAndroidClient* client) { |
| DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
| << " demuxer_client_id=" << demuxer_client_id; |
| demuxer_clients_.AddWithID(client, demuxer_client_id); |
| } |
| |
| void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { |
| DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
| << " demuxer_client_id=" << demuxer_client_id; |
| demuxer_clients_.Remove(demuxer_client_id); |
| } |
| |
| void BrowserDemuxerAndroid::OnDemuxerReady( |
| int demuxer_client_id, |
| const media::DemuxerConfigs& configs) { |
| media::DemuxerAndroidClient* client = |
| demuxer_clients_.Lookup(demuxer_client_id); |
| if (client) |
| client->OnDemuxerConfigsAvailable(configs); |
| } |
| |
| void BrowserDemuxerAndroid::OnReadFromDemuxerAck( |
| int demuxer_client_id, |
| const media::DemuxerData& data) { |
| media::DemuxerAndroidClient* client = |
| demuxer_clients_.Lookup(demuxer_client_id); |
| if (client) |
| client->OnDemuxerDataAvailable(data); |
| } |
| |
| void BrowserDemuxerAndroid::OnDemuxerSeekDone( |
| int demuxer_client_id, |
| const base::TimeDelta& actual_browser_seek_time) { |
| media::DemuxerAndroidClient* client = |
| demuxer_clients_.Lookup(demuxer_client_id); |
| if (client) |
| client->OnDemuxerSeekDone(actual_browser_seek_time); |
| } |
| |
| void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, |
| const base::TimeDelta& duration) { |
| media::DemuxerAndroidClient* client = |
| demuxer_clients_.Lookup(demuxer_client_id); |
| if (client) |
| client->OnDemuxerDurationChanged(duration); |
| } |
| |
| } // namespace content |