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)); | |
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 handled = true; | |
qinmin
2015/04/23 18:48:38
nit: no need for this line
timav
2015/04/23 23:06:12
Removed this line
| |
101 break; | |
102 default: | |
103 handled = false; | |
104 break; | |
105 } | |
106 return handled; | |
107 } | |
108 } | |
109 | |
74 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) | 110 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) |
75 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) | 111 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) |
76 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, | 112 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, |
77 OnReadFromDemuxerAck) | 113 OnReadFromDemuxerAck) |
78 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, | 114 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, |
79 OnDurationChanged) | 115 OnDurationChanged) |
80 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, | 116 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, |
81 OnDemuxerSeekDone) | 117 OnDemuxerSeekDone) |
82 IPC_MESSAGE_UNHANDLED(handled = false) | 118 IPC_MESSAGE_UNHANDLED(handled = false) |
83 IPC_END_MESSAGE_MAP() | 119 IPC_END_MESSAGE_MAP() |
84 return handled; | 120 return handled; |
85 } | 121 } |
86 | 122 |
87 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( | 123 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( |
88 int demuxer_client_id) { | 124 int demuxer_client_id) { |
89 return scoped_ptr<media::DemuxerAndroid>( | 125 return scoped_ptr<media::DemuxerAndroid>( |
90 new Internal(this, demuxer_client_id)); | 126 new Internal(this, demuxer_client_id)); |
91 } | 127 } |
92 | 128 |
93 void BrowserDemuxerAndroid::AddDemuxerClient( | 129 void BrowserDemuxerAndroid::AddDemuxerClient( |
94 int demuxer_client_id, | 130 int demuxer_client_id, |
95 media::DemuxerAndroidClient* client) { | 131 media::DemuxerAndroidClient* client) { |
96 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 132 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
97 << " demuxer_client_id=" << demuxer_client_id; | 133 << " demuxer_client_id=" << demuxer_client_id; |
134 | |
135 base::AutoLock lock(lock_); | |
98 demuxer_clients_.AddWithID(client, demuxer_client_id); | 136 demuxer_clients_.AddWithID(client, demuxer_client_id); |
99 } | 137 } |
100 | 138 |
101 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { | 139 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { |
102 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 140 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
103 << " demuxer_client_id=" << demuxer_client_id; | 141 << " demuxer_client_id=" << demuxer_client_id; |
142 | |
143 base::AutoLock lock(lock_); | |
104 demuxer_clients_.Remove(demuxer_client_id); | 144 demuxer_clients_.Remove(demuxer_client_id); |
105 } | 145 } |
106 | 146 |
147 media::DemuxerAndroidClient* | |
148 BrowserDemuxerAndroid::Lookup(int demuxer_client_id) { | |
149 base::AutoLock lock(lock_); | |
150 return demuxer_clients_.Lookup(demuxer_client_id); | |
151 } | |
152 | |
107 void BrowserDemuxerAndroid::OnDemuxerReady( | 153 void BrowserDemuxerAndroid::OnDemuxerReady( |
108 int demuxer_client_id, | 154 int demuxer_client_id, |
109 const media::DemuxerConfigs& configs) { | 155 const media::DemuxerConfigs& configs) { |
110 media::DemuxerAndroidClient* client = | 156 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
111 demuxer_clients_.Lookup(demuxer_client_id); | |
112 if (client) | 157 if (client) |
113 client->OnDemuxerConfigsAvailable(configs); | 158 client->OnDemuxerConfigsAvailable(configs); |
114 } | 159 } |
115 | 160 |
116 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( | 161 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( |
117 int demuxer_client_id, | 162 int demuxer_client_id, |
118 const media::DemuxerData& data) { | 163 const media::DemuxerData& data) { |
119 media::DemuxerAndroidClient* client = | 164 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
120 demuxer_clients_.Lookup(demuxer_client_id); | |
121 if (client) | 165 if (client) |
122 client->OnDemuxerDataAvailable(data); | 166 client->OnDemuxerDataAvailable(data); |
123 } | 167 } |
124 | 168 |
125 void BrowserDemuxerAndroid::OnDemuxerSeekDone( | 169 void BrowserDemuxerAndroid::OnDemuxerSeekDone( |
126 int demuxer_client_id, | 170 int demuxer_client_id, |
127 const base::TimeDelta& actual_browser_seek_time) { | 171 const base::TimeDelta& actual_browser_seek_time) { |
128 media::DemuxerAndroidClient* client = | 172 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
129 demuxer_clients_.Lookup(demuxer_client_id); | |
130 if (client) | 173 if (client) |
131 client->OnDemuxerSeekDone(actual_browser_seek_time); | 174 client->OnDemuxerSeekDone(actual_browser_seek_time); |
132 } | 175 } |
133 | 176 |
134 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, | 177 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, |
135 const base::TimeDelta& duration) { | 178 const base::TimeDelta& duration) { |
136 media::DemuxerAndroidClient* client = | 179 media::DemuxerAndroidClient* client = Lookup(demuxer_client_id); |
137 demuxer_clients_.Lookup(demuxer_client_id); | |
138 if (client) | 180 if (client) |
139 client->OnDemuxerDurationChanged(duration); | 181 client->OnDemuxerDurationChanged(duration); |
140 } | 182 } |
141 | 183 |
142 } // namespace content | 184 } // namespace content |
OLD | NEW |