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

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

Issue 1399603003: Tie multibuffers to URLs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_cache
Patch Set: added MEDIA_BLINK_EXPORT Created 5 years, 2 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 "media/blink/webmediaplayer_impl.h" 5 #include "media/blink/webmediaplayer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback.h" 12 #include "base/callback.h"
13 #include "base/callback_helpers.h" 13 #include "base/callback_helpers.h"
14 #include "base/command_line.h"
14 #include "base/debug/alias.h" 15 #include "base/debug/alias.h"
15 #include "base/debug/crash_logging.h" 16 #include "base/debug/crash_logging.h"
16 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
17 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
18 #include "base/synchronization/waitable_event.h" 19 #include "base/synchronization/waitable_event.h"
19 #include "base/thread_task_runner_handle.h" 20 #include "base/thread_task_runner_handle.h"
20 #include "base/trace_event/trace_event.h" 21 #include "base/trace_event/trace_event.h"
21 #include "cc/blink/web_layer_impl.h" 22 #include "cc/blink/web_layer_impl.h"
22 #include "cc/layers/video_layer.h" 23 #include "cc/layers/video_layer.h"
23 #include "gpu/blink/webgraphicscontext3d_impl.h" 24 #include "gpu/blink/webgraphicscontext3d_impl.h"
24 #include "media/audio/null_audio_sink.h" 25 #include "media/audio/null_audio_sink.h"
25 #include "media/base/bind_to_current_loop.h" 26 #include "media/base/bind_to_current_loop.h"
26 #include "media/base/cdm_context.h" 27 #include "media/base/cdm_context.h"
27 #include "media/base/limits.h" 28 #include "media/base/limits.h"
28 #include "media/base/media_log.h" 29 #include "media/base/media_log.h"
30 #include "media/base/media_switches.h"
29 #include "media/base/text_renderer.h" 31 #include "media/base/text_renderer.h"
30 #include "media/base/timestamp_constants.h" 32 #include "media/base/timestamp_constants.h"
31 #include "media/base/video_frame.h" 33 #include "media/base/video_frame.h"
32 #include "media/blink/texttrack_impl.h" 34 #include "media/blink/texttrack_impl.h"
33 #include "media/blink/webaudiosourceprovider_impl.h" 35 #include "media/blink/webaudiosourceprovider_impl.h"
34 #include "media/blink/webcontentdecryptionmodule_impl.h" 36 #include "media/blink/webcontentdecryptionmodule_impl.h"
35 #include "media/blink/webinbandtexttrack_impl.h" 37 #include "media/blink/webinbandtexttrack_impl.h"
36 #include "media/blink/webmediaplayer_delegate.h" 38 #include "media/blink/webmediaplayer_delegate.h"
37 #include "media/blink/webmediaplayer_util.h" 39 #include "media/blink/webmediaplayer_util.h"
38 #include "media/blink/webmediasource_impl.h" 40 #include "media/blink/webmediasource_impl.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 // the norms, we think 1/16x to 16x is a safe and useful range for now. 81 // the norms, we think 1/16x to 16x is a safe and useful range for now.
80 const double kMinRate = 0.0625; 82 const double kMinRate = 0.0625;
81 const double kMaxRate = 16.0; 83 const double kMaxRate = 16.0;
82 84
83 } // namespace 85 } // namespace
84 86
85 namespace media { 87 namespace media {
86 88
87 class BufferedDataSourceHostImpl; 89 class BufferedDataSourceHostImpl;
88 90
89 #define STATIC_ASSERT_MATCHING_ENUM(name) \ 91 #define STATIC_ASSERT_MATCHING_ENUM(name) \
90 static_assert(static_cast<int>(WebMediaPlayer::CORSMode ## name) == \ 92 static_assert(static_cast<int>(WebMediaPlayer::CORSMode##name) == \
91 static_cast<int>(BufferedResourceLoader::k ## name), \ 93 static_cast<int>(UrlData::k##name), \
92 "mismatching enum values: " #name) 94 "mismatching enum values: " #name)
93 STATIC_ASSERT_MATCHING_ENUM(Unspecified); 95 STATIC_ASSERT_MATCHING_ENUM(Unspecified);
94 STATIC_ASSERT_MATCHING_ENUM(Anonymous); 96 STATIC_ASSERT_MATCHING_ENUM(Anonymous);
95 STATIC_ASSERT_MATCHING_ENUM(UseCredentials); 97 STATIC_ASSERT_MATCHING_ENUM(UseCredentials);
96 #undef STATIC_ASSERT_MATCHING_ENUM 98 #undef STATIC_ASSERT_MATCHING_ENUM
97 99
98 #define BIND_TO_RENDER_LOOP(function) \ 100 #define BIND_TO_RENDER_LOOP(function) \
99 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ 101 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \
100 BindToCurrentLoop(base::Bind(function, AsWeakPtr()))) 102 BindToCurrentLoop(base::Bind(function, AsWeakPtr())))
101 103
102 #define BIND_TO_RENDER_LOOP1(function, arg1) \ 104 #define BIND_TO_RENDER_LOOP1(function, arg1) \
103 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \ 105 (DCHECK(main_task_runner_->BelongsToCurrentThread()), \
104 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1))) 106 BindToCurrentLoop(base::Bind(function, AsWeakPtr(), arg1)))
105 107
106 WebMediaPlayerImpl::WebMediaPlayerImpl( 108 WebMediaPlayerImpl::WebMediaPlayerImpl(
107 blink::WebLocalFrame* frame, 109 blink::WebLocalFrame* frame,
108 blink::WebMediaPlayerClient* client, 110 blink::WebMediaPlayerClient* client,
109 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client, 111 blink::WebMediaPlayerEncryptedMediaClient* encrypted_client,
110 base::WeakPtr<WebMediaPlayerDelegate> delegate, 112 base::WeakPtr<WebMediaPlayerDelegate> delegate,
111 scoped_ptr<RendererFactory> renderer_factory, 113 scoped_ptr<RendererFactory> renderer_factory,
112 CdmFactory* cdm_factory, 114 CdmFactory* cdm_factory,
115 linked_ptr<ResourceMultiBuffer> resource_multibuffer,
113 const WebMediaPlayerParams& params) 116 const WebMediaPlayerParams& params)
114 : frame_(frame), 117 : frame_(frame),
115 network_state_(WebMediaPlayer::NetworkStateEmpty), 118 network_state_(WebMediaPlayer::NetworkStateEmpty),
116 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 119 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
117 preload_(BufferedDataSource::AUTO), 120 preload_(BufferedDataSource::AUTO),
118 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), 121 main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
119 media_task_runner_(params.media_task_runner()), 122 media_task_runner_(params.media_task_runner()),
120 worker_task_runner_(params.worker_task_runner()), 123 worker_task_runner_(params.worker_task_runner()),
121 media_log_(params.media_log()), 124 media_log_(params.media_log()),
122 pipeline_(media_task_runner_, media_log_.get()), 125 pipeline_(media_task_runner_, media_log_.get()),
123 load_type_(LoadTypeURL), 126 load_type_(LoadTypeURL),
124 opaque_(false), 127 opaque_(false),
125 playback_rate_(0.0), 128 playback_rate_(0.0),
126 paused_(true), 129 paused_(true),
127 seeking_(false), 130 seeking_(false),
128 ended_(false), 131 ended_(false),
129 pending_seek_(false), 132 pending_seek_(false),
130 should_notify_time_changed_(false), 133 should_notify_time_changed_(false),
131 client_(client), 134 client_(client),
132 encrypted_client_(encrypted_client), 135 encrypted_client_(encrypted_client),
133 delegate_(delegate), 136 delegate_(delegate),
134 defer_load_cb_(params.defer_load_cb()), 137 defer_load_cb_(params.defer_load_cb()),
135 context_3d_cb_(params.context_3d_cb()), 138 context_3d_cb_(params.context_3d_cb()),
136 supports_save_(true), 139 supports_save_(true),
137 chunk_demuxer_(NULL), 140 chunk_demuxer_(NULL),
141 resource_multibuffer_(resource_multibuffer),
138 // Threaded compositing isn't enabled universally yet. 142 // Threaded compositing isn't enabled universally yet.
139 compositor_task_runner_( 143 compositor_task_runner_(
140 params.compositor_task_runner() 144 params.compositor_task_runner()
141 ? params.compositor_task_runner() 145 ? params.compositor_task_runner()
142 : base::MessageLoop::current()->task_runner()), 146 : base::MessageLoop::current()->task_runner()),
143 compositor_(new VideoFrameCompositor( 147 compositor_(new VideoFrameCompositor(
144 compositor_task_runner_, 148 compositor_task_runner_,
145 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged), 149 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnNaturalSizeChanged),
146 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))), 150 BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnOpacityChanged))),
147 encrypted_media_support_(cdm_factory, 151 encrypted_media_support_(cdm_factory,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); 236 media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec()));
233 237
234 // Media source pipelines can start immediately. 238 // Media source pipelines can start immediately.
235 if (load_type == LoadTypeMediaSource) { 239 if (load_type == LoadTypeMediaSource) {
236 supports_save_ = false; 240 supports_save_ = false;
237 StartPipeline(); 241 StartPipeline();
238 return; 242 return;
239 } 243 }
240 244
241 // Otherwise it's a regular request which requires resolving the URL first. 245 // Otherwise it's a regular request which requires resolving the URL first.
242 data_source_.reset(new BufferedDataSource( 246 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
243 url, 247 switches::kMediaUseMultibuffer)) {
liberato (no reviews please) 2015/11/05 19:03:18 && |resource_multibuffer_| (maybe instead)
hubbe 2015/11/13 22:56:52 Not sure which is better here... I see your point,
244 static_cast<BufferedResourceLoader::CORSMode>(cors_mode), 248 // Remove this when MultiBufferDataSource becomes default.
245 main_task_runner_, 249 LOG(WARNING) << "Using MultibufferDataSource";
246 frame_, 250 data_source_.reset(new MultibufferDataSource(
247 media_log_.get(), 251 url, static_cast<UrlData::CORSMode>(cors_mode), main_task_runner_,
248 &buffered_data_source_host_, 252 resource_multibuffer_, frame_, media_log_.get(),
249 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr()))); 253 &buffered_data_source_host_,
254 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr())));
255 } else {
256 data_source_.reset(new BufferedDataSource(
257 url, static_cast<BufferedResourceLoader::CORSMode>(cors_mode),
258 main_task_runner_, frame_, media_log_.get(),
259 &buffered_data_source_host_,
260 base::Bind(&WebMediaPlayerImpl::NotifyDownloading, AsWeakPtr())));
261 }
250 data_source_->SetPreload(preload_); 262 data_source_->SetPreload(preload_);
251 data_source_->Initialize( 263 data_source_->Initialize(
252 base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr())); 264 base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr()));
253 } 265 }
254 266
255 void WebMediaPlayerImpl::play() { 267 void WebMediaPlayerImpl::play() {
256 DVLOG(1) << __FUNCTION__; 268 DVLOG(1) << __FUNCTION__;
257 DCHECK(main_task_runner_->BelongsToCurrentThread()); 269 DCHECK(main_task_runner_->BelongsToCurrentThread());
258 270
259 paused_ = false; 271 paused_ = false;
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after
1064 1076
1065 // pause() may be called after playback has ended and the HTMLMediaElement 1077 // pause() may be called after playback has ended and the HTMLMediaElement
1066 // requires that currentTime() == duration() after ending. We want to ensure 1078 // requires that currentTime() == duration() after ending. We want to ensure
1067 // |paused_time_| matches currentTime() in this case or a future seek() may 1079 // |paused_time_| matches currentTime() in this case or a future seek() may
1068 // incorrectly discard what it thinks is a seek to the existing time. 1080 // incorrectly discard what it thinks is a seek to the existing time.
1069 paused_time_ = 1081 paused_time_ =
1070 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); 1082 ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime();
1071 } 1083 }
1072 1084
1073 } // namespace media 1085 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698