Index: media/filters/video_renderer_base.cc |
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc |
index ca8f3429c737089d9b4ec07aeda5501aec64689b..4a5af4d1a05dbb5b4386db80346b937d2d68ec77 100644 |
--- a/media/filters/video_renderer_base.cc |
+++ b/media/filters/video_renderer_base.cc |
@@ -14,7 +14,6 @@ |
#include "media/base/pipeline.h" |
#include "media/base/video_frame.h" |
#include "media/filters/decrypting_demuxer_stream.h" |
-#include "media/filters/video_decoder_selector.h" |
namespace media { |
@@ -30,7 +29,7 @@ VideoRendererBase::VideoRendererBase( |
bool drop_frames) |
: message_loop_(message_loop), |
weak_factory_(this), |
- set_decryptor_ready_cb_(set_decryptor_ready_cb), |
+ video_frame_stream_(message_loop, set_decryptor_ready_cb), |
received_end_of_stream_(false), |
frame_available_(&lock_), |
state_(kUninitialized), |
@@ -73,21 +72,8 @@ void VideoRendererBase::Flush(const base::Closure& callback) { |
flush_cb_ = callback; |
state_ = kFlushingDecoder; |
- if (decrypting_demuxer_stream_) { |
- decrypting_demuxer_stream_->Reset(base::Bind( |
- &VideoRendererBase::ResetDecoder, weak_this_)); |
- return; |
- } |
- |
- decoder_->Reset(base::Bind( |
- &VideoRendererBase::OnDecoderResetDone, weak_this_)); |
-} |
- |
-void VideoRendererBase::ResetDecoder() { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- base::AutoLock auto_lock(lock_); |
- decoder_->Reset(base::Bind( |
- &VideoRendererBase::OnDecoderResetDone, weak_this_)); |
+ video_frame_stream_.Reset(base::Bind( |
+ &VideoRendererBase::OnVideoFrameStreamResetDone, weak_this_)); |
} |
void VideoRendererBase::Stop(const base::Closure& callback) { |
@@ -121,24 +107,7 @@ void VideoRendererBase::Stop(const base::Closure& callback) { |
base::PlatformThread::Join(thread_to_join); |
} |
- if (decrypting_demuxer_stream_) { |
- decrypting_demuxer_stream_->Reset(base::Bind( |
- &VideoRendererBase::StopDecoder, weak_this_, callback)); |
- return; |
- } |
- |
- if (decoder_) { |
- decoder_->Stop(callback); |
- return; |
- } |
- |
- callback.Run(); |
-} |
- |
-void VideoRendererBase::StopDecoder(const base::Closure& callback) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- base::AutoLock auto_lock(lock_); |
- decoder_->Stop(callback); |
+ video_frame_stream_.Stop(callback); |
} |
void VideoRendererBase::SetPlaybackRate(float playback_rate) { |
@@ -196,26 +165,16 @@ void VideoRendererBase::Initialize(const scoped_refptr<DemuxerStream>& stream, |
get_duration_cb_ = get_duration_cb; |
state_ = kInitializing; |
- scoped_ptr<VideoDecoderSelector> decoder_selector( |
- new VideoDecoderSelector(base::MessageLoopProxy::current(), |
- decoders, |
- set_decryptor_ready_cb_)); |
- |
- // To avoid calling |decoder_selector| methods and passing ownership of |
- // |decoder_selector| in the same line. |
- VideoDecoderSelector* decoder_selector_ptr = decoder_selector.get(); |
- |
- decoder_selector_ptr->SelectVideoDecoder( |
+ video_frame_stream_.Initialize( |
stream, |
+ decoders, |
statistics_cb, |
- base::Bind(&VideoRendererBase::OnDecoderSelected, weak_this_, |
- base::Passed(&decoder_selector))); |
+ base::Bind(&VideoRendererBase::OnVideoFrameStreamInitialized, |
+ weak_this_)); |
} |
-void VideoRendererBase::OnDecoderSelected( |
- scoped_ptr<VideoDecoderSelector> decoder_selector, |
- const scoped_refptr<VideoDecoder>& selected_decoder, |
- const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) { |
+void VideoRendererBase::OnVideoFrameStreamInitialized(bool success, |
+ bool has_alpha) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
base::AutoLock auto_lock(lock_); |
@@ -224,22 +183,19 @@ void VideoRendererBase::OnDecoderSelected( |
DCHECK_EQ(state_, kInitializing); |
- if (!selected_decoder) { |
+ if (!success) { |
state_ = kUninitialized; |
base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
return; |
} |
- decoder_ = selected_decoder; |
- decrypting_demuxer_stream_ = decrypting_demuxer_stream; |
- |
// We're all good! Consider ourselves flushed. (ThreadMain() should never |
// see us in the kUninitialized state). |
// Since we had an initial Preroll(), we consider ourself flushed, because we |
// have not populated any buffers yet. |
state_ = kFlushed; |
- set_opaque_cb_.Run(!decoder_->HasAlpha()); |
+ set_opaque_cb_.Run(!has_alpha); |
set_opaque_cb_.Reset(); |
// Create our video thread. |
@@ -437,7 +393,7 @@ void VideoRendererBase::FrameReady(VideoDecoder::Status status, |
AddReadyFrame_Locked(frame); |
if (state_ == kPrerolling) { |
- if (!decoder_->HasOutputFrameAvailable() || |
+ if (!video_frame_stream_.HasOutputFrameAvailable() || |
ready_frames_.size() >= static_cast<size_t>(limits::kMaxVideoFrames)) { |
TransitionToPrerolled_Locked(); |
} |
@@ -501,7 +457,8 @@ void VideoRendererBase::AttemptRead_Locked() { |
case kPrerolling: |
case kPlaying: |
pending_read_ = true; |
- decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, weak_this_)); |
+ video_frame_stream_.ReadFrame(base::Bind(&VideoRendererBase::FrameReady, |
+ weak_this_)); |
return; |
case kUninitialized: |
@@ -516,7 +473,7 @@ void VideoRendererBase::AttemptRead_Locked() { |
} |
} |
-void VideoRendererBase::OnDecoderResetDone() { |
+void VideoRendererBase::OnVideoFrameStreamResetDone() { |
base::AutoLock auto_lock(lock_); |
if (state_ == kStopped) |
return; |