Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(497)

Side by Side Diff: media/filters/video_renderer_base.cc

Issue 12335105: Merge 184048 (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1364/src/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/video_renderer_base.h ('k') | media/filters/video_renderer_base_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 switch (state_) { 611 switch (state_) {
604 case kPaused: 612 case kPaused:
605 case kFlushing: 613 case kFlushing:
606 case kPrerolling: 614 case kPrerolling:
607 case kPlaying: 615 case kPlaying:
608 pending_read_ = true; 616 pending_read_ = true;
609 decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); 617 decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this));
610 return; 618 return;
611 619
612 case kUninitialized: 620 case kUninitialized:
621 case kInitializing:
613 case kPrerolled: 622 case kPrerolled:
614 case kFlushingDecoder: 623 case kFlushingDecoder:
615 case kFlushed: 624 case kFlushed:
616 case kEnded: 625 case kEnded:
617 case kStopped: 626 case kStopped:
618 case kError: 627 case kError:
619 return; 628 return;
620 } 629 }
621 } 630 }
622 631
623 void VideoRendererBase::OnDecoderResetDone() { 632 void VideoRendererBase::OnDecoderResetDone() {
624 base::AutoLock auto_lock(lock_); 633 base::AutoLock auto_lock(lock_);
634 if (state_ == kStopped)
635 return;
636
625 DCHECK_EQ(kFlushingDecoder, state_); 637 DCHECK_EQ(kFlushingDecoder, state_);
626 DCHECK(!pending_read_); 638 DCHECK(!pending_read_);
627 639
628 state_ = kFlushing; 640 state_ = kFlushing;
629 AttemptFlush_Locked(); 641 AttemptFlush_Locked();
630 } 642 }
631 643
632 void VideoRendererBase::AttemptFlush_Locked() { 644 void VideoRendererBase::AttemptFlush_Locked() {
633 lock_.AssertAcquired(); 645 lock_.AssertAcquired();
634 DCHECK_EQ(kFlushing, state_); 646 DCHECK_EQ(kFlushing, state_);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 679
668 int VideoRendererBase::NumFrames_Locked() const { 680 int VideoRendererBase::NumFrames_Locked() const {
669 lock_.AssertAcquired(); 681 lock_.AssertAcquired();
670 int outstanding_frames = 682 int outstanding_frames =
671 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + 683 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) +
672 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); 684 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0);
673 return ready_frames_.size() + outstanding_frames; 685 return ready_frames_.size() + outstanding_frames;
674 } 686 }
675 687
676 } // namespace media 688 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/video_renderer_base.h ('k') | media/filters/video_renderer_base_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698