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/buffered_data_source.h" | 5 #include "webkit/media/buffered_data_source.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "media/base/media_log.h" | 9 #include "media/base/media_log.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 read_position_(0), | 35 read_position_(0), |
36 read_size_(0), | 36 read_size_(0), |
37 read_buffer_(NULL), | 37 read_buffer_(NULL), |
38 intermediate_read_buffer_(new uint8[kInitialReadBufferSize]), | 38 intermediate_read_buffer_(new uint8[kInitialReadBufferSize]), |
39 intermediate_read_buffer_size_(kInitialReadBufferSize), | 39 intermediate_read_buffer_size_(kInitialReadBufferSize), |
40 render_loop_(render_loop), | 40 render_loop_(render_loop), |
41 stop_signal_received_(false), | 41 stop_signal_received_(false), |
42 stopped_on_render_loop_(false), | 42 stopped_on_render_loop_(false), |
43 media_is_paused_(true), | 43 media_is_paused_(true), |
44 media_has_played_(false), | 44 media_has_played_(false), |
45 preload_(media::AUTO), | 45 preload_(AUTO), |
46 cache_miss_retries_left_(kNumCacheMissRetries), | 46 cache_miss_retries_left_(kNumCacheMissRetries), |
47 bitrate_(0), | 47 bitrate_(0), |
48 playback_rate_(0.0), | 48 playback_rate_(0.0), |
49 media_log_(media_log) { | 49 media_log_(media_log) { |
50 } | 50 } |
51 | 51 |
52 BufferedDataSource::~BufferedDataSource() {} | 52 BufferedDataSource::~BufferedDataSource() {} |
53 | 53 |
54 // A factory method to create BufferedResourceLoader using the read parameters. | 54 // A factory method to create BufferedResourceLoader using the read parameters. |
55 // This method can be overrided to inject mock BufferedResourceLoader object | 55 // This method can be overrided to inject mock BufferedResourceLoader object |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 // the full range of the resource to obtain the instance size because | 101 // the full range of the resource to obtain the instance size because |
102 // we won't be served HTTP headers. | 102 // we won't be served HTTP headers. |
103 loader_.reset(CreateResourceLoader(kPositionNotSpecified, | 103 loader_.reset(CreateResourceLoader(kPositionNotSpecified, |
104 kPositionNotSpecified)); | 104 kPositionNotSpecified)); |
105 loader_->Start( | 105 loader_->Start( |
106 base::Bind(&BufferedDataSource::NonHttpInitialStartCallback, this), | 106 base::Bind(&BufferedDataSource::NonHttpInitialStartCallback, this), |
107 base::Bind(&BufferedDataSource::NetworkEventCallback, this), | 107 base::Bind(&BufferedDataSource::NetworkEventCallback, this), |
108 frame_); | 108 frame_); |
109 } | 109 } |
110 | 110 |
| 111 void BufferedDataSource::SetPreload(Preload preload) { |
| 112 DCHECK(MessageLoop::current() == render_loop_); |
| 113 preload_ = preload; |
| 114 } |
| 115 |
111 bool BufferedDataSource::HasSingleOrigin() { | 116 bool BufferedDataSource::HasSingleOrigin() { |
112 DCHECK(MessageLoop::current() == render_loop_); | 117 DCHECK(MessageLoop::current() == render_loop_); |
113 return loader_.get() ? loader_->HasSingleOrigin() : true; | 118 return loader_.get() ? loader_->HasSingleOrigin() : true; |
114 } | 119 } |
115 | 120 |
116 void BufferedDataSource::Abort() { | 121 void BufferedDataSource::Abort() { |
117 DCHECK(MessageLoop::current() == render_loop_); | 122 DCHECK(MessageLoop::current() == render_loop_); |
118 | 123 |
119 CleanupTask(); | 124 CleanupTask(); |
120 frame_ = NULL; | 125 frame_ = NULL; |
(...skipping 11 matching lines...) Expand all Loading... |
132 | 137 |
133 render_loop_->PostTask(FROM_HERE, | 138 render_loop_->PostTask(FROM_HERE, |
134 base::Bind(&BufferedDataSource::CleanupTask, this)); | 139 base::Bind(&BufferedDataSource::CleanupTask, this)); |
135 } | 140 } |
136 | 141 |
137 void BufferedDataSource::SetPlaybackRate(float playback_rate) { | 142 void BufferedDataSource::SetPlaybackRate(float playback_rate) { |
138 render_loop_->PostTask(FROM_HERE, base::Bind( | 143 render_loop_->PostTask(FROM_HERE, base::Bind( |
139 &BufferedDataSource::SetPlaybackRateTask, this, playback_rate)); | 144 &BufferedDataSource::SetPlaybackRateTask, this, playback_rate)); |
140 } | 145 } |
141 | 146 |
142 void BufferedDataSource::SetPreload(media::Preload preload) { | |
143 render_loop_->PostTask(FROM_HERE, base::Bind( | |
144 &BufferedDataSource::SetPreloadTask, this, preload)); | |
145 } | |
146 | |
147 void BufferedDataSource::SetBitrate(int bitrate) { | 147 void BufferedDataSource::SetBitrate(int bitrate) { |
148 render_loop_->PostTask(FROM_HERE, base::Bind( | 148 render_loop_->PostTask(FROM_HERE, base::Bind( |
149 &BufferedDataSource::SetBitrateTask, this, bitrate)); | 149 &BufferedDataSource::SetBitrateTask, this, bitrate)); |
150 } | 150 } |
151 | 151 |
152 ///////////////////////////////////////////////////////////////////////////// | 152 ///////////////////////////////////////////////////////////////////////////// |
153 // media::DataSource implementation. | 153 // media::DataSource implementation. |
154 void BufferedDataSource::Read( | 154 void BufferedDataSource::Read( |
155 int64 position, size_t size, uint8* data, | 155 int64 position, size_t size, uint8* data, |
156 const media::DataSource::ReadCB& read_cb) { | 156 const media::DataSource::ReadCB& read_cb) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 bool previously_paused = media_is_paused_; | 269 bool previously_paused = media_is_paused_; |
270 media_is_paused_ = (playback_rate == 0.0); | 270 media_is_paused_ = (playback_rate == 0.0); |
271 | 271 |
272 if (!media_has_played_ && previously_paused && !media_is_paused_) | 272 if (!media_has_played_ && previously_paused && !media_is_paused_) |
273 media_has_played_ = true; | 273 media_has_played_ = true; |
274 | 274 |
275 BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy(); | 275 BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy(); |
276 loader_->UpdateDeferStrategy(strategy); | 276 loader_->UpdateDeferStrategy(strategy); |
277 } | 277 } |
278 | 278 |
279 void BufferedDataSource::SetPreloadTask(media::Preload preload) { | |
280 DCHECK(MessageLoop::current() == render_loop_); | |
281 preload_ = preload; | |
282 } | |
283 | |
284 void BufferedDataSource::SetBitrateTask(int bitrate) { | 279 void BufferedDataSource::SetBitrateTask(int bitrate) { |
285 DCHECK(MessageLoop::current() == render_loop_); | 280 DCHECK(MessageLoop::current() == render_loop_); |
286 DCHECK(loader_.get()); | 281 DCHECK(loader_.get()); |
287 | 282 |
288 bitrate_ = bitrate; | 283 bitrate_ = bitrate; |
289 loader_->SetBitrate(bitrate); | 284 loader_->SetBitrate(bitrate); |
290 } | 285 } |
291 | 286 |
292 BufferedResourceLoader::DeferStrategy | 287 BufferedResourceLoader::DeferStrategy |
293 BufferedDataSource::ChooseDeferStrategy() { | 288 BufferedDataSource::ChooseDeferStrategy() { |
294 DCHECK(MessageLoop::current() == render_loop_); | 289 DCHECK(MessageLoop::current() == render_loop_); |
295 // If the page indicated preload=metadata, then load exactly what is needed | 290 // If the page indicated preload=metadata, then load exactly what is needed |
296 // needed for starting playback. | 291 // needed for starting playback. |
297 if (!media_has_played_ && preload_ == media::METADATA) | 292 if (!media_has_played_ && preload_ == METADATA) |
298 return BufferedResourceLoader::kReadThenDefer; | 293 return BufferedResourceLoader::kReadThenDefer; |
299 | 294 |
300 // If the playback has started (at which point the preload value is ignored) | 295 // If the playback has started (at which point the preload value is ignored) |
301 // and we're paused, then try to load as much as possible. | 296 // and we're paused, then try to load as much as possible. |
302 if (media_has_played_ && media_is_paused_) | 297 if (media_has_played_ && media_is_paused_) |
303 return BufferedResourceLoader::kNeverDefer; | 298 return BufferedResourceLoader::kNeverDefer; |
304 | 299 |
305 // If media is currently playing or the page indicated preload=auto, | 300 // If media is currently playing or the page indicated preload=auto, |
306 // use threshold strategy to enable/disable deferring when the buffer | 301 // use threshold strategy to enable/disable deferring when the buffer |
307 // is full/depleted. | 302 // is full/depleted. |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 | 583 |
589 if (!host()) | 584 if (!host()) |
590 return; | 585 return; |
591 | 586 |
592 if (total_bytes_ != kPositionNotSpecified) | 587 if (total_bytes_ != kPositionNotSpecified) |
593 host()->SetTotalBytes(total_bytes_); | 588 host()->SetTotalBytes(total_bytes_); |
594 host()->SetBufferedBytes(buffered_bytes_); | 589 host()->SetBufferedBytes(buffered_bytes_); |
595 } | 590 } |
596 | 591 |
597 } // namespace webkit_media | 592 } // namespace webkit_media |
OLD | NEW |