OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/glue/media/buffered_data_source.h" | 5 #include "webkit/glue/media/buffered_data_source.h" |
6 | 6 |
7 #include "media/base/filter_host.h" | 7 #include "media/base/filter_host.h" |
8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
9 #include "webkit/glue/webkit_glue.h" | 9 #include "webkit/glue/webkit_glue.h" |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 void BufferedDataSource::SetPlaybackRate(float playback_rate) { | 130 void BufferedDataSource::SetPlaybackRate(float playback_rate) { |
131 render_loop_->PostTask(FROM_HERE, | 131 render_loop_->PostTask(FROM_HERE, |
132 NewRunnableMethod(this, &BufferedDataSource::SetPlaybackRateTask, | 132 NewRunnableMethod(this, &BufferedDataSource::SetPlaybackRateTask, |
133 playback_rate)); | 133 playback_rate)); |
134 } | 134 } |
135 | 135 |
136 ///////////////////////////////////////////////////////////////////////////// | 136 ///////////////////////////////////////////////////////////////////////////// |
137 // media::DataSource implementation. | 137 // media::DataSource implementation. |
138 void BufferedDataSource::Read(int64 position, size_t size, uint8* data, | 138 void BufferedDataSource::Read(int64 position, size_t size, uint8* data, |
139 media::DataSource::ReadCallback* read_callback) { | 139 media::DataSource::ReadCallback* read_callback) { |
| 140 DCHECK(read_callback); |
| 141 |
| 142 { |
| 143 base::AutoLock auto_lock(lock_); |
| 144 DCHECK(!read_callback_.get()); |
| 145 |
| 146 if (stop_signal_received_ || stopped_on_render_loop_) { |
| 147 read_callback->RunWithParams( |
| 148 Tuple1<size_t>(static_cast<size_t>(media::DataSource::kReadError))); |
| 149 delete read_callback; |
| 150 return; |
| 151 } |
| 152 |
| 153 read_callback_.reset(read_callback); |
| 154 } |
| 155 |
140 render_loop_->PostTask(FROM_HERE, | 156 render_loop_->PostTask(FROM_HERE, |
141 NewRunnableMethod(this, &BufferedDataSource::ReadTask, | 157 NewRunnableMethod(this, &BufferedDataSource::ReadTask, |
142 position, static_cast<int>(size), data, read_callback)); | 158 position, static_cast<int>(size), data)); |
143 } | 159 } |
144 | 160 |
145 bool BufferedDataSource::GetSize(int64* size_out) { | 161 bool BufferedDataSource::GetSize(int64* size_out) { |
146 if (total_bytes_ != kPositionNotSpecified) { | 162 if (total_bytes_ != kPositionNotSpecified) { |
147 *size_out = total_bytes_; | 163 *size_out = total_bytes_; |
148 return true; | 164 return true; |
149 } | 165 } |
150 *size_out = 0; | 166 *size_out = 0; |
151 return false; | 167 return false; |
152 } | 168 } |
153 | 169 |
154 bool BufferedDataSource::IsStreaming() { | 170 bool BufferedDataSource::IsStreaming() { |
155 return streaming_; | 171 return streaming_; |
156 } | 172 } |
157 | 173 |
158 bool BufferedDataSource::HasSingleOrigin() { | 174 bool BufferedDataSource::HasSingleOrigin() { |
159 DCHECK(MessageLoop::current() == render_loop_); | 175 DCHECK(MessageLoop::current() == render_loop_); |
160 return single_origin_; | 176 return single_origin_; |
161 } | 177 } |
162 | 178 |
163 void BufferedDataSource::Abort() { | 179 void BufferedDataSource::Abort() { |
164 DCHECK(MessageLoop::current() == render_loop_); | 180 DCHECK(MessageLoop::current() == render_loop_); |
165 | 181 |
166 // If we are told to abort, immediately return from any pending read | 182 { |
167 // with an error. | 183 base::AutoLock auto_lock(lock_); |
168 if (read_callback_.get()) { | 184 |
169 base::AutoLock auto_lock(lock_); | 185 // If we are told to abort, immediately return from any pending read |
| 186 // with an error. |
| 187 if (read_callback_.get()) |
170 DoneRead_Locked(net::ERR_FAILED); | 188 DoneRead_Locked(net::ERR_FAILED); |
171 } | 189 } |
172 | 190 |
173 CleanupTask(); | 191 CleanupTask(); |
174 frame_ = NULL; | 192 frame_ = NULL; |
175 } | 193 } |
176 | 194 |
177 ///////////////////////////////////////////////////////////////////////////// | 195 ///////////////////////////////////////////////////////////////////////////// |
178 // Render thread tasks. | 196 // Render thread tasks. |
179 void BufferedDataSource::InitializeTask() { | 197 void BufferedDataSource::InitializeTask() { |
(...skipping 25 matching lines...) Expand all Loading... |
205 loader_ = CreateResourceLoader(kPositionNotSpecified, | 223 loader_ = CreateResourceLoader(kPositionNotSpecified, |
206 kPositionNotSpecified); | 224 kPositionNotSpecified); |
207 loader_->Start( | 225 loader_->Start( |
208 NewCallback(this, &BufferedDataSource::NonHttpInitialStartCallback), | 226 NewCallback(this, &BufferedDataSource::NonHttpInitialStartCallback), |
209 NewCallback(this, &BufferedDataSource::NetworkEventCallback), | 227 NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
210 frame_); | 228 frame_); |
211 } | 229 } |
212 } | 230 } |
213 | 231 |
214 void BufferedDataSource::ReadTask( | 232 void BufferedDataSource::ReadTask( |
215 int64 position, int read_size, uint8* buffer, | 233 int64 position, |
216 media::DataSource::ReadCallback* read_callback) { | 234 int read_size, |
| 235 uint8* buffer) { |
217 DCHECK(MessageLoop::current() == render_loop_); | 236 DCHECK(MessageLoop::current() == render_loop_); |
218 if (stopped_on_render_loop_) | 237 { |
219 return; | 238 base::AutoLock auto_lock(lock_); |
| 239 if (stopped_on_render_loop_) |
| 240 return; |
220 | 241 |
221 DCHECK(!read_callback_.get()); | 242 DCHECK(read_callback_.get()); |
222 DCHECK(read_callback); | 243 } |
223 | 244 |
224 // Saves the read parameters. | 245 // Saves the read parameters. |
225 read_position_ = position; | 246 read_position_ = position; |
226 read_size_ = read_size; | 247 read_size_ = read_size; |
227 read_callback_.reset(read_callback); | |
228 read_buffer_ = buffer; | 248 read_buffer_ = buffer; |
229 read_submitted_time_ = base::Time::Now(); | 249 read_submitted_time_ = base::Time::Now(); |
230 read_attempts_ = 0; | 250 read_attempts_ = 0; |
231 | 251 |
232 // Call to read internal to perform the actual read. | 252 // Call to read internal to perform the actual read. |
233 ReadInternal(); | 253 ReadInternal(); |
234 } | 254 } |
235 | 255 |
236 void BufferedDataSource::CleanupTask() { | 256 void BufferedDataSource::CleanupTask() { |
237 DCHECK(MessageLoop::current() == render_loop_); | 257 DCHECK(MessageLoop::current() == render_loop_); |
238 if (stopped_on_render_loop_) | 258 |
239 return; | 259 { |
| 260 base::AutoLock auto_lock(lock_); |
| 261 if (stopped_on_render_loop_) |
| 262 return; |
| 263 |
| 264 read_callback_.reset(); |
| 265 } |
240 | 266 |
241 // Stop the watch dog. | 267 // Stop the watch dog. |
242 watch_dog_timer_.Stop(); | 268 watch_dog_timer_.Stop(); |
243 | 269 |
244 // We just need to stop the loader, so it stops activity. | 270 // We just need to stop the loader, so it stops activity. |
245 if (loader_.get()) | 271 if (loader_.get()) |
246 loader_->Stop(); | 272 loader_->Stop(); |
247 | 273 |
248 // Reset the parameters of the current read request. | 274 // Reset the parameters of the current read request. |
249 read_callback_.reset(); | |
250 read_position_ = 0; | 275 read_position_ = 0; |
251 read_size_ = 0; | 276 read_size_ = 0; |
252 read_buffer_ = 0; | 277 read_buffer_ = 0; |
253 read_submitted_time_ = base::Time(); | 278 read_submitted_time_ = base::Time(); |
254 read_attempts_ = 0; | 279 read_attempts_ = 0; |
255 | 280 |
256 // Signal that stop task has finished execution. | 281 // Signal that stop task has finished execution. |
257 stopped_on_render_loop_ = true; | 282 stopped_on_render_loop_ = true; |
258 } | 283 } |
259 | 284 |
260 void BufferedDataSource::RestartLoadingTask() { | 285 void BufferedDataSource::RestartLoadingTask() { |
261 DCHECK(MessageLoop::current() == render_loop_); | 286 DCHECK(MessageLoop::current() == render_loop_); |
262 if (stopped_on_render_loop_) | 287 if (stopped_on_render_loop_) |
263 return; | 288 return; |
264 | 289 |
265 // If there's no outstanding read then return early. | 290 { |
266 if (!read_callback_.get()) | 291 // If there's no outstanding read then return early. |
267 return; | 292 base::AutoLock auto_lock(lock_); |
| 293 if (!read_callback_.get()) |
| 294 return; |
| 295 } |
268 | 296 |
269 loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); | 297 loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified); |
270 loader_->SetAllowDefer(!media_is_paused_); | 298 loader_->SetAllowDefer(!media_is_paused_); |
271 loader_->Start( | 299 loader_->Start( |
272 NewCallback(this, &BufferedDataSource::PartialReadStartCallback), | 300 NewCallback(this, &BufferedDataSource::PartialReadStartCallback), |
273 NewCallback(this, &BufferedDataSource::NetworkEventCallback), | 301 NewCallback(this, &BufferedDataSource::NetworkEventCallback), |
274 frame_); | 302 frame_); |
275 } | 303 } |
276 | 304 |
277 void BufferedDataSource::WatchDogTask() { | 305 void BufferedDataSource::WatchDogTask() { |
278 DCHECK(MessageLoop::current() == render_loop_); | 306 DCHECK(MessageLoop::current() == render_loop_); |
279 if (stopped_on_render_loop_) | 307 if (stopped_on_render_loop_) |
280 return; | 308 return; |
281 | 309 |
282 // We only care if there is an active read request. | 310 // We only care if there is an active read request. |
283 if (!read_callback_.get()) | 311 { |
284 return; | 312 base::AutoLock auto_lock(lock_); |
| 313 if (!read_callback_.get()) |
| 314 return; |
| 315 } |
285 | 316 |
286 DCHECK(loader_.get()); | 317 DCHECK(loader_.get()); |
287 base::TimeDelta delta = base::Time::Now() - read_submitted_time_; | 318 base::TimeDelta delta = base::Time::Now() - read_submitted_time_; |
288 if (delta < GetTimeoutMilliseconds()) | 319 if (delta < GetTimeoutMilliseconds()) |
289 return; | 320 return; |
290 | 321 |
291 // TODO(hclam): Maybe raise an error here. But if an error is reported | 322 // TODO(hclam): Maybe raise an error here. But if an error is reported |
292 // the whole pipeline may get destroyed... | 323 // the whole pipeline may get destroyed... |
293 if (read_attempts_ >= kReadTrials) | 324 if (read_attempts_ >= kReadTrials) |
294 return; | 325 return; |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 return; | 606 return; |
576 | 607 |
577 if (network_activity != network_activity_) { | 608 if (network_activity != network_activity_) { |
578 network_activity_ = network_activity; | 609 network_activity_ = network_activity; |
579 host()->SetNetworkActivity(network_activity); | 610 host()->SetNetworkActivity(network_activity); |
580 } | 611 } |
581 host()->SetBufferedBytes(buffered_position + 1); | 612 host()->SetBufferedBytes(buffered_position + 1); |
582 } | 613 } |
583 | 614 |
584 } // namespace webkit_glue | 615 } // namespace webkit_glue |
OLD | NEW |