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/filters/video_renderer_impl.h" | 5 #include "media/filters/video_renderer_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 } | 50 } |
51 | 51 |
52 void VideoRendererImpl::Play(const base::Closure& callback) { | 52 void VideoRendererImpl::Play(const base::Closure& callback) { |
53 DCHECK(task_runner_->BelongsToCurrentThread()); | 53 DCHECK(task_runner_->BelongsToCurrentThread()); |
54 base::AutoLock auto_lock(lock_); | 54 base::AutoLock auto_lock(lock_); |
55 DCHECK_EQ(kPrerolled, state_); | 55 DCHECK_EQ(kPrerolled, state_); |
56 state_ = kPlaying; | 56 state_ = kPlaying; |
57 callback.Run(); | 57 callback.Run(); |
58 } | 58 } |
59 | 59 |
60 void VideoRendererImpl::Pause(const base::Closure& callback) { | |
61 DCHECK(task_runner_->BelongsToCurrentThread()); | |
62 base::AutoLock auto_lock(lock_); | |
63 DCHECK_NE(state_, kUninitialized); | |
64 state_ = kPaused; | |
65 callback.Run(); | |
66 } | |
67 | |
68 void VideoRendererImpl::Flush(const base::Closure& callback) { | 60 void VideoRendererImpl::Flush(const base::Closure& callback) { |
69 DCHECK(task_runner_->BelongsToCurrentThread()); | 61 DCHECK(task_runner_->BelongsToCurrentThread()); |
70 base::AutoLock auto_lock(lock_); | 62 base::AutoLock auto_lock(lock_); |
71 DCHECK_EQ(state_, kPaused); | 63 DCHECK_NE(state_, kUninitialized); |
72 flush_cb_ = callback; | 64 flush_cb_ = callback; |
73 state_ = kFlushing; | 65 state_ = kFlushing; |
74 | 66 |
75 // This is necessary if the |video_frame_stream_| has already seen an end of | 67 // This is necessary if the |video_frame_stream_| has already seen an end of |
76 // stream and needs to drain it before flushing it. | 68 // stream and needs to drain it before flushing it. |
77 ready_frames_.clear(); | 69 ready_frames_.clear(); |
78 received_end_of_stream_ = false; | 70 received_end_of_stream_ = false; |
79 rendered_end_of_stream_ = false; | 71 rendered_end_of_stream_ = false; |
80 video_frame_stream_.Reset( | 72 video_frame_stream_.Reset( |
81 base::Bind(&VideoRendererImpl::OnVideoFrameStreamResetDone, | 73 base::Bind(&VideoRendererImpl::OnVideoFrameStreamResetDone, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 base::AutoLock auto_lock(lock_); | 113 base::AutoLock auto_lock(lock_); |
122 playback_rate_ = playback_rate; | 114 playback_rate_ = playback_rate; |
123 } | 115 } |
124 | 116 |
125 void VideoRendererImpl::Preroll(base::TimeDelta time, | 117 void VideoRendererImpl::Preroll(base::TimeDelta time, |
126 const PipelineStatusCB& cb) { | 118 const PipelineStatusCB& cb) { |
127 DCHECK(task_runner_->BelongsToCurrentThread()); | 119 DCHECK(task_runner_->BelongsToCurrentThread()); |
128 base::AutoLock auto_lock(lock_); | 120 base::AutoLock auto_lock(lock_); |
129 DCHECK(!cb.is_null()); | 121 DCHECK(!cb.is_null()); |
130 DCHECK(preroll_cb_.is_null()); | 122 DCHECK(preroll_cb_.is_null()); |
131 DCHECK(state_ == kFlushed || state_== kPaused) << "state_ " << state_; | 123 DCHECK(state_ == kFlushed || state_ == kPlaying) << "state_ " << state_; |
132 | 124 |
133 if (state_ == kFlushed) { | 125 if (state_ == kFlushed) { |
134 DCHECK(time != kNoTimestamp()); | 126 DCHECK(time != kNoTimestamp()); |
135 DCHECK(!pending_read_); | 127 DCHECK(!pending_read_); |
136 DCHECK(ready_frames_.empty()); | 128 DCHECK(ready_frames_.empty()); |
137 } else { | 129 } else { |
138 DCHECK(time == kNoTimestamp()); | 130 DCHECK(time == kNoTimestamp()); |
139 } | 131 } |
140 | 132 |
141 state_ = kPrerolling; | 133 state_ = kPrerolling; |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 void VideoRendererImpl::AttemptRead_Locked() { | 434 void VideoRendererImpl::AttemptRead_Locked() { |
443 DCHECK(task_runner_->BelongsToCurrentThread()); | 435 DCHECK(task_runner_->BelongsToCurrentThread()); |
444 lock_.AssertAcquired(); | 436 lock_.AssertAcquired(); |
445 | 437 |
446 if (pending_read_ || received_end_of_stream_ || | 438 if (pending_read_ || received_end_of_stream_ || |
447 ready_frames_.size() == static_cast<size_t>(limits::kMaxVideoFrames)) { | 439 ready_frames_.size() == static_cast<size_t>(limits::kMaxVideoFrames)) { |
448 return; | 440 return; |
449 } | 441 } |
450 | 442 |
451 switch (state_) { | 443 switch (state_) { |
452 case kPaused: | |
453 case kPrerolling: | 444 case kPrerolling: |
454 case kPrerolled: | 445 case kPrerolled: |
455 case kPlaying: | 446 case kPlaying: |
456 pending_read_ = true; | 447 pending_read_ = true; |
457 video_frame_stream_.Read(base::Bind(&VideoRendererImpl::FrameReady, | 448 video_frame_stream_.Read(base::Bind(&VideoRendererImpl::FrameReady, |
458 weak_factory_.GetWeakPtr())); | 449 weak_factory_.GetWeakPtr())); |
459 return; | 450 return; |
460 | 451 |
461 case kUninitialized: | 452 case kUninitialized: |
462 case kInitializing: | 453 case kInitializing: |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 statistics_cb_.Run(statistics); | 521 statistics_cb_.Run(statistics); |
531 | 522 |
532 frames_decoded_ = 0; | 523 frames_decoded_ = 0; |
533 frames_dropped_ = 0; | 524 frames_dropped_ = 0; |
534 } | 525 } |
535 | 526 |
536 frame_available_.TimedWait(wait_duration); | 527 frame_available_.TimedWait(wait_duration); |
537 } | 528 } |
538 | 529 |
539 } // namespace media | 530 } // namespace media |
OLD | NEW |