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

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

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

Powered by Google App Engine
This is Rietveld 408576698