OLD | NEW |
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> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
| 14 #include "base/command_line.h" |
14 #include "base/message_loop_proxy.h" | 15 #include "base/message_loop_proxy.h" |
15 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
16 #include "base/string_number_conversions.h" | 17 #include "base/string_number_conversions.h" |
17 #include "base/synchronization/waitable_event.h" | 18 #include "base/synchronization/waitable_event.h" |
18 #include "gpu/GLES2/gl2extchromium.h" | 19 #include "gpu/GLES2/gl2extchromium.h" |
19 #include "media/audio/null_audio_sink.h" | 20 #include "media/audio/null_audio_sink.h" |
20 #include "media/base/bind_to_loop.h" | 21 #include "media/base/bind_to_loop.h" |
21 #include "media/base/filter_collection.h" | 22 #include "media/base/filter_collection.h" |
22 #include "media/base/limits.h" | 23 #include "media/base/limits.h" |
23 #include "media/base/media_log.h" | 24 #include "media/base/media_log.h" |
| 25 #include "media/base/media_switches.h" |
24 #include "media/base/pipeline.h" | 26 #include "media/base/pipeline.h" |
25 #include "media/base/video_frame.h" | 27 #include "media/base/video_frame.h" |
26 #include "media/filters/audio_renderer_impl.h" | 28 #include "media/filters/audio_renderer_impl.h" |
27 #include "media/filters/chunk_demuxer.h" | 29 #include "media/filters/chunk_demuxer.h" |
| 30 #include "media/filters/ffmpeg_audio_decoder.h" |
| 31 #include "media/filters/ffmpeg_demuxer.h" |
| 32 #include "media/filters/ffmpeg_video_decoder.h" |
| 33 #include "media/filters/opus_audio_decoder.h" |
28 #include "media/filters/video_renderer_base.h" | 34 #include "media/filters/video_renderer_base.h" |
| 35 #include "media/filters/vpx_video_decoder.h" |
29 #include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" | 36 #include "third_party/WebKit/Source/Platform/chromium/public/WebRect.h" |
30 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" | 37 #include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" |
31 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" | 38 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h" |
32 #include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" | 39 #include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" |
33 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSource.h" | 40 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaSource.h" |
34 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" | 41 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRuntimeFeatures.h" |
35 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" | 42 #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
36 #include "v8/include/v8.h" | 43 #include "v8/include/v8.h" |
37 #include "webkit/media/buffered_data_source.h" | 44 #include "webkit/media/buffered_data_source.h" |
38 #include "webkit/media/filter_helpers.h" | |
39 #include "webkit/media/webaudiosourceprovider_impl.h" | 45 #include "webkit/media/webaudiosourceprovider_impl.h" |
40 #include "webkit/media/webmediaplayer_delegate.h" | 46 #include "webkit/media/webmediaplayer_delegate.h" |
41 #include "webkit/media/webmediaplayer_params.h" | 47 #include "webkit/media/webmediaplayer_params.h" |
42 #include "webkit/media/webmediaplayer_util.h" | 48 #include "webkit/media/webmediaplayer_util.h" |
43 #include "webkit/media/webmediasourceclient_impl.h" | 49 #include "webkit/media/webmediasourceclient_impl.h" |
44 #include "webkit/media/webvideoframe_impl.h" | 50 #include "webkit/media/webvideoframe_impl.h" |
45 #include "webkit/plugins/ppapi/ppapi_webplugin_impl.h" | 51 #include "webkit/plugins/ppapi/ppapi_webplugin_impl.h" |
46 | 52 |
47 using WebKit::WebCanvas; | 53 using WebKit::WebCanvas; |
48 using WebKit::WebMediaPlayer; | 54 using WebKit::WebMediaPlayer; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 | 129 |
124 WebMediaPlayerImpl::WebMediaPlayerImpl( | 130 WebMediaPlayerImpl::WebMediaPlayerImpl( |
125 WebKit::WebFrame* frame, | 131 WebKit::WebFrame* frame, |
126 WebKit::WebMediaPlayerClient* client, | 132 WebKit::WebMediaPlayerClient* client, |
127 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 133 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
128 const WebMediaPlayerParams& params) | 134 const WebMediaPlayerParams& params) |
129 : frame_(frame), | 135 : frame_(frame), |
130 network_state_(WebMediaPlayer::NetworkStateEmpty), | 136 network_state_(WebMediaPlayer::NetworkStateEmpty), |
131 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 137 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
132 main_loop_(base::MessageLoopProxy::current()), | 138 main_loop_(base::MessageLoopProxy::current()), |
133 filter_collection_(new media::FilterCollection()), | |
134 media_thread_("MediaPipeline"), | 139 media_thread_("MediaPipeline"), |
135 paused_(true), | 140 paused_(true), |
136 seeking_(false), | 141 seeking_(false), |
137 playback_rate_(0.0f), | 142 playback_rate_(0.0f), |
138 pending_seek_(false), | 143 pending_seek_(false), |
139 pending_seek_seconds_(0.0f), | 144 pending_seek_seconds_(0.0f), |
140 client_(client), | 145 client_(client), |
141 delegate_(delegate), | 146 delegate_(delegate), |
142 media_log_(params.media_log()), | 147 media_log_(params.media_log()), |
143 accelerated_compositing_reported_(false), | 148 accelerated_compositing_reported_(false), |
144 incremented_externally_allocated_memory_(false), | 149 incremented_externally_allocated_memory_(false), |
| 150 gpu_factories_(params.gpu_factories()), |
145 is_local_source_(false), | 151 is_local_source_(false), |
146 supports_save_(true), | 152 supports_save_(true), |
147 starting_(false), | 153 starting_(false), |
148 pending_repaint_(false) { | 154 pending_repaint_(false) { |
149 media_log_->AddEvent( | 155 media_log_->AddEvent( |
150 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 156 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
151 | 157 |
152 CHECK(media_thread_.Start()); | 158 CHECK(media_thread_.Start()); |
153 pipeline_ = new media::Pipeline( | 159 pipeline_ = new media::Pipeline( |
154 media_thread_.message_loop_proxy(), media_log_); | 160 media_thread_.message_loop_proxy(), media_log_); |
155 | 161 |
156 // Let V8 know we started new thread if we did not do it yet. | 162 // Let V8 know we started new thread if we did not do it yet. |
157 // Made separate task to avoid deletion of player currently being created. | 163 // Made separate task to avoid deletion of player currently being created. |
158 // Also, delaying GC until after player starts gets rid of starting lag -- | 164 // Also, delaying GC until after player starts gets rid of starting lag -- |
159 // collection happens in parallel with playing. | 165 // collection happens in parallel with playing. |
160 // | 166 // |
161 // TODO(enal): remove when we get rid of per-audio-stream thread. | 167 // TODO(enal): remove when we get rid of per-audio-stream thread. |
162 main_loop_->PostTask( | 168 main_loop_->PostTask( |
163 FROM_HERE, | 169 FROM_HERE, |
164 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, | 170 base::Bind(&WebMediaPlayerImpl::IncrementExternallyAllocatedMemory, |
165 AsWeakPtr())); | 171 AsWeakPtr())); |
166 | 172 |
167 // Also we want to be notified of |main_loop_| destruction. | 173 // Also we want to be notified of |main_loop_| destruction. |
168 MessageLoop::current()->AddDestructionObserver(this); | 174 MessageLoop::current()->AddDestructionObserver(this); |
169 | 175 |
170 media::SetDecryptorReadyCB set_decryptor_ready_cb; | |
171 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) { | 176 if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) { |
172 decryptor_.reset(new ProxyDecryptor( | 177 decryptor_.reset(new ProxyDecryptor( |
173 client, | 178 client, |
174 frame, | 179 frame, |
175 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyAdded), | 180 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyAdded), |
176 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError), | 181 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyError), |
177 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage), | 182 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnKeyMessage), |
178 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey))); | 183 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey))); |
179 set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, | |
180 base::Unretained(decryptor_.get())); | |
181 } | 184 } |
182 | 185 |
183 // Create the GPU video decoder if factories were provided. | 186 // Use the null sink if no sink was provided. |
184 if (params.gpu_factories()) { | |
185 filter_collection_->GetVideoDecoders()->push_back( | |
186 new media::GpuVideoDecoder( | |
187 media_thread_.message_loop_proxy(), | |
188 params.gpu_factories())); | |
189 } | |
190 | |
191 // Create default video renderer. | |
192 scoped_ptr<media::VideoRenderer> video_renderer( | |
193 new media::VideoRendererBase( | |
194 media_thread_.message_loop_proxy(), | |
195 set_decryptor_ready_cb, | |
196 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), | |
197 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), | |
198 true)); | |
199 filter_collection_->SetVideoRenderer(video_renderer.Pass()); | |
200 | |
201 // Create default audio renderer using the null sink if no sink was provided. | |
202 audio_source_provider_ = new WebAudioSourceProviderImpl( | 187 audio_source_provider_ = new WebAudioSourceProviderImpl( |
203 params.audio_renderer_sink() ? params.audio_renderer_sink() : | 188 params.audio_renderer_sink() ? params.audio_renderer_sink() : |
204 new media::NullAudioSink(media_thread_.message_loop_proxy())); | 189 new media::NullAudioSink(media_thread_.message_loop_proxy())); |
205 | |
206 ScopedVector<media::AudioDecoder> audio_decoders; | |
207 AddDefaultAudioDecoders(media_thread_.message_loop_proxy(), &audio_decoders); | |
208 | |
209 scoped_ptr<media::AudioRenderer> audio_renderer( | |
210 new media::AudioRendererImpl( | |
211 media_thread_.message_loop_proxy(), | |
212 audio_source_provider_, | |
213 audio_decoders.Pass(), | |
214 set_decryptor_ready_cb)); | |
215 filter_collection_->SetAudioRenderer(audio_renderer.Pass()); | |
216 } | 190 } |
217 | 191 |
218 WebMediaPlayerImpl::~WebMediaPlayerImpl() { | 192 WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
219 DCHECK(main_loop_->BelongsToCurrentThread()); | 193 DCHECK(main_loop_->BelongsToCurrentThread()); |
220 Destroy(); | 194 Destroy(); |
221 media_log_->AddEvent( | 195 media_log_->AddEvent( |
222 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); | 196 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); |
223 | 197 |
224 if (delegate_) | 198 if (delegate_) |
225 delegate_->PlayerGone(this); | 199 delegate_->PlayerGone(this); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 data_source_ = new BufferedDataSource( | 248 data_source_ = new BufferedDataSource( |
275 main_loop_, frame_, media_log_, base::Bind( | 249 main_loop_, frame_, media_log_, base::Bind( |
276 &WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr())); | 250 &WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr())); |
277 data_source_->Initialize( | 251 data_source_->Initialize( |
278 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), | 252 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode), |
279 base::Bind( | 253 base::Bind( |
280 &WebMediaPlayerImpl::DataSourceInitialized, | 254 &WebMediaPlayerImpl::DataSourceInitialized, |
281 AsWeakPtr(), gurl)); | 255 AsWeakPtr(), gurl)); |
282 | 256 |
283 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); | 257 is_local_source_ = !gurl.SchemeIs("http") && !gurl.SchemeIs("https"); |
284 | |
285 BuildDefaultCollection( | |
286 data_source_, | |
287 media_thread_.message_loop_proxy(), | |
288 filter_collection_.get(), | |
289 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", "")); | |
290 } | 258 } |
291 | 259 |
292 void WebMediaPlayerImpl::load(const WebKit::WebURL& url, | 260 void WebMediaPlayerImpl::load(const WebKit::WebURL& url, |
293 WebKit::WebMediaSource* media_source, | 261 WebKit::WebMediaSource* media_source, |
294 CORSMode cors_mode) { | 262 CORSMode cors_mode) { |
295 scoped_ptr<WebKit::WebMediaSource> ms(media_source); | 263 scoped_ptr<WebKit::WebMediaSource> ms(media_source); |
296 LoadSetup(url); | 264 LoadSetup(url); |
297 | 265 |
298 // Media source pipelines can start immediately. | 266 // Media source pipelines can start immediately. |
299 chunk_demuxer_ = new media::ChunkDemuxer( | 267 chunk_demuxer_ = new media::ChunkDemuxer( |
300 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened, | 268 BIND_TO_RENDER_LOOP_1(&WebMediaPlayerImpl::OnDemuxerOpened, |
301 base::Passed(&ms)), | 269 base::Passed(&ms)), |
302 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), | 270 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""), |
303 base::Bind(&LogMediaSourceError, media_log_)); | 271 base::Bind(&LogMediaSourceError, media_log_)); |
304 | 272 |
305 BuildMediaSourceCollection(chunk_demuxer_, | |
306 media_thread_.message_loop_proxy(), | |
307 filter_collection_.get()); | |
308 supports_save_ = false; | 273 supports_save_ = false; |
309 StartPipeline(); | 274 StartPipeline(); |
310 } | 275 } |
311 | 276 |
312 void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) { | 277 void WebMediaPlayerImpl::LoadSetup(const WebKit::WebURL& url) { |
313 GURL gurl(url); | 278 GURL gurl(url); |
314 UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(gurl), kMaxURLScheme); | 279 UMA_HISTOGRAM_ENUMERATION("Media.URLScheme", URLScheme(gurl), kMaxURLScheme); |
315 | 280 |
316 // Handle any volume/preload changes that occurred before load(). | 281 // Handle any volume/preload changes that occurred before load(). |
317 setVolume(GetClient()->volume()); | 282 setVolume(GetClient()->volume()); |
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 1057 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
1093 media_log_->AddEvent( | 1058 media_log_->AddEvent( |
1094 media_log_->CreateBooleanEvent( | 1059 media_log_->CreateBooleanEvent( |
1095 media::MediaLogEvent::NETWORK_ACTIVITY_SET, | 1060 media::MediaLogEvent::NETWORK_ACTIVITY_SET, |
1096 "is_downloading_data", is_downloading)); | 1061 "is_downloading_data", is_downloading)); |
1097 } | 1062 } |
1098 | 1063 |
1099 void WebMediaPlayerImpl::StartPipeline() { | 1064 void WebMediaPlayerImpl::StartPipeline() { |
1100 starting_ = true; | 1065 starting_ = true; |
1101 pipeline_->Start( | 1066 pipeline_->Start( |
1102 filter_collection_.Pass(), | 1067 BuildFilterCollection(), |
1103 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), | 1068 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), |
1104 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), | 1069 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), |
1105 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), | 1070 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek), |
1106 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), | 1071 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState), |
1107 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); | 1072 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange)); |
1108 } | 1073 } |
1109 | 1074 |
1110 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { | 1075 void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) { |
1111 DCHECK(main_loop_->BelongsToCurrentThread()); | 1076 DCHECK(main_loop_->BelongsToCurrentThread()); |
1112 DVLOG(1) << "SetNetworkState: " << state; | 1077 DVLOG(1) << "SetNetworkState: " << state; |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 current_frame_ = frame; | 1169 current_frame_ = frame; |
1205 | 1170 |
1206 if (pending_repaint_) | 1171 if (pending_repaint_) |
1207 return; | 1172 return; |
1208 | 1173 |
1209 pending_repaint_ = true; | 1174 pending_repaint_ = true; |
1210 main_loop_->PostTask(FROM_HERE, base::Bind( | 1175 main_loop_->PostTask(FROM_HERE, base::Bind( |
1211 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); | 1176 &WebMediaPlayerImpl::Repaint, AsWeakPtr())); |
1212 } | 1177 } |
1213 | 1178 |
| 1179 scoped_ptr<media::FilterCollection> |
| 1180 WebMediaPlayerImpl::BuildFilterCollection() { |
| 1181 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
| 1182 |
| 1183 scoped_ptr<media::FilterCollection> filter_collection( |
| 1184 new media::FilterCollection()); |
| 1185 |
| 1186 // Figure out which demuxer to use. |
| 1187 if (data_source_) { |
| 1188 DCHECK(!chunk_demuxer_); |
| 1189 filter_collection->SetDemuxer(new media::FFmpegDemuxer( |
| 1190 media_thread_.message_loop_proxy(), data_source_, |
| 1191 BIND_TO_RENDER_LOOP_2(&WebMediaPlayerImpl::OnNeedKey, "", ""))); |
| 1192 } else { |
| 1193 DCHECK(chunk_demuxer_); |
| 1194 filter_collection->SetDemuxer(chunk_demuxer_); |
| 1195 |
| 1196 // Disable GpuVideoDecoder creation until it supports codec config changes. |
| 1197 // TODO(acolwell): Remove this once http://crbug.com/151045 is fixed. |
| 1198 gpu_factories_ = NULL; |
| 1199 } |
| 1200 |
| 1201 // Figure out if EME is enabled. |
| 1202 media::SetDecryptorReadyCB set_decryptor_ready_cb; |
| 1203 if (decryptor_) { |
| 1204 set_decryptor_ready_cb = base::Bind(&ProxyDecryptor::SetDecryptorReadyCB, |
| 1205 base::Unretained(decryptor_.get())); |
| 1206 } |
| 1207 |
| 1208 // Create our audio decoders and renderer. |
| 1209 ScopedVector<media::AudioDecoder> audio_decoders; |
| 1210 audio_decoders.push_back(new media::FFmpegAudioDecoder( |
| 1211 media_thread_.message_loop_proxy())); |
| 1212 if (cmd_line->HasSwitch(switches::kEnableOpusPlayback)) { |
| 1213 audio_decoders.push_back(new media::OpusAudioDecoder( |
| 1214 media_thread_.message_loop_proxy())); |
| 1215 } |
| 1216 |
| 1217 scoped_ptr<media::AudioRenderer> audio_renderer( |
| 1218 new media::AudioRendererImpl(media_thread_.message_loop_proxy(), |
| 1219 audio_source_provider_, |
| 1220 audio_decoders.Pass(), |
| 1221 set_decryptor_ready_cb)); |
| 1222 filter_collection->SetAudioRenderer(audio_renderer.Pass()); |
| 1223 |
| 1224 // Create our video decoders and renderer. |
| 1225 ScopedVector<media::VideoDecoder> video_decoders; |
| 1226 |
| 1227 if (gpu_factories_) { |
| 1228 video_decoders.push_back(new media::GpuVideoDecoder( |
| 1229 media_thread_.message_loop_proxy(), gpu_factories_)); |
| 1230 } |
| 1231 |
| 1232 video_decoders.push_back(new media::FFmpegVideoDecoder( |
| 1233 media_thread_.message_loop_proxy())); |
| 1234 |
| 1235 // TODO(phajdan.jr): Remove ifdefs when libvpx with vp9 support is released |
| 1236 // (http://crbug.com/174287) . |
| 1237 #if !defined(MEDIA_DISABLE_LIBVPX) |
| 1238 if (cmd_line->HasSwitch(switches::kEnableVp9Playback)) { |
| 1239 video_decoders.push_back(new media::VpxVideoDecoder( |
| 1240 media_thread_.message_loop_proxy())); |
| 1241 } |
| 1242 #endif // !defined(MEDIA_DISABLE_LIBVPX) |
| 1243 |
| 1244 scoped_ptr<media::VideoRenderer> video_renderer( |
| 1245 new media::VideoRendererBase( |
| 1246 media_thread_.message_loop_proxy(), |
| 1247 video_decoders.Pass(), |
| 1248 set_decryptor_ready_cb, |
| 1249 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), |
| 1250 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::SetOpaque), |
| 1251 true)); |
| 1252 filter_collection->SetVideoRenderer(video_renderer.Pass()); |
| 1253 |
| 1254 return filter_collection.Pass(); |
| 1255 } |
| 1256 |
1214 } // namespace webkit_media | 1257 } // namespace webkit_media |
OLD | NEW |