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

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

Issue 783003002: Introduce media::RendererFactory interface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments addressed Created 6 years 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
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_params.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "media/blink/webmediaplayer_impl.h" 5 #include "media/blink/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/callback_helpers.h" 14 #include "base/callback_helpers.h"
15 #include "base/debug/alias.h" 15 #include "base/debug/alias.h"
16 #include "base/debug/crash_logging.h" 16 #include "base/debug/crash_logging.h"
17 #include "base/debug/trace_event.h" 17 #include "base/debug/trace_event.h"
18 #include "base/float_util.h" 18 #include "base/float_util.h"
19 #include "base/message_loop/message_loop_proxy.h" 19 #include "base/message_loop/message_loop_proxy.h"
20 #include "base/metrics/histogram.h" 20 #include "base/metrics/histogram.h"
21 #include "base/single_thread_task_runner.h" 21 #include "base/single_thread_task_runner.h"
22 #include "base/synchronization/waitable_event.h" 22 #include "base/synchronization/waitable_event.h"
23 #include "cc/blink/web_layer_impl.h" 23 #include "cc/blink/web_layer_impl.h"
24 #include "cc/layers/video_layer.h" 24 #include "cc/layers/video_layer.h"
25 #include "gpu/GLES2/gl2extchromium.h" 25 #include "gpu/GLES2/gl2extchromium.h"
26 #include "gpu/command_buffer/common/mailbox_holder.h" 26 #include "gpu/command_buffer/common/mailbox_holder.h"
27 #include "media/audio/null_audio_sink.h" 27 #include "media/audio/null_audio_sink.h"
28 #include "media/base/audio_hardware_config.h"
29 #include "media/base/bind_to_current_loop.h" 28 #include "media/base/bind_to_current_loop.h"
30 #include "media/base/cdm_context.h" 29 #include "media/base/cdm_context.h"
31 #include "media/base/limits.h" 30 #include "media/base/limits.h"
32 #include "media/base/media_log.h" 31 #include "media/base/media_log.h"
33 #include "media/base/pipeline.h" 32 #include "media/base/pipeline.h"
34 #include "media/base/text_renderer.h" 33 #include "media/base/text_renderer.h"
35 #include "media/base/video_frame.h" 34 #include "media/base/video_frame.h"
36 #include "media/blink/buffered_data_source.h" 35 #include "media/blink/buffered_data_source.h"
37 #include "media/blink/encrypted_media_player_support.h" 36 #include "media/blink/encrypted_media_player_support.h"
38 #include "media/blink/texttrack_impl.h" 37 #include "media/blink/texttrack_impl.h"
39 #include "media/blink/webaudiosourceprovider_impl.h" 38 #include "media/blink/webaudiosourceprovider_impl.h"
40 #include "media/blink/webcontentdecryptionmodule_impl.h" 39 #include "media/blink/webcontentdecryptionmodule_impl.h"
41 #include "media/blink/webinbandtexttrack_impl.h" 40 #include "media/blink/webinbandtexttrack_impl.h"
42 #include "media/blink/webmediaplayer_delegate.h" 41 #include "media/blink/webmediaplayer_delegate.h"
43 #include "media/blink/webmediaplayer_params.h" 42 #include "media/blink/webmediaplayer_params.h"
44 #include "media/blink/webmediaplayer_util.h" 43 #include "media/blink/webmediaplayer_util.h"
45 #include "media/blink/webmediasource_impl.h" 44 #include "media/blink/webmediasource_impl.h"
46 #include "media/filters/audio_renderer_impl.h"
47 #include "media/filters/chunk_demuxer.h" 45 #include "media/filters/chunk_demuxer.h"
48 #include "media/filters/ffmpeg_audio_decoder.h"
49 #include "media/filters/ffmpeg_demuxer.h" 46 #include "media/filters/ffmpeg_demuxer.h"
50 #include "media/filters/ffmpeg_video_decoder.h"
51 #include "media/filters/gpu_video_accelerator_factories.h"
52 #include "media/filters/gpu_video_decoder.h"
53 #include "media/filters/opus_audio_decoder.h"
54 #include "media/filters/renderer_impl.h"
55 #include "media/filters/video_renderer_impl.h"
56 #include "media/filters/vpx_video_decoder.h"
57 #include "third_party/WebKit/public/platform/WebMediaSource.h" 47 #include "third_party/WebKit/public/platform/WebMediaSource.h"
58 #include "third_party/WebKit/public/platform/WebRect.h" 48 #include "third_party/WebKit/public/platform/WebRect.h"
59 #include "third_party/WebKit/public/platform/WebSize.h" 49 #include "third_party/WebKit/public/platform/WebSize.h"
60 #include "third_party/WebKit/public/platform/WebString.h" 50 #include "third_party/WebKit/public/platform/WebString.h"
61 #include "third_party/WebKit/public/platform/WebURL.h" 51 #include "third_party/WebKit/public/platform/WebURL.h"
62 #include "third_party/WebKit/public/web/WebLocalFrame.h" 52 #include "third_party/WebKit/public/web/WebLocalFrame.h"
63 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h" 53 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
64 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" 54 #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
65 #include "third_party/WebKit/public/web/WebView.h" 55 #include "third_party/WebKit/public/web/WebView.h"
66 56
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 123
134 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log, 124 static void LogMediaSourceError(const scoped_refptr<MediaLog>& media_log,
135 const std::string& error) { 125 const std::string& error) {
136 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); 126 media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
137 } 127 }
138 128
139 WebMediaPlayerImpl::WebMediaPlayerImpl( 129 WebMediaPlayerImpl::WebMediaPlayerImpl(
140 blink::WebLocalFrame* frame, 130 blink::WebLocalFrame* frame,
141 blink::WebMediaPlayerClient* client, 131 blink::WebMediaPlayerClient* client,
142 base::WeakPtr<WebMediaPlayerDelegate> delegate, 132 base::WeakPtr<WebMediaPlayerDelegate> delegate,
143 scoped_ptr<Renderer> renderer, 133 scoped_ptr<RendererFactory> renderer_factory,
144 scoped_ptr<CdmFactory> cdm_factory, 134 scoped_ptr<CdmFactory> cdm_factory,
145 const WebMediaPlayerParams& params) 135 const WebMediaPlayerParams& params)
146 : frame_(frame), 136 : frame_(frame),
147 network_state_(WebMediaPlayer::NetworkStateEmpty), 137 network_state_(WebMediaPlayer::NetworkStateEmpty),
148 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 138 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
149 preload_(BufferedDataSource::AUTO), 139 preload_(BufferedDataSource::AUTO),
150 main_task_runner_(base::MessageLoopProxy::current()), 140 main_task_runner_(base::MessageLoopProxy::current()),
151 media_task_runner_(params.media_task_runner()), 141 media_task_runner_(params.media_task_runner()),
152 media_log_(params.media_log()), 142 media_log_(params.media_log()),
153 pipeline_(media_task_runner_, media_log_.get()), 143 pipeline_(media_task_runner_, media_log_.get()),
154 load_type_(LoadTypeURL), 144 load_type_(LoadTypeURL),
155 opaque_(false), 145 opaque_(false),
156 paused_(true), 146 paused_(true),
157 seeking_(false), 147 seeking_(false),
158 playback_rate_(0.0f), 148 playback_rate_(0.0f),
159 ended_(false), 149 ended_(false),
160 pending_seek_(false), 150 pending_seek_(false),
161 pending_seek_seconds_(0.0f), 151 pending_seek_seconds_(0.0f),
162 should_notify_time_changed_(false), 152 should_notify_time_changed_(false),
163 client_(client), 153 client_(client),
164 delegate_(delegate), 154 delegate_(delegate),
165 defer_load_cb_(params.defer_load_cb()), 155 defer_load_cb_(params.defer_load_cb()),
166 gpu_factories_(params.gpu_factories()),
167 supports_save_(true), 156 supports_save_(true),
168 chunk_demuxer_(NULL), 157 chunk_demuxer_(NULL),
169 compositor_task_runner_(params.compositor_task_runner()), 158 compositor_task_runner_(params.compositor_task_runner()),
170 compositor_(new VideoFrameCompositor( 159 compositor_(new VideoFrameCompositor(
171 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), 160 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
172 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), 161 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
173 text_track_index_(0), 162 text_track_index_(0),
174 encrypted_media_support_( 163 encrypted_media_support_(
175 cdm_factory.Pass(), 164 cdm_factory.Pass(),
176 client, 165 client,
177 base::Bind(&WebMediaPlayerImpl::SetCdm, AsWeakPtr())), 166 base::Bind(&WebMediaPlayerImpl::SetCdm, AsWeakPtr())),
178 audio_hardware_config_(params.audio_hardware_config()), 167 renderer_factory_(renderer_factory.Pass()) {
179 renderer_(renderer.Pass()) {
180 // Threaded compositing isn't enabled universally yet. 168 // Threaded compositing isn't enabled universally yet.
181 if (!compositor_task_runner_.get()) 169 if (!compositor_task_runner_.get())
182 compositor_task_runner_ = base::MessageLoopProxy::current(); 170 compositor_task_runner_ = base::MessageLoopProxy::current();
183 171
184 media_log_->AddEvent( 172 media_log_->AddEvent(
185 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); 173 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED));
186 174
187 if (params.initial_cdm()) { 175 if (params.initial_cdm()) {
188 SetCdm( 176 SetCdm(
189 ToWebContentDecryptionModuleImpl(params.initial_cdm())->GetCdmContext(), 177 ToWebContentDecryptionModuleImpl(params.initial_cdm())->GetCdmContext(),
190 base::Bind(&IgnoreCdmAttached)); 178 base::Bind(&IgnoreCdmAttached));
191 } 179 }
192 180
193 // TODO(xhwang): When we use an external Renderer, many methods won't work, 181 // TODO(xhwang): When we use an external Renderer, many methods won't work,
194 // e.g. GetCurrentFrameFromCompositor(). Fix this in a future CL. 182 // e.g. GetCurrentFrameFromCompositor(). See http://crbug.com/434861
195 if (renderer_)
196 return;
197
198 // |gpu_factories_| requires that its entry points be called on its
199 // |GetTaskRunner()|. Since |pipeline_| will own decoders created from the
200 // factories, require that their message loops are identical.
201 DCHECK(!gpu_factories_.get() ||
202 (gpu_factories_->GetTaskRunner() == media_task_runner_.get()));
203 183
204 // Use the null sink if no sink was provided. 184 // Use the null sink if no sink was provided.
205 audio_source_provider_ = new WebAudioSourceProviderImpl( 185 audio_source_provider_ = new WebAudioSourceProviderImpl(
206 params.audio_renderer_sink().get() 186 params.audio_renderer_sink().get()
207 ? params.audio_renderer_sink() 187 ? params.audio_renderer_sink()
208 : new NullAudioSink(media_task_runner_)); 188 : new NullAudioSink(media_task_runner_));
209 } 189 }
210 190
211 WebMediaPlayerImpl::~WebMediaPlayerImpl() { 191 WebMediaPlayerImpl::~WebMediaPlayerImpl() {
212 client_->setWebLayer(NULL); 192 client_->setWebLayer(NULL);
213 193
214 DCHECK(main_task_runner_->BelongsToCurrentThread()); 194 DCHECK(main_task_runner_->BelongsToCurrentThread());
215 media_log_->AddEvent( 195 media_log_->AddEvent(
216 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); 196 media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
217 197
218 if (delegate_) 198 if (delegate_)
219 delegate_->PlayerGone(this); 199 delegate_->PlayerGone(this);
220 200
221 // Abort any pending IO so stopping the pipeline doesn't get blocked. 201 // Abort any pending IO so stopping the pipeline doesn't get blocked.
222 if (data_source_) 202 if (data_source_)
223 data_source_->Abort(); 203 data_source_->Abort();
224 if (chunk_demuxer_) { 204 if (chunk_demuxer_) {
225 chunk_demuxer_->Shutdown(); 205 chunk_demuxer_->Shutdown();
226 chunk_demuxer_ = NULL; 206 chunk_demuxer_ = NULL;
227 } 207 }
228 208
229 gpu_factories_ = NULL; 209 renderer_factory_.reset();
230 210
231 // Make sure to kill the pipeline so there's no more media threads running. 211 // Make sure to kill the pipeline so there's no more media threads running.
232 // Note: stopping the pipeline might block for a long time. 212 // Note: stopping the pipeline might block for a long time.
233 base::WaitableEvent waiter(false, false); 213 base::WaitableEvent waiter(false, false);
234 pipeline_.Stop( 214 pipeline_.Stop(
235 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); 215 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter)));
236 waiter.Wait(); 216 waiter.Wait();
237 217
238 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); 218 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_);
239 } 219 }
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading) 861 if (!is_downloading && network_state_ == WebMediaPlayer::NetworkStateLoading)
882 SetNetworkState(WebMediaPlayer::NetworkStateIdle); 862 SetNetworkState(WebMediaPlayer::NetworkStateIdle);
883 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle) 863 else if (is_downloading && network_state_ == WebMediaPlayer::NetworkStateIdle)
884 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 864 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
885 media_log_->AddEvent( 865 media_log_->AddEvent(
886 media_log_->CreateBooleanEvent( 866 media_log_->CreateBooleanEvent(
887 MediaLogEvent::NETWORK_ACTIVITY_SET, 867 MediaLogEvent::NETWORK_ACTIVITY_SET,
888 "is_downloading_data", is_downloading)); 868 "is_downloading_data", is_downloading));
889 } 869 }
890 870
891 // TODO(xhwang): Move this to a factory class so that we can create different
892 // renderers.
893 scoped_ptr<Renderer> WebMediaPlayerImpl::CreateRenderer() {
894 // Create our audio decoders and renderer.
895 ScopedVector<AudioDecoder> audio_decoders;
896
897 audio_decoders.push_back(new FFmpegAudioDecoder(
898 media_task_runner_, base::Bind(&LogMediaSourceError, media_log_)));
899 audio_decoders.push_back(new OpusAudioDecoder(media_task_runner_));
900
901 scoped_ptr<AudioRenderer> audio_renderer(new AudioRendererImpl(
902 media_task_runner_, audio_source_provider_.get(), audio_decoders.Pass(),
903 audio_hardware_config_, media_log_));
904
905 // Create our video decoders and renderer.
906 ScopedVector<VideoDecoder> video_decoders;
907
908 if (gpu_factories_.get())
909 video_decoders.push_back(new GpuVideoDecoder(gpu_factories_));
910
911 #if !defined(MEDIA_DISABLE_LIBVPX)
912 video_decoders.push_back(new VpxVideoDecoder(media_task_runner_));
913 #endif // !defined(MEDIA_DISABLE_LIBVPX)
914
915 video_decoders.push_back(new FFmpegVideoDecoder(media_task_runner_));
916
917 scoped_ptr<VideoRenderer> video_renderer(new VideoRendererImpl(
918 media_task_runner_, video_decoders.Pass(), true, media_log_));
919
920 // Create renderer.
921 return scoped_ptr<Renderer>(new RendererImpl(
922 media_task_runner_, audio_renderer.Pass(), video_renderer.Pass()));
923 }
924
925 void WebMediaPlayerImpl::StartPipeline() { 871 void WebMediaPlayerImpl::StartPipeline() {
926 DCHECK(main_task_runner_->BelongsToCurrentThread()); 872 DCHECK(main_task_runner_->BelongsToCurrentThread());
927 873
928 // Keep track if this is a MSE or non-MSE playback. 874 // Keep track if this is a MSE or non-MSE playback.
929 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback", 875 UMA_HISTOGRAM_BOOLEAN("Media.MSE.Playback",
930 (load_type_ == LoadTypeMediaSource)); 876 (load_type_ == LoadTypeMediaSource));
931 877
932 LogCB mse_log_cb; 878 LogCB mse_log_cb;
933 Demuxer::NeedKeyCB need_key_cb = 879 Demuxer::NeedKeyCB need_key_cb =
934 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey); 880 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNeedKey);
(...skipping 18 matching lines...) Expand all
953 need_key_cb, 899 need_key_cb,
954 mse_log_cb, 900 mse_log_cb,
955 media_log_, 901 media_log_,
956 true); 902 true);
957 demuxer_.reset(chunk_demuxer_); 903 demuxer_.reset(chunk_demuxer_);
958 } 904 }
959 905
960 // ... and we're ready to go! 906 // ... and we're ready to go!
961 seeking_ = true; 907 seeking_ = true;
962 908
963 if (!renderer_)
964 renderer_ = CreateRenderer();
965
966 pipeline_.Start( 909 pipeline_.Start(
967 demuxer_.get(), 910 demuxer_.get(),
968 renderer_.Pass(), 911 renderer_factory_->CreateRenderer(media_task_runner_,
912 audio_source_provider_.get()),
969 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded), 913 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded),
970 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError), 914 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError),
971 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false), 915 BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::OnPipelineSeeked, false),
972 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata), 916 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineMetadata),
973 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged), 917 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingStateChanged),
974 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)), 918 base::Bind(&WebMediaPlayerImpl::FrameReady, base::Unretained(this)),
975 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged), 919 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChanged),
976 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack)); 920 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnAddTextTrack));
977 } 921 }
978 922
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 compositor_task_runner_->PostTask(FROM_HERE, 1016 compositor_task_runner_->PostTask(FROM_HERE,
1073 base::Bind(&GetCurrentFrameAndSignal, 1017 base::Bind(&GetCurrentFrameAndSignal,
1074 base::Unretained(compositor_), 1018 base::Unretained(compositor_),
1075 &video_frame, 1019 &video_frame,
1076 &event)); 1020 &event));
1077 event.Wait(); 1021 event.Wait();
1078 return video_frame; 1022 return video_frame;
1079 } 1023 }
1080 1024
1081 } // namespace media 1025 } // namespace media
OLDNEW
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | media/blink/webmediaplayer_params.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698