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" | |
8 #include "content/common/media/media_player_messages_android.h" | 7 #include "content/common/media/media_player_messages_android.h" |
9 #include "media/base/android/media_codec_player.h" | |
10 #include "media/base/media_switches.h" | |
11 | 8 |
12 namespace content { | 9 namespace content { |
13 | 10 |
14 class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { | 11 class BrowserDemuxerAndroid::Internal : public media::DemuxerAndroid { |
15 public: | 12 public: |
16 Internal(const scoped_refptr<BrowserDemuxerAndroid>& demuxer, | 13 Internal(const scoped_refptr<BrowserDemuxerAndroid>& demuxer, |
17 int demuxer_client_id) | 14 int demuxer_client_id) |
18 : demuxer_(demuxer), | 15 : demuxer_(demuxer), |
19 demuxer_client_id_(demuxer_client_id) {} | 16 demuxer_client_id_(demuxer_client_id) {} |
20 | 17 |
(...skipping 27 matching lines...) Expand all Loading... |
48 return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); | 45 return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); |
49 } | 46 } |
50 | 47 |
51 scoped_refptr<BrowserDemuxerAndroid> demuxer_; | 48 scoped_refptr<BrowserDemuxerAndroid> demuxer_; |
52 int demuxer_client_id_; | 49 int demuxer_client_id_; |
53 | 50 |
54 DISALLOW_COPY_AND_ASSIGN(Internal); | 51 DISALLOW_COPY_AND_ASSIGN(Internal); |
55 }; | 52 }; |
56 | 53 |
57 BrowserDemuxerAndroid::BrowserDemuxerAndroid() | 54 BrowserDemuxerAndroid::BrowserDemuxerAndroid() |
58 : BrowserMessageFilter(MediaPlayerMsgStart) { | 55 : BrowserMessageFilter(MediaPlayerMsgStart) {} |
59 bool enable_media_thread = | |
60 base::CommandLine::ForCurrentProcess()-> | |
61 HasSwitch(switches::kEnableMediaThreadForMediaPlayback); | |
62 | |
63 task_runner_ = | |
64 enable_media_thread ? | |
65 media::GetMediaTaskRunner().get() : | |
66 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI).get(); | |
67 | |
68 } | |
69 | 56 |
70 BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} | 57 BrowserDemuxerAndroid::~BrowserDemuxerAndroid() {} |
71 | 58 |
72 base::TaskRunner* BrowserDemuxerAndroid::OverrideTaskRunnerForMessage( | 59 void BrowserDemuxerAndroid::OverrideThreadForMessage( |
73 const IPC::Message& message) { | 60 const IPC::Message& message, |
74 | 61 BrowserThread::ID* thread) { |
75 switch (message.type()) { | 62 switch (message.type()) { |
76 case MediaPlayerHostMsg_DemuxerReady::ID: | 63 case MediaPlayerHostMsg_DemuxerReady::ID: |
77 case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: | 64 case MediaPlayerHostMsg_ReadFromDemuxerAck::ID: |
78 case MediaPlayerHostMsg_DurationChanged::ID: | 65 case MediaPlayerHostMsg_DurationChanged::ID: |
79 case MediaPlayerHostMsg_DemuxerSeekDone::ID: | 66 case MediaPlayerHostMsg_DemuxerSeekDone::ID: |
80 return task_runner_; | 67 *thread = BrowserThread::UI; |
| 68 return; |
81 } | 69 } |
82 | |
83 return nullptr; | |
84 } | 70 } |
85 | 71 |
86 bool BrowserDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { | 72 bool BrowserDemuxerAndroid::OnMessageReceived(const IPC::Message& message) { |
87 bool handled = true; | 73 bool handled = true; |
88 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) | 74 IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerAndroid, message) |
89 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) | 75 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) |
90 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, | 76 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, |
91 OnReadFromDemuxerAck) | 77 OnReadFromDemuxerAck) |
92 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, | 78 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, |
93 OnDurationChanged) | 79 OnDurationChanged) |
94 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, | 80 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerSeekDone, |
95 OnDemuxerSeekDone) | 81 OnDemuxerSeekDone) |
96 IPC_MESSAGE_UNHANDLED(handled = false) | 82 IPC_MESSAGE_UNHANDLED(handled = false) |
97 IPC_END_MESSAGE_MAP() | 83 IPC_END_MESSAGE_MAP() |
98 return handled; | 84 return handled; |
99 } | 85 } |
100 | 86 |
101 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( | 87 scoped_ptr<media::DemuxerAndroid> BrowserDemuxerAndroid::CreateDemuxer( |
102 int demuxer_client_id) { | 88 int demuxer_client_id) { |
103 return scoped_ptr<media::DemuxerAndroid>( | 89 return scoped_ptr<media::DemuxerAndroid>( |
104 new Internal(this, demuxer_client_id)); | 90 new Internal(this, demuxer_client_id)); |
105 } | 91 } |
106 | 92 |
107 void BrowserDemuxerAndroid::AddDemuxerClient( | 93 void BrowserDemuxerAndroid::AddDemuxerClient( |
108 int demuxer_client_id, | 94 int demuxer_client_id, |
109 media::DemuxerAndroidClient* client) { | 95 media::DemuxerAndroidClient* client) { |
110 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 96 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
111 << " demuxer_client_id=" << demuxer_client_id; | 97 << " demuxer_client_id=" << demuxer_client_id; |
112 DCHECK(task_runner_->BelongsToCurrentThread()); | |
113 | |
114 demuxer_clients_.AddWithID(client, demuxer_client_id); | 98 demuxer_clients_.AddWithID(client, demuxer_client_id); |
115 | |
116 if (pending_configs_.count(demuxer_client_id)) { | |
117 client->OnDemuxerConfigsAvailable(pending_configs_[demuxer_client_id]); | |
118 pending_configs_.erase(demuxer_client_id); | |
119 } | |
120 } | 99 } |
121 | 100 |
122 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { | 101 void BrowserDemuxerAndroid::RemoveDemuxerClient(int demuxer_client_id) { |
123 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() | 102 DVLOG(1) << __FUNCTION__ << " peer_pid=" << peer_pid() |
124 << " demuxer_client_id=" << demuxer_client_id; | 103 << " demuxer_client_id=" << demuxer_client_id; |
125 DCHECK(task_runner_->BelongsToCurrentThread()); | |
126 | |
127 demuxer_clients_.Remove(demuxer_client_id); | 104 demuxer_clients_.Remove(demuxer_client_id); |
128 } | 105 } |
129 | 106 |
130 void BrowserDemuxerAndroid::OnDemuxerReady( | 107 void BrowserDemuxerAndroid::OnDemuxerReady( |
131 int demuxer_client_id, | 108 int demuxer_client_id, |
132 const media::DemuxerConfigs& configs) { | 109 const media::DemuxerConfigs& configs) { |
133 DCHECK(task_runner_->BelongsToCurrentThread()); | |
134 | |
135 media::DemuxerAndroidClient* client = | 110 media::DemuxerAndroidClient* client = |
136 demuxer_clients_.Lookup(demuxer_client_id); | 111 demuxer_clients_.Lookup(demuxer_client_id); |
137 | |
138 if (client) | 112 if (client) |
139 client->OnDemuxerConfigsAvailable(configs); | 113 client->OnDemuxerConfigsAvailable(configs); |
140 else | |
141 pending_configs_[demuxer_client_id] = configs; | |
142 } | 114 } |
143 | 115 |
144 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( | 116 void BrowserDemuxerAndroid::OnReadFromDemuxerAck( |
145 int demuxer_client_id, | 117 int demuxer_client_id, |
146 const media::DemuxerData& data) { | 118 const media::DemuxerData& data) { |
147 DCHECK(task_runner_->BelongsToCurrentThread()); | |
148 | |
149 media::DemuxerAndroidClient* client = | 119 media::DemuxerAndroidClient* client = |
150 demuxer_clients_.Lookup(demuxer_client_id); | 120 demuxer_clients_.Lookup(demuxer_client_id); |
151 | |
152 if (client) | 121 if (client) |
153 client->OnDemuxerDataAvailable(data); | 122 client->OnDemuxerDataAvailable(data); |
154 } | 123 } |
155 | 124 |
156 void BrowserDemuxerAndroid::OnDemuxerSeekDone( | 125 void BrowserDemuxerAndroid::OnDemuxerSeekDone( |
157 int demuxer_client_id, | 126 int demuxer_client_id, |
158 const base::TimeDelta& actual_browser_seek_time) { | 127 const base::TimeDelta& actual_browser_seek_time) { |
159 DCHECK(task_runner_->BelongsToCurrentThread()); | |
160 | |
161 media::DemuxerAndroidClient* client = | 128 media::DemuxerAndroidClient* client = |
162 demuxer_clients_.Lookup(demuxer_client_id); | 129 demuxer_clients_.Lookup(demuxer_client_id); |
163 | |
164 if (client) | 130 if (client) |
165 client->OnDemuxerSeekDone(actual_browser_seek_time); | 131 client->OnDemuxerSeekDone(actual_browser_seek_time); |
166 } | 132 } |
167 | 133 |
168 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, | 134 void BrowserDemuxerAndroid::OnDurationChanged(int demuxer_client_id, |
169 const base::TimeDelta& duration) { | 135 const base::TimeDelta& duration) { |
170 DCHECK(task_runner_->BelongsToCurrentThread()); | |
171 | |
172 media::DemuxerAndroidClient* client = | 136 media::DemuxerAndroidClient* client = |
173 demuxer_clients_.Lookup(demuxer_client_id); | 137 demuxer_clients_.Lookup(demuxer_client_id); |
174 | |
175 if (client) | 138 if (client) |
176 client->OnDemuxerDurationChanged(duration); | 139 client->OnDemuxerDurationChanged(duration); |
177 else | |
178 pending_configs_[demuxer_client_id].duration = duration; | |
179 } | 140 } |
180 | 141 |
181 } // namespace content | 142 } // namespace content |
OLD | NEW |