| OLD | NEW |
| 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/buffered_data_source.h" | 5 #include "media/blink/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/location.h" | 9 #include "base/location.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 // The number of milliseconds to wait before retrying a failed load. | 27 // The number of milliseconds to wait before retrying a failed load. |
| 28 const int kLoaderFailedRetryDelayMs = 250; | 28 const int kLoaderFailedRetryDelayMs = 250; |
| 29 | 29 |
| 30 } // namespace | 30 } // namespace |
| 31 | 31 |
| 32 namespace media { | 32 namespace media { |
| 33 | 33 |
| 34 class BufferedDataSource::ReadOperation { | 34 class BufferedDataSource::ReadOperation { |
| 35 public: | 35 public: |
| 36 ReadOperation(int64 position, int size, uint8* data, | 36 ReadOperation(int64_t position, |
| 37 int size, |
| 38 uint8_t* data, |
| 37 const DataSource::ReadCB& callback); | 39 const DataSource::ReadCB& callback); |
| 38 ~ReadOperation(); | 40 ~ReadOperation(); |
| 39 | 41 |
| 40 // Runs |callback_| with the given |result|, deleting the operation | 42 // Runs |callback_| with the given |result|, deleting the operation |
| 41 // afterwards. | 43 // afterwards. |
| 42 static void Run(scoped_ptr<ReadOperation> read_op, int result); | 44 static void Run(scoped_ptr<ReadOperation> read_op, int result); |
| 43 | 45 |
| 44 // State for the number of times this read operation has been retried. | 46 // State for the number of times this read operation has been retried. |
| 45 int retries() { return retries_; } | 47 int retries() { return retries_; } |
| 46 void IncrementRetries() { ++retries_; } | 48 void IncrementRetries() { ++retries_; } |
| 47 | 49 |
| 48 int64 position() { return position_; } | 50 int64_t position() { return position_; } |
| 49 int size() { return size_; } | 51 int size() { return size_; } |
| 50 uint8* data() { return data_; } | 52 uint8_t* data() { return data_; } |
| 51 | 53 |
| 52 private: | 54 private: |
| 53 int retries_; | 55 int retries_; |
| 54 | 56 |
| 55 const int64 position_; | 57 const int64_t position_; |
| 56 const int size_; | 58 const int size_; |
| 57 uint8* data_; | 59 uint8_t* data_; |
| 58 DataSource::ReadCB callback_; | 60 DataSource::ReadCB callback_; |
| 59 | 61 |
| 60 DISALLOW_IMPLICIT_CONSTRUCTORS(ReadOperation); | 62 DISALLOW_IMPLICIT_CONSTRUCTORS(ReadOperation); |
| 61 }; | 63 }; |
| 62 | 64 |
| 63 BufferedDataSource::ReadOperation::ReadOperation( | 65 BufferedDataSource::ReadOperation::ReadOperation( |
| 64 int64 position, int size, uint8* data, | 66 int64_t position, |
| 67 int size, |
| 68 uint8_t* data, |
| 65 const DataSource::ReadCB& callback) | 69 const DataSource::ReadCB& callback) |
| 66 : retries_(0), | 70 : retries_(0), |
| 67 position_(position), | 71 position_(position), |
| 68 size_(size), | 72 size_(size), |
| 69 data_(data), | 73 data_(data), |
| 70 callback_(callback) { | 74 callback_(callback) { |
| 71 DCHECK(!callback_.is_null()); | 75 DCHECK(!callback_.is_null()); |
| 72 } | 76 } |
| 73 | 77 |
| 74 BufferedDataSource::ReadOperation::~ReadOperation() { | 78 BufferedDataSource::ReadOperation::~ReadOperation() { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 } | 125 } |
| 122 | 126 |
| 123 bool BufferedDataSource::assume_fully_buffered() { | 127 bool BufferedDataSource::assume_fully_buffered() { |
| 124 return !url_.SchemeIsHTTPOrHTTPS(); | 128 return !url_.SchemeIsHTTPOrHTTPS(); |
| 125 } | 129 } |
| 126 | 130 |
| 127 // A factory method to create BufferedResourceLoader using the read parameters. | 131 // A factory method to create BufferedResourceLoader using the read parameters. |
| 128 // This method can be overridden to inject mock BufferedResourceLoader object | 132 // This method can be overridden to inject mock BufferedResourceLoader object |
| 129 // for testing purpose. | 133 // for testing purpose. |
| 130 BufferedResourceLoader* BufferedDataSource::CreateResourceLoader( | 134 BufferedResourceLoader* BufferedDataSource::CreateResourceLoader( |
| 131 int64 first_byte_position, int64 last_byte_position) { | 135 int64_t first_byte_position, |
| 136 int64_t last_byte_position) { |
| 132 DCHECK(render_task_runner_->BelongsToCurrentThread()); | 137 DCHECK(render_task_runner_->BelongsToCurrentThread()); |
| 133 | 138 |
| 134 BufferedResourceLoader::DeferStrategy strategy = preload_ == METADATA ? | 139 BufferedResourceLoader::DeferStrategy strategy = preload_ == METADATA ? |
| 135 BufferedResourceLoader::kReadThenDefer : | 140 BufferedResourceLoader::kReadThenDefer : |
| 136 BufferedResourceLoader::kCapacityDefer; | 141 BufferedResourceLoader::kCapacityDefer; |
| 137 | 142 |
| 138 return new BufferedResourceLoader(url_, | 143 return new BufferedResourceLoader(url_, |
| 139 cors_mode_, | 144 cors_mode_, |
| 140 first_byte_position, | 145 first_byte_position, |
| 141 last_byte_position, | 146 last_byte_position, |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 DCHECK(render_task_runner_->BelongsToCurrentThread()); | 251 DCHECK(render_task_runner_->BelongsToCurrentThread()); |
| 247 if (loader_ && preload_ == METADATA && !media_has_played_ && !IsStreaming()) | 252 if (loader_ && preload_ == METADATA && !media_has_played_ && !IsStreaming()) |
| 248 loader_->CancelUponDeferral(); | 253 loader_->CancelUponDeferral(); |
| 249 } | 254 } |
| 250 | 255 |
| 251 int64_t BufferedDataSource::GetMemoryUsage() const { | 256 int64_t BufferedDataSource::GetMemoryUsage() const { |
| 252 DCHECK(render_task_runner_->BelongsToCurrentThread()); | 257 DCHECK(render_task_runner_->BelongsToCurrentThread()); |
| 253 return loader_ ? loader_->GetMemoryUsage() : 0; | 258 return loader_ ? loader_->GetMemoryUsage() : 0; |
| 254 } | 259 } |
| 255 | 260 |
| 256 void BufferedDataSource::Read( | 261 void BufferedDataSource::Read(int64_t position, |
| 257 int64 position, int size, uint8* data, | 262 int size, |
| 258 const DataSource::ReadCB& read_cb) { | 263 uint8_t* data, |
| 264 const DataSource::ReadCB& read_cb) { |
| 259 DVLOG(1) << "Read: " << position << " offset, " << size << " bytes"; | 265 DVLOG(1) << "Read: " << position << " offset, " << size << " bytes"; |
| 260 DCHECK(!read_cb.is_null()); | 266 DCHECK(!read_cb.is_null()); |
| 261 | 267 |
| 262 { | 268 { |
| 263 base::AutoLock auto_lock(lock_); | 269 base::AutoLock auto_lock(lock_); |
| 264 DCHECK(!read_op_); | 270 DCHECK(!read_op_); |
| 265 | 271 |
| 266 if (stop_signal_received_) { | 272 if (stop_signal_received_) { |
| 267 read_cb.Run(kReadError); | 273 read_cb.Run(kReadError); |
| 268 return; | 274 return; |
| 269 } | 275 } |
| 270 | 276 |
| 271 read_op_.reset(new ReadOperation(position, size, data, read_cb)); | 277 read_op_.reset(new ReadOperation(position, size, data, read_cb)); |
| 272 } | 278 } |
| 273 | 279 |
| 274 render_task_runner_->PostTask( | 280 render_task_runner_->PostTask( |
| 275 FROM_HERE, | 281 FROM_HERE, |
| 276 base::Bind(&BufferedDataSource::ReadTask, weak_factory_.GetWeakPtr())); | 282 base::Bind(&BufferedDataSource::ReadTask, weak_factory_.GetWeakPtr())); |
| 277 } | 283 } |
| 278 | 284 |
| 279 bool BufferedDataSource::GetSize(int64* size_out) { | 285 bool BufferedDataSource::GetSize(int64_t* size_out) { |
| 280 if (total_bytes_ != kPositionNotSpecified) { | 286 if (total_bytes_ != kPositionNotSpecified) { |
| 281 *size_out = total_bytes_; | 287 *size_out = total_bytes_; |
| 282 return true; | 288 return true; |
| 283 } | 289 } |
| 284 *size_out = 0; | 290 *size_out = 0; |
| 285 return false; | 291 return false; |
| 286 } | 292 } |
| 287 | 293 |
| 288 bool BufferedDataSource::IsStreaming() { | 294 bool BufferedDataSource::IsStreaming() { |
| 289 return streaming_; | 295 return streaming_; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 DCHECK(loader_.get()); | 329 DCHECK(loader_.get()); |
| 324 | 330 |
| 325 bitrate_ = bitrate; | 331 bitrate_ = bitrate; |
| 326 loader_->SetBitrate(bitrate); | 332 loader_->SetBitrate(bitrate); |
| 327 } | 333 } |
| 328 | 334 |
| 329 // This method is the place where actual read happens, |loader_| must be valid | 335 // This method is the place where actual read happens, |loader_| must be valid |
| 330 // prior to make this method call. | 336 // prior to make this method call. |
| 331 void BufferedDataSource::ReadInternal() { | 337 void BufferedDataSource::ReadInternal() { |
| 332 DCHECK(render_task_runner_->BelongsToCurrentThread()); | 338 DCHECK(render_task_runner_->BelongsToCurrentThread()); |
| 333 int64 position = 0; | 339 int64_t position = 0; |
| 334 int size = 0; | 340 int size = 0; |
| 335 { | 341 { |
| 336 base::AutoLock auto_lock(lock_); | 342 base::AutoLock auto_lock(lock_); |
| 337 if (stop_signal_received_) | 343 if (stop_signal_received_) |
| 338 return; | 344 return; |
| 339 | 345 |
| 340 position = read_op_->position(); | 346 position = read_op_->position(); |
| 341 size = read_op_->size(); | 347 size = read_op_->size(); |
| 342 } | 348 } |
| 343 | 349 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 // we should consider changing DownloadingCB to also propagate loading | 553 // we should consider changing DownloadingCB to also propagate loading |
| 548 // state. For example there isn't any signal today to notify the client that | 554 // state. For example there isn't any signal today to notify the client that |
| 549 // loading has failed (we only get errors on subsequent reads). | 555 // loading has failed (we only get errors on subsequent reads). |
| 550 case BufferedResourceLoader::kLoadingFailed: | 556 case BufferedResourceLoader::kLoadingFailed: |
| 551 return; | 557 return; |
| 552 } | 558 } |
| 553 | 559 |
| 554 downloading_cb_.Run(is_downloading_data); | 560 downloading_cb_.Run(is_downloading_data); |
| 555 } | 561 } |
| 556 | 562 |
| 557 void BufferedDataSource::ProgressCallback(int64 position) { | 563 void BufferedDataSource::ProgressCallback(int64_t position) { |
| 558 DCHECK(render_task_runner_->BelongsToCurrentThread()); | 564 DCHECK(render_task_runner_->BelongsToCurrentThread()); |
| 559 | 565 |
| 560 if (assume_fully_buffered()) | 566 if (assume_fully_buffered()) |
| 561 return; | 567 return; |
| 562 | 568 |
| 563 // TODO(scherkus): we shouldn't have to lock to signal host(), see | 569 // TODO(scherkus): we shouldn't have to lock to signal host(), see |
| 564 // http://crbug.com/113712 for details. | 570 // http://crbug.com/113712 for details. |
| 565 base::AutoLock auto_lock(lock_); | 571 base::AutoLock auto_lock(lock_); |
| 566 if (stop_signal_received_) | 572 if (stop_signal_received_) |
| 567 return; | 573 return; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 591 } | 597 } |
| 592 | 598 |
| 593 // If media is currently playing or the page indicated preload=auto or the | 599 // If media is currently playing or the page indicated preload=auto or the |
| 594 // the server does not support the byte range request or we do not want to go | 600 // the server does not support the byte range request or we do not want to go |
| 595 // too far ahead of the read head, use threshold strategy to enable/disable | 601 // too far ahead of the read head, use threshold strategy to enable/disable |
| 596 // deferring when the buffer is full/depleted. | 602 // deferring when the buffer is full/depleted. |
| 597 loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer); | 603 loader_->UpdateDeferStrategy(BufferedResourceLoader::kCapacityDefer); |
| 598 } | 604 } |
| 599 | 605 |
| 600 } // namespace media | 606 } // namespace media |
| OLD | NEW |