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

Side by Side Diff: webkit/media/webmediaplayer_impl.cc

Issue 15005005: Use a shared thread for media operations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "webkit/media/webmediaplayer_impl.h" 5 #include "webkit/media/webmediaplayer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 121
122 WebMediaPlayerImpl::WebMediaPlayerImpl( 122 WebMediaPlayerImpl::WebMediaPlayerImpl(
123 WebKit::WebFrame* frame, 123 WebKit::WebFrame* frame,
124 WebKit::WebMediaPlayerClient* client, 124 WebKit::WebMediaPlayerClient* client,
125 base::WeakPtr<WebMediaPlayerDelegate> delegate, 125 base::WeakPtr<WebMediaPlayerDelegate> delegate,
126 const WebMediaPlayerParams& params) 126 const WebMediaPlayerParams& params)
127 : frame_(frame), 127 : frame_(frame),
128 network_state_(WebMediaPlayer::NetworkStateEmpty), 128 network_state_(WebMediaPlayer::NetworkStateEmpty),
129 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 129 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
130 main_loop_(base::MessageLoopProxy::current()), 130 main_loop_(base::MessageLoopProxy::current()),
131 media_thread_("MediaPipeline"), 131 media_loop_(params.message_loop_proxy()),
132 paused_(true), 132 paused_(true),
133 seeking_(false), 133 seeking_(false),
134 playback_rate_(0.0f), 134 playback_rate_(0.0f),
135 pending_seek_(false), 135 pending_seek_(false),
136 pending_seek_seconds_(0.0f), 136 pending_seek_seconds_(0.0f),
137 client_(client), 137 client_(client),
138 delegate_(delegate), 138 delegate_(delegate),
139 media_log_(params.media_log()), 139 media_log_(params.media_log()),
140 accelerated_compositing_reported_(false), 140 accelerated_compositing_reported_(false),
141 incremented_externally_allocated_memory_(false), 141 incremented_externally_allocated_memory_(false),
142 gpu_factories_(params.gpu_factories()), 142 gpu_factories_(params.gpu_factories()),
143 is_local_source_(false), 143 is_local_source_(false),
144 supports_save_(true), 144 supports_save_(true),
145 starting_(false), 145 starting_(false),
146 chunk_demuxer_(NULL), 146 chunk_demuxer_(NULL),
147 pending_repaint_(false), 147 pending_repaint_(false),
148 pending_size_change_(false), 148 pending_size_change_(false),
149 video_frame_provider_client_(NULL) { 149 video_frame_provider_client_(NULL) {
150 media_log_->AddEvent( 150 media_log_->AddEvent(
151 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 151 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED));
152 152
153 CHECK(media_thread_.Start()); 153 pipeline_.reset(new media::Pipeline(media_loop_, media_log_));
154 pipeline_.reset(new media::Pipeline(
155 media_thread_.message_loop_proxy(), media_log_));
156 154
157 // Let V8 know we started new thread if we did not do it yet. 155 // Let V8 know we started new thread if we did not do it yet.
158 // Made separate task to avoid deletion of player currently being created. 156 // Made separate task to avoid deletion of player currently being created.
159 // Also, delaying GC until after player starts gets rid of starting lag -- 157 // Also, delaying GC until after player starts gets rid of starting lag --
160 // collection happens in parallel with playing. 158 // collection happens in parallel with playing.
161 // 159 //
162 // TODO(enal): remove when we get rid of per-audio-stream thread. 160 // TODO(enal): remove when we get rid of per-audio-stream thread.
163 main_loop_->PostTask( 161 main_loop_->PostTask(
164 FROM_HERE, 162 FROM_HERE,
165 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, 163 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory,
166 AsWeakPtr())); 164 AsWeakPtr()));
167 165
168 // Also we want to be notified of |main_loop_| destruction. 166 // Also we want to be notified of |main_loop_| destruction.
169 base::MessageLoop::current()->AddDestructionObserver(this); 167 base::MessageLoop::current()->AddDestructionObserver(this);
170 168
171 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) { 169 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) {
172 decryptor_.reset(new ProxyDecryptor( 170 decryptor_.reset(new ProxyDecryptor(
173 client, 171 client,
174 frame, 172 frame,
175 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyAdded), 173 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyAdded),
176 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError), 174 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError),
177 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage), 175 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage),
178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey))); 176 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey)));
179 } 177 }
180 178
181 // Use the null sink if no sink was provided. 179 // Use the null sink if no sink was provided.
182 audio_source_provider_ = new WebAudioSourceProviderImpl( 180 audio_source_provider_ = new WebAudioSourceProviderImpl(
183 params.audio_renderer_sink() ? params.audio_renderer_sink() : 181 params.audio_renderer_sink() ? params.audio_renderer_sink() :
184 new media::NullAudioSink(media_thread_.message_loop_proxy())); 182 new media::NullAudioSink(media_loop_));
185 } 183 }
186 184
187 WebMediaPlayerImpl::~WebMediaPlayerImpl() { 185 WebMediaPlayerImpl::~WebMediaPlayerImpl() {
188 SetVideoFrameProviderClient(NULL); 186 SetVideoFrameProviderClient(NULL);
189 GetClient()->setWebLayer(NULL); 187 GetClient()->setWebLayer(NULL);
190 188
191 DCHECK(main_loop_->BelongsToCurrentThread()); 189 DCHECK(main_loop_->BelongsToCurrentThread());
192 media_log_->AddEvent( 190 media_log_->AddEvent(
193 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 191 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
194 192
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) { 1063 void WebMediaPlayerImpl::StartPipeline(WebKit::WebMediaSource* media_source) {
1066 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); 1064 const CommandLine* cmd_line = CommandLine::ForCurrentProcess();
1067 1065
1068 1066
1069 // Figure out which demuxer to use. 1067 // Figure out which demuxer to use.
1070 if (!media_source) { 1068 if (!media_source) {
1071 DCHECK(!chunk_demuxer_); 1069 DCHECK(!chunk_demuxer_);
1072 DCHECK(data_source_); 1070 DCHECK(data_source_);
1073 1071
1074 demuxer_.reset(new media::FFmpegDemuxer( 1072 demuxer_.reset(new media::FFmpegDemuxer(
1075 media_thread_.message_loop_proxy(), data_source_.get(), 1073 media_loop_, data_source_.get(),
1076 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); 1074 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")));
1077 } else { 1075 } else {
1078 DCHECK(!chunk_demuxer_); 1076 DCHECK(!chunk_demuxer_);
1079 DCHECK(!data_source_); 1077 DCHECK(!data_source_);
1080 1078
1081 scoped_ptr<WebKit::WebMediaSource> ms(media_source); 1079 scoped_ptr<WebKit::WebMediaSource> ms(media_source);
1082 chunk_demuxer_ = new media::ChunkDemuxer( 1080 chunk_demuxer_ = new media::ChunkDemuxer(
1083 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened, 1081 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened,
1084 base::Passed(&ms)), 1082 base::Passed(&ms)),
1085 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), 1083 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""),
(...skipping 11 matching lines...) Expand all
1097 1095
1098 // Figure out if EME is enabled. 1096 // Figure out if EME is enabled.
1099 media::SetDecryptorReadyCB set_decryptor_ready_cb; 1097 media::SetDecryptorReadyCB set_decryptor_ready_cb;
1100 if (decryptor_) { 1098 if (decryptor_) {
1101 set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, 1099 set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB,
1102 base::Unretained(decryptor_.get())); 1100 base::Unretained(decryptor_.get()));
1103 } 1101 }
1104 1102
1105 // Create our audio decoders and renderer. 1103 // Create our audio decoders and renderer.
1106 ScopedVector<media::AudioDecoder> audio_decoders; 1104 ScopedVector<media::AudioDecoder> audio_decoders;
1107 audio_decoders.push_back(new media::FFmpegAudioDecoder( 1105 audio_decoders.push_back(new media::FFmpegAudioDecoder(media_loop_));
1108 media_thread_.message_loop_proxy()));
1109 if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { 1106 if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) {
1110 audio_decoders.push_back(new media::OpusAudioDecoder( 1107 audio_decoders.push_back(new media::OpusAudioDecoder(media_loop_));
1111 media_thread_.message_loop_proxy()));
1112 } 1108 }
1113 1109
1114 scoped_ptr<media::AudioRenderer> audio_renderer( 1110 scoped_ptr<media::AudioRenderer> audio_renderer(
1115 new media::AudioRendererImpl(media_thread_.message_loop_proxy(), 1111 new media::AudioRendererImpl(media_loop_,
1116 audio_source_provider_, 1112 audio_source_provider_,
1117 audio_decoders.Pass(), 1113 audio_decoders.Pass(),
1118 set_decryptor_ready_cb)); 1114 set_decryptor_ready_cb));
1119 filter_collection->SetAudioRenderer(audio_renderer.Pass()); 1115 filter_collection->SetAudioRenderer(audio_renderer.Pass());
1120 1116
1121 // Create our video decoders and renderer. 1117 // Create our video decoders and renderer.
1122 ScopedVector<media::VideoDecoder> video_decoders; 1118 ScopedVector<media::VideoDecoder> video_decoders;
1123 1119
1124 if (gpu_factories_) { 1120 if (gpu_factories_) {
1125 video_decoders.push_back(new media::GpuVideoDecoder( 1121 video_decoders.push_back(new media::GpuVideoDecoder(
1126 media_thread_.message_loop_proxy(), gpu_factories_)); 1122 media_loop_, gpu_factories_));
1127 } 1123 }
1128 1124
1129 // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released 1125 // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released
1130 // (http://crbug.com/174287) . 1126 // (http://crbug.com/174287) .
1131 #if !defined(MEDIA_DISABLE_LIBVPX) 1127 #if !defined(MEDIA_DISABLE_LIBVPX)
1132 if (cmd_line->HasSwitch(switches::kEnableVp9Playback) || 1128 if (cmd_line->HasSwitch(switches::kEnableVp9Playback) ||
1133 cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) { 1129 cmd_line->HasSwitch(switches::kEnableVp8AlphaPlayback)) {
1134 video_decoders.push_back(new media::VpxVideoDecoder( 1130 video_decoders.push_back(new media::VpxVideoDecoder(media_loop_));
1135 media_thread_.message_loop_proxy()));
1136 } 1131 }
1137 #endif // !defined(MEDIA_DISABLE_LIBVPX) 1132 #endif // !defined(MEDIA_DISABLE_LIBVPX)
1138 1133
1139 video_decoders.push_back(new media::FFmpegVideoDecoder( 1134 video_decoders.push_back(new media::FFmpegVideoDecoder(media_loop_));
1140 media_thread_.message_loop_proxy()));
1141 1135
1142 scoped_ptr<media::VideoRenderer> video_renderer( 1136 scoped_ptr<media::VideoRenderer> video_renderer(
1143 new media::VideoRendererBase( 1137 new media::VideoRendererBase(
1144 media_thread_.message_loop_proxy(), 1138 media_loop_,
1145 video_decoders.Pass(), 1139 video_decoders.Pass(),
1146 set_decryptor_ready_cb, 1140 set_decryptor_ready_cb,
1147 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), 1141 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
1148 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), 1142 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque),
1149 true)); 1143 true));
1150 filter_collection->SetVideoRenderer(video_renderer.Pass()); 1144 filter_collection->SetVideoRenderer(video_renderer.Pass());
1151 1145
1152 // ... and we're ready to go! 1146 // ... and we're ready to go!
1153 starting_ = true; 1147 starting_ = true;
1154 pipeline_->Start( 1148 pipeline_->Start(
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 pipeline_->Stop(base::Bind( 1198 pipeline_->Stop(base::Bind(
1205 &base::WaitableEvent::Signal, base::Unretained(&waiter))); 1199 &base::WaitableEvent::Signal, base::Unretained(&waiter)));
1206 waiter.Wait(); 1200 waiter.Wait();
1207 1201
1208 // Let V8 know we are not using extra resources anymore. 1202 // Let V8 know we are not using extra resources anymore.
1209 if (incremented_externally_allocated_memory_) { 1203 if (incremented_externally_allocated_memory_) {
1210 v8::V8::AdjustAmountOfExternalAllocatedMemory(-kPlayerExtraMemory); 1204 v8::V8::AdjustAmountOfExternalAllocatedMemory(-kPlayerExtraMemory);
1211 incremented_externally_allocated_memory_ = false; 1205 incremented_externally_allocated_memory_ = false;
1212 } 1206 }
1213 1207
1214 media_thread_.Stop();
1215
1216 // Release any final references now that everything has stopped. 1208 // Release any final references now that everything has stopped.
1217 pipeline_.reset(); 1209 pipeline_.reset();
1218 demuxer_.reset(); 1210 demuxer_.reset();
1219 data_source_.reset(); 1211 data_source_.reset();
1220 } 1212 }
1221 1213
1222 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() { 1214 WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
1223 DCHECK(main_loop_->BelongsToCurrentThread()); 1215 DCHECK(main_loop_->BelongsToCurrentThread());
1224 DCHECK(client_); 1216 DCHECK(client_);
1225 return client_; 1217 return client_;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 1259
1268 if (pending_repaint_) 1260 if (pending_repaint_)
1269 return; 1261 return;
1270 1262
1271 pending_repaint_ = true; 1263 pending_repaint_ = true;
1272 main_loop_->PostTask(FROM_HERE, base::Bind( 1264 main_loop_->PostTask(FROM_HERE, base::Bind(
1273 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); 1265 &WebMediaPlayerImpl::Repaint, AsWeakPtr()));
1274 } 1266 }
1275 1267
1276 } // namespace webkit_media 1268 } // namespace webkit_media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698