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 "media/base/pipeline_impl.h" | 5 #include "media/base/pipeline_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 // than DidLoadingProgress(). | 86 // than DidLoadingProgress(). |
87 bool did_loading_progress = false; | 87 bool did_loading_progress = false; |
88 | 88 |
89 // Amount of available buffered data as reported by Demuxer. | 89 // Amount of available buffered data as reported by Demuxer. |
90 Ranges<base::TimeDelta> buffered_time_ranges; | 90 Ranges<base::TimeDelta> buffered_time_ranges; |
91 | 91 |
92 // Accumulated statistics reported by the renderer. | 92 // Accumulated statistics reported by the renderer. |
93 PipelineStatistics statistics; | 93 PipelineStatistics statistics; |
94 | 94 |
95 // The media timestamp to return while the pipeline is suspended. | 95 // The media timestamp to return while the pipeline is suspended. |
96 // Otherwise set to kNoTimestamp(). | 96 // Otherwise set to kNoTimestamp. |
97 base::TimeDelta suspend_timestamp = kNoTimestamp(); | 97 base::TimeDelta suspend_timestamp = kNoTimestamp; |
98 }; | 98 }; |
99 | 99 |
100 // DemuxerHost implementaion. | 100 // DemuxerHost implementaion. |
101 void OnBufferedTimeRangesChanged(const Ranges<base::TimeDelta>& ranges) final; | 101 void OnBufferedTimeRangesChanged(const Ranges<base::TimeDelta>& ranges) final; |
102 void SetDuration(base::TimeDelta duration) final; | 102 void SetDuration(base::TimeDelta duration) final; |
103 void OnDemuxerError(PipelineStatus error) final; | 103 void OnDemuxerError(PipelineStatus error) final; |
104 void AddTextStream(DemuxerStream* text_stream, | 104 void AddTextStream(DemuxerStream* text_stream, |
105 const TextTrackConfig& config) final; | 105 const TextTrackConfig& config) final; |
106 void RemoveTextStream(DemuxerStream* text_stream) final; | 106 void RemoveTextStream(DemuxerStream* text_stream) final; |
107 | 107 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 DCHECK(!pending_callbacks_.get()); | 291 DCHECK(!pending_callbacks_.get()); |
292 | 292 |
293 SetState(kSuspending); | 293 SetState(kSuspending); |
294 | 294 |
295 // Freeze playback and record the media time before flushing. (Flushing clears | 295 // Freeze playback and record the media time before flushing. (Flushing clears |
296 // the value.) | 296 // the value.) |
297 shared_state_.renderer->SetPlaybackRate(0.0); | 297 shared_state_.renderer->SetPlaybackRate(0.0); |
298 { | 298 { |
299 base::AutoLock auto_lock(shared_state_lock_); | 299 base::AutoLock auto_lock(shared_state_lock_); |
300 shared_state_.suspend_timestamp = shared_state_.renderer->GetMediaTime(); | 300 shared_state_.suspend_timestamp = shared_state_.renderer->GetMediaTime(); |
301 DCHECK(shared_state_.suspend_timestamp != kNoTimestamp()); | 301 DCHECK(shared_state_.suspend_timestamp != kNoTimestamp); |
302 } | 302 } |
303 | 303 |
304 // Queue the asynchronous actions required to stop playback. (Matches setup in | 304 // Queue the asynchronous actions required to stop playback. (Matches setup in |
305 // DoSeek().) | 305 // DoSeek().) |
306 // TODO(sandersd): Share implementation with DoSeek(). | 306 // TODO(sandersd): Share implementation with DoSeek(). |
307 SerialRunner::Queue fns; | 307 SerialRunner::Queue fns; |
308 | 308 |
309 if (text_renderer_) { | 309 if (text_renderer_) { |
310 fns.Push(base::Bind(&TextRenderer::Pause, | 310 fns.Push(base::Bind(&TextRenderer::Pause, |
311 base::Unretained(text_renderer_.get()))); | 311 base::Unretained(text_renderer_.get()))); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 | 378 |
379 volume_ = volume; | 379 volume_ = volume; |
380 if (state_ == kPlaying) | 380 if (state_ == kPlaying) |
381 shared_state_.renderer->SetVolume(volume_); | 381 shared_state_.renderer->SetVolume(volume_); |
382 } | 382 } |
383 | 383 |
384 base::TimeDelta PipelineImpl::RendererWrapper::GetMediaTime() const { | 384 base::TimeDelta PipelineImpl::RendererWrapper::GetMediaTime() const { |
385 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 385 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
386 | 386 |
387 base::AutoLock auto_lock(shared_state_lock_); | 387 base::AutoLock auto_lock(shared_state_lock_); |
388 if (shared_state_.suspend_timestamp != kNoTimestamp()) | 388 if (shared_state_.suspend_timestamp != kNoTimestamp) |
389 return shared_state_.suspend_timestamp; | 389 return shared_state_.suspend_timestamp; |
390 return shared_state_.renderer ? shared_state_.renderer->GetMediaTime() | 390 return shared_state_.renderer ? shared_state_.renderer->GetMediaTime() |
391 : base::TimeDelta(); | 391 : base::TimeDelta(); |
392 } | 392 } |
393 | 393 |
394 Ranges<base::TimeDelta> PipelineImpl::RendererWrapper::GetBufferedTimeRanges() | 394 Ranges<base::TimeDelta> PipelineImpl::RendererWrapper::GetBufferedTimeRanges() |
395 const { | 395 const { |
396 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 396 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
397 | 397 |
398 base::AutoLock auto_lock(shared_state_lock_); | 398 base::AutoLock auto_lock(shared_state_lock_); |
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 ReportMetadata(); | 824 ReportMetadata(); |
825 start_timestamp_ = demuxer_->GetStartTime(); | 825 start_timestamp_ = demuxer_->GetStartTime(); |
826 | 826 |
827 return InitializeRenderer(done_cb); | 827 return InitializeRenderer(done_cb); |
828 | 828 |
829 case kPlaying: | 829 case kPlaying: |
830 DCHECK(start_timestamp_ >= base::TimeDelta()); | 830 DCHECK(start_timestamp_ >= base::TimeDelta()); |
831 shared_state_.renderer->StartPlayingFrom(start_timestamp_); | 831 shared_state_.renderer->StartPlayingFrom(start_timestamp_); |
832 { | 832 { |
833 base::AutoLock auto_lock(shared_state_lock_); | 833 base::AutoLock auto_lock(shared_state_lock_); |
834 shared_state_.suspend_timestamp = kNoTimestamp(); | 834 shared_state_.suspend_timestamp = kNoTimestamp; |
835 } | 835 } |
836 | 836 |
837 if (text_renderer_) | 837 if (text_renderer_) |
838 text_renderer_->StartPlaying(); | 838 text_renderer_->StartPlaying(); |
839 | 839 |
840 main_task_runner_->PostTask( | 840 main_task_runner_->PostTask( |
841 FROM_HERE, base::Bind(&PipelineImpl::OnSeekDone, weak_pipeline_, | 841 FROM_HERE, base::Bind(&PipelineImpl::OnSeekDone, weak_pipeline_, |
842 start_timestamp_)); | 842 start_timestamp_)); |
843 | 843 |
844 shared_state_.renderer->SetPlaybackRate(playback_rate_); | 844 shared_state_.renderer->SetPlaybackRate(playback_rate_); |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1295 void PipelineImpl::OnSuspendDone(base::TimeDelta suspend_time) { | 1295 void PipelineImpl::OnSuspendDone(base::TimeDelta suspend_time) { |
1296 DVLOG(3) << __FUNCTION__ << "(" << suspend_time.InMicroseconds() << ")"; | 1296 DVLOG(3) << __FUNCTION__ << "(" << suspend_time.InMicroseconds() << ")"; |
1297 DCHECK(thread_checker_.CalledOnValidThread()); | 1297 DCHECK(thread_checker_.CalledOnValidThread()); |
1298 DCHECK(IsRunning()); | 1298 DCHECK(IsRunning()); |
1299 | 1299 |
1300 DCHECK(!suspend_cb_.is_null()); | 1300 DCHECK(!suspend_cb_.is_null()); |
1301 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); | 1301 base::ResetAndReturn(&suspend_cb_).Run(PIPELINE_OK); |
1302 } | 1302 } |
1303 | 1303 |
1304 } // namespace media | 1304 } // namespace media |
OLD | NEW |