| 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/filters/video_renderer_base.h" | 5 #include "media/filters/video_renderer_base.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/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 } | 109 } |
| 110 if (thread_to_join != base::kNullThreadHandle) | 110 if (thread_to_join != base::kNullThreadHandle) |
| 111 base::PlatformThread::Join(thread_to_join); | 111 base::PlatformThread::Join(thread_to_join); |
| 112 | 112 |
| 113 if (decrypting_demuxer_stream_) { | 113 if (decrypting_demuxer_stream_) { |
| 114 decrypting_demuxer_stream_->Reset(base::Bind( | 114 decrypting_demuxer_stream_->Reset(base::Bind( |
| 115 &VideoRendererBase::StopDecoder, this, callback)); | 115 &VideoRendererBase::StopDecoder, this, callback)); |
| 116 return; | 116 return; |
| 117 } | 117 } |
| 118 | 118 |
| 119 decoder_->Stop(callback); | 119 if (decoder_) { |
| 120 decoder_->Stop(callback); |
| 121 return; |
| 122 } |
| 123 |
| 124 callback.Run(); |
| 120 } | 125 } |
| 121 | 126 |
| 122 void VideoRendererBase::StopDecoder(const base::Closure& callback) { | 127 void VideoRendererBase::StopDecoder(const base::Closure& callback) { |
| 123 DCHECK(message_loop_->BelongsToCurrentThread()); | 128 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 124 base::AutoLock auto_lock(lock_); | 129 base::AutoLock auto_lock(lock_); |
| 125 decoder_->Stop(callback); | 130 decoder_->Stop(callback); |
| 126 } | 131 } |
| 127 | 132 |
| 128 void VideoRendererBase::SetPlaybackRate(float playback_rate) { | 133 void VideoRendererBase::SetPlaybackRate(float playback_rate) { |
| 129 DCHECK(message_loop_->BelongsToCurrentThread()); | 134 DCHECK(message_loop_->BelongsToCurrentThread()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 DCHECK_EQ(kUninitialized, state_); | 176 DCHECK_EQ(kUninitialized, state_); |
| 172 | 177 |
| 173 init_cb_ = init_cb; | 178 init_cb_ = init_cb; |
| 174 statistics_cb_ = statistics_cb; | 179 statistics_cb_ = statistics_cb; |
| 175 max_time_cb_ = max_time_cb; | 180 max_time_cb_ = max_time_cb; |
| 176 size_changed_cb_ = size_changed_cb; | 181 size_changed_cb_ = size_changed_cb; |
| 177 ended_cb_ = ended_cb; | 182 ended_cb_ = ended_cb; |
| 178 error_cb_ = error_cb; | 183 error_cb_ = error_cb; |
| 179 get_time_cb_ = get_time_cb; | 184 get_time_cb_ = get_time_cb; |
| 180 get_duration_cb_ = get_duration_cb; | 185 get_duration_cb_ = get_duration_cb; |
| 186 state_ = kInitializing; |
| 181 | 187 |
| 182 scoped_ptr<VideoDecoderSelector> decoder_selector( | 188 scoped_ptr<VideoDecoderSelector> decoder_selector( |
| 183 new VideoDecoderSelector(base::MessageLoopProxy::current(), | 189 new VideoDecoderSelector(base::MessageLoopProxy::current(), |
| 184 decoders, | 190 decoders, |
| 185 set_decryptor_ready_cb_)); | 191 set_decryptor_ready_cb_)); |
| 186 | 192 |
| 187 // To avoid calling |decoder_selector| methods and passing ownership of | 193 // To avoid calling |decoder_selector| methods and passing ownership of |
| 188 // |decoder_selector| in the same line. | 194 // |decoder_selector| in the same line. |
| 189 VideoDecoderSelector* decoder_selector_ptr = decoder_selector.get(); | 195 VideoDecoderSelector* decoder_selector_ptr = decoder_selector.get(); |
| 190 | 196 |
| 191 decoder_selector_ptr->SelectVideoDecoder( | 197 decoder_selector_ptr->SelectVideoDecoder( |
| 192 stream, | 198 stream, |
| 193 statistics_cb, | 199 statistics_cb, |
| 194 base::Bind(&VideoRendererBase::OnDecoderSelected, this, | 200 base::Bind(&VideoRendererBase::OnDecoderSelected, this, |
| 195 base::Passed(&decoder_selector))); | 201 base::Passed(&decoder_selector))); |
| 196 } | 202 } |
| 197 | 203 |
| 198 void VideoRendererBase::OnDecoderSelected( | 204 void VideoRendererBase::OnDecoderSelected( |
| 199 scoped_ptr<VideoDecoderSelector> decoder_selector, | 205 scoped_ptr<VideoDecoderSelector> decoder_selector, |
| 200 const scoped_refptr<VideoDecoder>& selected_decoder, | 206 const scoped_refptr<VideoDecoder>& selected_decoder, |
| 201 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) { | 207 const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) { |
| 202 DCHECK(message_loop_->BelongsToCurrentThread()); | 208 DCHECK(message_loop_->BelongsToCurrentThread()); |
| 203 base::AutoLock auto_lock(lock_); | 209 base::AutoLock auto_lock(lock_); |
| 204 | 210 |
| 205 if (state_ == kStopped) | 211 if (state_ == kStopped) |
| 206 return; | 212 return; |
| 207 | 213 |
| 214 DCHECK_EQ(state_, kInitializing); |
| 215 |
| 208 if (!selected_decoder) { | 216 if (!selected_decoder) { |
| 209 state_ = kUninitialized; | 217 state_ = kUninitialized; |
| 210 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); | 218 base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| 211 return; | 219 return; |
| 212 } | 220 } |
| 213 | 221 |
| 214 decoder_ = selected_decoder; | 222 decoder_ = selected_decoder; |
| 215 decrypting_demuxer_stream_ = decrypting_demuxer_stream; | 223 decrypting_demuxer_stream_ = decrypting_demuxer_stream; |
| 216 | 224 |
| 217 // We're all good! Consider ourselves flushed. (ThreadMain() should never | 225 // We're all good! Consider ourselves flushed. (ThreadMain() should never |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 switch (state_) { | 614 switch (state_) { |
| 607 case kPaused: | 615 case kPaused: |
| 608 case kFlushing: | 616 case kFlushing: |
| 609 case kPrerolling: | 617 case kPrerolling: |
| 610 case kPlaying: | 618 case kPlaying: |
| 611 pending_read_ = true; | 619 pending_read_ = true; |
| 612 decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); | 620 decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); |
| 613 return; | 621 return; |
| 614 | 622 |
| 615 case kUninitialized: | 623 case kUninitialized: |
| 624 case kInitializing: |
| 616 case kPrerolled: | 625 case kPrerolled: |
| 617 case kFlushingDecoder: | 626 case kFlushingDecoder: |
| 618 case kFlushed: | 627 case kFlushed: |
| 619 case kEnded: | 628 case kEnded: |
| 620 case kStopped: | 629 case kStopped: |
| 621 case kError: | 630 case kError: |
| 622 return; | 631 return; |
| 623 } | 632 } |
| 624 } | 633 } |
| 625 | 634 |
| 626 void VideoRendererBase::OnDecoderResetDone() { | 635 void VideoRendererBase::OnDecoderResetDone() { |
| 627 base::AutoLock auto_lock(lock_); | 636 base::AutoLock auto_lock(lock_); |
| 637 if (state_ == kStopped) |
| 638 return; |
| 639 |
| 628 DCHECK_EQ(kFlushingDecoder, state_); | 640 DCHECK_EQ(kFlushingDecoder, state_); |
| 629 DCHECK(!pending_read_); | 641 DCHECK(!pending_read_); |
| 630 | 642 |
| 631 state_ = kFlushing; | 643 state_ = kFlushing; |
| 632 AttemptFlush_Locked(); | 644 AttemptFlush_Locked(); |
| 633 } | 645 } |
| 634 | 646 |
| 635 void VideoRendererBase::AttemptFlush_Locked() { | 647 void VideoRendererBase::AttemptFlush_Locked() { |
| 636 lock_.AssertAcquired(); | 648 lock_.AssertAcquired(); |
| 637 DCHECK_EQ(kFlushing, state_); | 649 DCHECK_EQ(kFlushing, state_); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 | 682 |
| 671 int VideoRendererBase::NumFrames_Locked() const { | 683 int VideoRendererBase::NumFrames_Locked() const { |
| 672 lock_.AssertAcquired(); | 684 lock_.AssertAcquired(); |
| 673 int outstanding_frames = | 685 int outstanding_frames = |
| 674 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + | 686 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + |
| 675 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); | 687 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); |
| 676 return ready_frames_.size() + outstanding_frames; | 688 return ready_frames_.size() + outstanding_frames; |
| 677 } | 689 } |
| 678 | 690 |
| 679 } // namespace media | 691 } // namespace media |
| OLD | NEW |