Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/media/android/browser_demuxer_android.h" | 5 #include "content/browser/media/android/browser_demuxer_android.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | |
| 7 #include "content/common/media/media_player_messages_android.h" | 8 #include "content/common/media/media_player_messages_android.h" |
| 9 #include "media/base/android/media_source_player.h" | |
| 10 #include "media/base/media_switches.h" | |
| 8 | 11 |
| 9 namespace content { | 12 namespace content { |
| 10 | 13 |
| 11 class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { | 14 class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { |
| 12 public: | 15 public: |
| 13 Internal(const scoped_refptr<BrowserDemuxerAndroid>& demuxer, | 16 Internal(const scoped_refptr<BrowserDemuxerAndroid>& demuxer, |
| 14 int demuxer_client_id) | 17 int demuxer_client_id) |
| 15 : demuxer_(demuxer), | 18 : demuxer_(demuxer), |
| 16 demuxer_client_id_(demuxer_client_id) {} | 19 demuxer_client_id_(demuxer_client_id) {} |
| 17 | 20 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 35 void RequestDemuxerSeek(const base::TimeDelta& time_to_seek, | 38 void RequestDemuxerSeek(const base::TimeDelta& time_to_seek, |
| 36 bool is_browser_seek) override { | 39 bool is_browser_seek) override { |
| 37 DCHECK(ClientIDExists()) << demuxer_client_id_; | 40 DCHECK(ClientIDExists()) << demuxer_client_id_; |
| 38 demuxer_->Send(new MediaPlayerMsg_DemuxerSeekRequest( | 41 demuxer_->Send(new MediaPlayerMsg_DemuxerSeekRequest( |
| 39 demuxer_client_id_, time_to_seek, is_browser_seek)); | 42 demuxer_client_id_, time_to_seek, is_browser_seek)); |
| 40 } | 43 } |
| 41 | 44 |
| 42 private: | 45 private: |
| 43 // Helper for DCHECKing that the ID is still registered. | 46 // Helper for DCHECKing that the ID is still registered. |
| 44 bool ClientIDExists() { | 47 bool ClientIDExists() { |
| 45 return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); | 48 return demuxer_->Lookup(demuxer_client_id_); |
| 46 } | 49 } |
| 47 | 50 |
| 48 scoped_refptr<BrowserDemuxerAndroid> demuxer_; | 51 scoped_refptr<BrowserDemuxerAndroid> demuxer_; |
| 49 int demuxer_client_id_; | 52 int demuxer_client_id_; |
| 50 | 53 |
| 51 DISALLOW_COPY_AND_ASSIGN(Internal); | 54 DISALLOW_COPY_AND_ASSIGN(Internal); |
| 52 }; | 55 }; |
| 53 | 56 |
| 54 BrowserDemuxerAndroid::BrowserDemuxerAndroid() | 57 BrowserDemuxerAndroid::BrowserDemuxerAndroid() |
| 55 : BrowserMessageFilter(MediaPlayerMsgStart) {} | 58 : BrowserMessageFilter(MediaPlayerMsgStart) { |
| 59 enable_media_thread_for_media_playback_ = | |
| 60 base::CommandLine::ForCurrentProcess()-> | |
| 61 HasSwitch(switches::kEnableMediaThreadForMediaPlayback); | |
| 62 | |
| 63 } | |
| 56 | 64 |
| 57 BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} | 65 BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} |
| 58 | 66 |
| 59 void BrowserDemuxerAndroid::OverrideThreadForMessage( | 67 void BrowserDemuxerAndroid::OverrideThreadForMessage( |
| 60 const IPC::Message& message, | 68 const IPC::Message& message, |
| 61 BrowserThread::ID* thread) { | 69 BrowserThread::ID* thread) { |
| 70 if (enable_media_thread_for_media_playback_) | |
| 71 return; // keep default BrowserThread::IO | |
| 72 | |
| 62 switch (message.type()) { | 73 switch (message.type()) { |
| 63 case MediaPlayerHostMsg_DemuxerReady::ID: | 74 case MediaPlayerHostMsg_DemuxerReady::ID: |
| 64 case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: | 75 case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: |
| 65 case MediaPlayerHostMsg_DurationChanged::ID: | 76 case MediaPlayerHostMsg_DurationChanged::ID: |
| 66 case MediaPlayerHostMsg_DemuxerSeekDone::ID: | 77 case MediaPlayerHostMsg_DemuxerSeekDone::ID: |
| 67 *thread = BrowserThread::UI; | 78 *thread = BrowserThread::UI; |
| 68 return; | 79 return; |
| 69 } | 80 } |
| 70 } | 81 } |
| 71 | 82 |
| 72 bool BrowserDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { | 83 bool BrowserDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { |
| 73 bool handled = true; | 84 bool handled = true; |
| 85 | |
| 86 if (enable_media_thread_for_media_playback_) { | |
| 87 // Redirect demuxer messages to Media thread | |
| 88 if (!media::GetMediaTaskRunner()->BelongsToCurrentThread()) { | |
| 89 media::GetMediaTaskRunner()->PostTask( | |
| 90 FROM_HERE, | |
| 91 base::Bind( | |
| 92 base::IgnoreResult(&BrowserDemuxerAndroid::OnMessageReceived), | |
| 93 this, message)); | |
|
xhwang
2015/04/24 05:04:13
Can you use OverrideTaskRunnerForMessage() return
| |
| 94 | |
| 95 switch(message.type()) { | |
| 96 case MediaPlayerHostMsg_DemuxerReady::ID: | |
| 97 case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: | |
| 98 case MediaPlayerHostMsg_DurationChanged::ID: | |
| 99 case MediaPlayerHostMsg_DemuxerSeekDone::ID: | |
| 100 break; | |
| 101 default: | |
| 102 handled = false; | |
| 103 break; | |
| 104 } | |
| 105 return handled; | |
| 106 } | |
| 107 } | |
| 108 | |
| 74 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) | 109 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) |
| 75 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) | 110 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) |
| 76 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, | 111 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, |
| 77 OnReadFromDemuxerAck) | 112 OnReadFromDemuxerAck) |
| 78 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, | 113 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, |
| 79 OnDurationChanged) | 114 OnDurationChanged) |
| 80 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, | 115 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, |
| 81 OnDemuxerSeekDone) | 116 OnDemuxerSeekDone) |
| 82 IPC_MESSAGE_UNHANDLED(handled = false) | 117 IPC_MESSAGE_UNHANDLED(handled = false) |
| 83 IPC_END_MESSAGE_MAP() | 118 IPC_END_MESSAGE_MAP() |
| 84 return handled; | 119 return handled; |
| 85 } | 120 } |
| 86 | 121 |
| 87 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( | 122 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( |
| 88 int demuxer_client_id) { | 123 int demuxer_client_id) { |
| 89 return scoped_ptr<media::DemuxerAndroid>( | 124 return scoped_ptr<media::DemuxerAndroid>( |
| 90 new Internal(this, demuxer_client_id)); | 125 new Internal(this, demuxer_client_id)); |
| 91 } | 126 } |
| 92 | 127 |
| 93 void BrowserDemuxerAndroid::AddDemuxerClient( | 128 void BrowserDemuxerAndroid::AddDemuxerClient( |
| 94 int demuxer_client_id, | 129 int demuxer_client_id, |
| 95 media::DemuxerAndroidClient* client) { | 130 media::DemuxerAndroidClient* client) { |
| 96 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 131 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
| 97 << " demuxer_client_id=" << demuxer_client_id; | 132 << " demuxer_client_id=" << demuxer_client_id; |
| 133 | |
| 134 base::AutoLock lock(lock_); | |
|
xhwang
2015/04/24 05:04:13
This whole class should still live on one single t
timav
2015/04/24 18:55:32
Xiaohan, thank you for looking into this!
In this
| |
| 98 demuxer_clients_.AddWithID(client, demuxer_client_id); | 135 demuxer_clients_.AddWithID(client, demuxer_client_id); |
| 99 } | 136 } |
| 100 | 137 |
| 101 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { | 138 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { |
| 102 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 139 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
| 103 << " demuxer_client_id=" << demuxer_client_id; | 140 << " demuxer_client_id=" << demuxer_client_id; |
| 141 | |
| 142 base::AutoLock lock(lock_); | |
| 104 demuxer_clients_.Remove(demuxer_client_id); | 143 demuxer_clients_.Remove(demuxer_client_id); |
| 105 } | 144 } |
| 106 | 145 |
| 146 media::DemuxerAndroidClient* | |
| 147 BrowserDemuxerAndroid::Lookup(int demuxer_client_id) { | |
| 148 base::AutoLock lock(lock_); | |
| 149 return demuxer_clients_.Lookup(demuxer_client_id); | |
| 150 } | |
| 151 | |
| 107 void BrowserDemuxerAndroid::OnDemuxerReady( | 152 void BrowserDemuxerAndroid::OnDemuxerReady( |
| 108 int demuxer_client_id, | 153 int demuxer_client_id, |
| 109 const media::DemuxerConfigs& configs) { | 154 const media::DemuxerConfigs& configs) { |
| 110 media::DemuxerAndroidClient* client = | 155 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
| 111 demuxer_clients_.Lookup(demuxer_client_id); | |
| 112 if (client) | 156 if (client) |
| 113 client->OnDemuxerConfigsAvailable(configs); | 157 client->OnDemuxerConfigsAvailable(configs); |
| 114 } | 158 } |
| 115 | 159 |
| 116 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( | 160 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( |
| 117 int demuxer_client_id, | 161 int demuxer_client_id, |
| 118 const media::DemuxerData& data) { | 162 const media::DemuxerData& data) { |
| 119 media::DemuxerAndroidClient* client = | 163 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
| 120 demuxer_clients_.Lookup(demuxer_client_id); | |
| 121 if (client) | 164 if (client) |
| 122 client->OnDemuxerDataAvailable(data); | 165 client->OnDemuxerDataAvailable(data); |
| 123 } | 166 } |
| 124 | 167 |
| 125 void BrowserDemuxerAndroid::OnDemuxerSeekDone( | 168 void BrowserDemuxerAndroid::OnDemuxerSeekDone( |
| 126 int demuxer_client_id, | 169 int demuxer_client_id, |
| 127 const base::TimeDelta& actual_browser_seek_time) { | 170 const base::TimeDelta& actual_browser_seek_time) { |
| 128 media::DemuxerAndroidClient* client = | 171 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
| 129 demuxer_clients_.Lookup(demuxer_client_id); | |
| 130 if (client) | 172 if (client) |
| 131 client->OnDemuxerSeekDone(actual_browser_seek_time); | 173 client->OnDemuxerSeekDone(actual_browser_seek_time); |
| 132 } | 174 } |
| 133 | 175 |
| 134 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, | 176 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, |
| 135 const base::TimeDelta& duration) { | 177 const base::TimeDelta& duration) { |
| 136 media::DemuxerAndroidClient* client = | 178 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
| 137 demuxer_clients_.Lookup(demuxer_client_id); | |
| 138 if (client) | 179 if (client) |
| 139 client->OnDemuxerDurationChanged(duration); | 180 client->OnDemuxerDurationChanged(duration); |
| 140 } | 181 } |
| 141 | 182 |
| 142 } // namespace content | 183 } // namespace content |
| OLD | NEW |