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

Side by Side Diff: content/renderer/media/buffered_data_source.cc

Issue 193303002: WeakPtr destruction order cleanup: media edition. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 9 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 "content/renderer/media/buffered_data_source.h" 5 #include "content/renderer/media/buffered_data_source.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/message_loop/message_loop_proxy.h" 9 #include "base/message_loop/message_loop_proxy.h"
10 #include "media/base/media_log.h" 10 #include "media/base/media_log.h"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 render_loop_(render_loop), 92 render_loop_(render_loop),
93 stop_signal_received_(false), 93 stop_signal_received_(false),
94 media_has_played_(false), 94 media_has_played_(false),
95 preload_(AUTO), 95 preload_(AUTO),
96 bitrate_(0), 96 bitrate_(0),
97 playback_rate_(0.0), 97 playback_rate_(0.0),
98 media_log_(media_log), 98 media_log_(media_log),
99 downloading_cb_(downloading_cb), 99 downloading_cb_(downloading_cb),
100 weak_factory_(this) { 100 weak_factory_(this) {
101 DCHECK(!downloading_cb_.is_null()); 101 DCHECK(!downloading_cb_.is_null());
102 weak_this_ = weak_factory_.GetWeakPtr();
103 } 102 }
104 103
105 BufferedDataSource::~BufferedDataSource() {} 104 BufferedDataSource::~BufferedDataSource() {}
106 105
107 // A factory method to create BufferedResourceLoader using the read parameters. 106 // A factory method to create BufferedResourceLoader using the read parameters.
108 // This method can be overridden to inject mock BufferedResourceLoader object 107 // This method can be overridden to inject mock BufferedResourceLoader object
109 // for testing purpose. 108 // for testing purpose.
110 BufferedResourceLoader* BufferedDataSource::CreateResourceLoader( 109 BufferedResourceLoader* BufferedDataSource::CreateResourceLoader(
111 int64 first_byte_position, int64 last_byte_position) { 110 int64 first_byte_position, int64 last_byte_position) {
112 DCHECK(render_loop_->BelongsToCurrentThread()); 111 DCHECK(render_loop_->BelongsToCurrentThread());
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 loader_.reset(CreateResourceLoader(0, kPositionNotSpecified)); 151 loader_.reset(CreateResourceLoader(0, kPositionNotSpecified));
153 } else { 152 } else {
154 // For all other protocols, assume they support range request. We fetch 153 // For all other protocols, assume they support range request. We fetch
155 // the full range of the resource to obtain the instance size because 154 // the full range of the resource to obtain the instance size because
156 // we won't be served HTTP headers. 155 // we won't be served HTTP headers.
157 loader_.reset(CreateResourceLoader(kPositionNotSpecified, 156 loader_.reset(CreateResourceLoader(kPositionNotSpecified,
158 kPositionNotSpecified)); 157 kPositionNotSpecified));
159 assume_fully_buffered_ = true; 158 assume_fully_buffered_ = true;
160 } 159 }
161 160
161 base::WeakPtr<BufferedDataSource> weak_this = weak_factory_.GetWeakPtr();
162 loader_->Start( 162 loader_->Start(
163 base::Bind(&BufferedDataSource::StartCallback, weak_this_), 163 base::Bind(&BufferedDataSource::StartCallback, weak_this),
164 base::Bind(&BufferedDataSource::LoadingStateChangedCallback, weak_this_), 164 base::Bind(&BufferedDataSource::LoadingStateChangedCallback, weak_this),
165 base::Bind(&BufferedDataSource::ProgressCallback, weak_this_), 165 base::Bind(&BufferedDataSource::ProgressCallback, weak_this),
166 frame_); 166 frame_);
167 } 167 }
168 168
169 void BufferedDataSource::SetPreload(Preload preload) { 169 void BufferedDataSource::SetPreload(Preload preload) {
170 DCHECK(render_loop_->BelongsToCurrentThread()); 170 DCHECK(render_loop_->BelongsToCurrentThread());
171 preload_ = preload; 171 preload_ = preload;
172 } 172 }
173 173
174 bool BufferedDataSource::HasSingleOrigin() { 174 bool BufferedDataSource::HasSingleOrigin() {
175 DCHECK(render_loop_->BelongsToCurrentThread()); 175 DCHECK(render_loop_->BelongsToCurrentThread());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 216
217 ///////////////////////////////////////////////////////////////////////////// 217 /////////////////////////////////////////////////////////////////////////////
218 // media::DataSource implementation. 218 // media::DataSource implementation.
219 void BufferedDataSource::Stop(const base::Closure& closure) { 219 void BufferedDataSource::Stop(const base::Closure& closure) {
220 { 220 {
221 base::AutoLock auto_lock(lock_); 221 base::AutoLock auto_lock(lock_);
222 StopInternal_Locked(); 222 StopInternal_Locked();
223 } 223 }
224 closure.Run(); 224 closure.Run();
225 225
226 render_loop_->PostTask(FROM_HERE, 226 render_loop_->PostTask(
227 base::Bind(&BufferedDataSource::StopLoader, weak_this_)); 227 FROM_HERE,
228 base::Bind(&BufferedDataSource::StopLoader, weak_factory_.GetWeakPtr()));
228 } 229 }
229 230
230 void BufferedDataSource::SetBitrate(int bitrate) { 231 void BufferedDataSource::SetBitrate(int bitrate) {
231 render_loop_->PostTask(FROM_HERE, base::Bind( 232 render_loop_->PostTask(FROM_HERE,
232 &BufferedDataSource::SetBitrateTask, weak_this_, bitrate)); 233 base::Bind(&BufferedDataSource::SetBitrateTask,
234 weak_factory_.GetWeakPtr(),
235 bitrate));
233 } 236 }
234 237
235 void BufferedDataSource::Read( 238 void BufferedDataSource::Read(
236 int64 position, int size, uint8* data, 239 int64 position, int size, uint8* data,
237 const media::DataSource::ReadCB& read_cb) { 240 const media::DataSource::ReadCB& read_cb) {
238 DVLOG(1) << "Read: " << position << " offset, " << size << " bytes"; 241 DVLOG(1) << "Read: " << position << " offset, " << size << " bytes";
239 DCHECK(!read_cb.is_null()); 242 DCHECK(!read_cb.is_null());
240 243
241 { 244 {
242 base::AutoLock auto_lock(lock_); 245 base::AutoLock auto_lock(lock_);
243 DCHECK(!read_op_); 246 DCHECK(!read_op_);
244 247
245 if (stop_signal_received_) { 248 if (stop_signal_received_) {
246 read_cb.Run(kReadError); 249 read_cb.Run(kReadError);
247 return; 250 return;
248 } 251 }
249 252
250 read_op_.reset(new ReadOperation(position, size, data, read_cb)); 253 read_op_.reset(new ReadOperation(position, size, data, read_cb));
251 } 254 }
252 255
253 render_loop_->PostTask(FROM_HERE, base::Bind( 256 render_loop_->PostTask(
254 &BufferedDataSource::ReadTask, weak_this_)); 257 FROM_HERE,
258 base::Bind(&BufferedDataSource::ReadTask, weak_factory_.GetWeakPtr()));
255 } 259 }
256 260
257 bool BufferedDataSource::GetSize(int64* size_out) { 261 bool BufferedDataSource::GetSize(int64* size_out) {
258 if (total_bytes_ != kPositionNotSpecified) { 262 if (total_bytes_ != kPositionNotSpecified) {
259 *size_out = total_bytes_; 263 *size_out = total_bytes_;
260 return true; 264 return true;
261 } 265 }
262 *size_out = 0; 266 *size_out = 0;
263 return false; 267 return false;
264 } 268 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 size = read_op_->size(); 323 size = read_op_->size();
320 } 324 }
321 325
322 // First we prepare the intermediate read buffer for BufferedResourceLoader 326 // First we prepare the intermediate read buffer for BufferedResourceLoader
323 // to write to. 327 // to write to.
324 if (size > intermediate_read_buffer_size_) { 328 if (size > intermediate_read_buffer_size_) {
325 intermediate_read_buffer_.reset(new uint8[size]); 329 intermediate_read_buffer_.reset(new uint8[size]);
326 } 330 }
327 331
328 // Perform the actual read with BufferedResourceLoader. 332 // Perform the actual read with BufferedResourceLoader.
329 loader_->Read( 333 loader_->Read(position,
330 position, size, intermediate_read_buffer_.get(), 334 size,
331 base::Bind(&BufferedDataSource::ReadCallback, weak_this_)); 335 intermediate_read_buffer_.get(),
336 base::Bind(&BufferedDataSource::ReadCallback,
337 weak_factory_.GetWeakPtr()));
332 } 338 }
333 339
334 340
335 ///////////////////////////////////////////////////////////////////////////// 341 /////////////////////////////////////////////////////////////////////////////
336 // BufferedResourceLoader callback methods. 342 // BufferedResourceLoader callback methods.
337 void BufferedDataSource::StartCallback( 343 void BufferedDataSource::StartCallback(
338 BufferedResourceLoader::Status status) { 344 BufferedResourceLoader::Status status) {
339 DCHECK(render_loop_->BelongsToCurrentThread()); 345 DCHECK(render_loop_->BelongsToCurrentThread());
340 DCHECK(loader_.get()); 346 DCHECK(loader_.get());
341 347
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 loader_->Stop(); 430 loader_->Stop();
425 431
426 if (status == BufferedResourceLoader::kCacheMiss && 432 if (status == BufferedResourceLoader::kCacheMiss &&
427 read_op_->retries() < kNumCacheMissRetries) { 433 read_op_->retries() < kNumCacheMissRetries) {
428 read_op_->IncrementRetries(); 434 read_op_->IncrementRetries();
429 435
430 // Recreate a loader starting from where we last left off until the 436 // Recreate a loader starting from where we last left off until the
431 // end of the resource. 437 // end of the resource.
432 loader_.reset(CreateResourceLoader( 438 loader_.reset(CreateResourceLoader(
433 read_op_->position(), kPositionNotSpecified)); 439 read_op_->position(), kPositionNotSpecified));
440
441 base::WeakPtr<BufferedDataSource> weak_this = weak_factory_.GetWeakPtr();
434 loader_->Start( 442 loader_->Start(
435 base::Bind(&BufferedDataSource::PartialReadStartCallback, weak_this_), 443 base::Bind(&BufferedDataSource::PartialReadStartCallback, weak_this),
436 base::Bind(&BufferedDataSource::LoadingStateChangedCallback, 444 base::Bind(&BufferedDataSource::LoadingStateChangedCallback,
437 weak_this_), 445 weak_this),
438 base::Bind(&BufferedDataSource::ProgressCallback, weak_this_), 446 base::Bind(&BufferedDataSource::ProgressCallback, weak_this),
439 frame_); 447 frame_);
440 return; 448 return;
441 } 449 }
442 450
443 ReadOperation::Run(read_op_.Pass(), kReadError); 451 ReadOperation::Run(read_op_.Pass(), kReadError);
444 return; 452 return;
445 } 453 }
446 454
447 if (bytes_read > 0) { 455 if (bytes_read > 0) {
448 memcpy(read_op_->data(), intermediate_read_buffer_.get(), bytes_read); 456 memcpy(read_op_->data(), intermediate_read_buffer_.get(), bytes_read);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 return; 559 return;
552 } 560 }
553 561
554 // If media is currently playing or the page indicated preload=auto, 562 // If media is currently playing or the page indicated preload=auto,
555 // use threshold strategy to enable/disable deferring when the buffer 563 // use threshold strategy to enable/disable deferring when the buffer
556 // is full/depleted. 564 // is full/depleted.
557 loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer); 565 loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer);
558 } 566 }
559 567
560 } // namespace content 568 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/buffered_data_source.h ('k') | content/renderer/media/cdm_session_adapter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698