Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(671)

Side by Side Diff: content/browser/media/android/browser_demuxer_android.cc

Issue 1076013002: Added stub MediaSourcePlayer for developing behind the flag (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed WeakPtr usage, disabled thread-safe checks for demuxer's IDMap Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698