| Index: media/filters/video_frame_stream.cc
|
| diff --git a/media/filters/video_frame_stream.cc b/media/filters/video_frame_stream.cc
|
| index 93f2a0ea16d304a138a2963beb190c989ca4c513..13d8b38fc6eaf800ce4cdf602318e052e491c3ad 100644
|
| --- a/media/filters/video_frame_stream.cc
|
| +++ b/media/filters/video_frame_stream.cc
|
| @@ -24,15 +24,16 @@ VideoFrameStream::VideoFrameStream(
|
| : message_loop_(message_loop),
|
| weak_factory_(this),
|
| state_(UNINITIALIZED),
|
| - decoders_(decoders.Pass()),
|
| - set_decryptor_ready_cb_(set_decryptor_ready_cb) {
|
| + stream_(NULL),
|
| + decoder_selector_(new VideoDecoderSelector(
|
| + message_loop, decoders.Pass(), set_decryptor_ready_cb)) {
|
| }
|
|
|
| VideoFrameStream::~VideoFrameStream() {
|
| DCHECK(state_ == UNINITIALIZED || state_ == STOPPED) << state_;
|
| }
|
|
|
| -void VideoFrameStream::Initialize(const scoped_refptr<DemuxerStream>& stream,
|
| +void VideoFrameStream::Initialize(DemuxerStream* stream,
|
| const StatisticsCB& statistics_cb,
|
| const InitCB& init_cb) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| @@ -45,18 +46,8 @@ void VideoFrameStream::Initialize(const scoped_refptr<DemuxerStream>& stream,
|
| init_cb_ = init_cb;
|
| stream_ = stream;
|
|
|
| - // TODO(scherkus): Make |decoder_selector| a member variable after
|
| - // DemuxerStream is no longer refcounted. Today we're forced to do this
|
| - // because it creates a refcount loop between |this| and |decoder_selector|.
|
| - scoped_ptr<VideoDecoderSelector> decoder_selector(new VideoDecoderSelector(
|
| - message_loop_, decoders_.Pass(), set_decryptor_ready_cb_));
|
| - set_decryptor_ready_cb_.Reset();
|
| -
|
| - VideoDecoderSelector* decoder_selector_ptr = decoder_selector.get();
|
| -
|
| - decoder_selector_ptr->SelectVideoDecoder(this, statistics_cb, base::Bind(
|
| - &VideoFrameStream::OnDecoderSelected, weak_this_,
|
| - base::Passed(&decoder_selector)));
|
| + decoder_selector_->SelectVideoDecoder(this, statistics_cb, base::Bind(
|
| + &VideoFrameStream::OnDecoderSelected, weak_this_));
|
| }
|
|
|
| void VideoFrameStream::ReadFrame(const VideoDecoder::ReadCB& read_cb) {
|
| @@ -122,12 +113,9 @@ void VideoFrameStream::Stop(const base::Closure& closure) {
|
| }
|
|
|
| state_ = STOPPED;
|
| - // Break the ref-count loop so we don't leak objects.
|
| - // TODO(scherkus): Make DemuxerStream and/or VideoDecoder not ref-counted so
|
| - // we don't need this here. See: http://crbug.com/173313
|
| stream_ = NULL;
|
| - decrypting_demuxer_stream_ = NULL;
|
| decoder_.reset();
|
| + decrypting_demuxer_stream_.reset();
|
| message_loop_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_));
|
| }
|
|
|
| @@ -163,19 +151,19 @@ void VideoFrameStream::EnableBitstreamConverter() {
|
| }
|
|
|
| void VideoFrameStream::OnDecoderSelected(
|
| - scoped_ptr<VideoDecoderSelector> decoder_selector,
|
| scoped_ptr<VideoDecoder> selected_decoder,
|
| - const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) {
|
| + scoped_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream) {
|
| DCHECK(message_loop_->BelongsToCurrentThread());
|
| DCHECK_EQ(state_, UNINITIALIZED);
|
| DCHECK(!init_cb_.is_null());
|
| + decoder_selector_.reset();
|
|
|
| if (!selected_decoder) {
|
| state_ = UNINITIALIZED;
|
| base::ResetAndReturn(&init_cb_).Run(false, false);
|
| } else {
|
| decoder_ = selected_decoder.Pass();
|
| - decrypting_demuxer_stream_ = decrypting_demuxer_stream;
|
| + decrypting_demuxer_stream_ = decrypting_demuxer_stream.Pass();
|
| state_ = NORMAL;
|
| base::ResetAndReturn(&init_cb_).Run(true, decoder_->HasAlpha());
|
| }
|
| @@ -233,12 +221,9 @@ void VideoFrameStream::OnDecoderStopped() {
|
| DCHECK(!stop_cb_.is_null());
|
|
|
| state_ = STOPPED;
|
| - // Break the ref-count loop so we don't leak objects.
|
| - // TODO(scherkus): Make DemuxerStream and/or VideoDecoder not ref-counted so
|
| - // we don't need this here. See: http://crbug.com/173313
|
| stream_ = NULL;
|
| - decrypting_demuxer_stream_ = NULL;
|
| decoder_.reset();
|
| + decrypting_demuxer_stream_.reset();
|
| base::ResetAndReturn(&stop_cb_).Run();
|
| }
|
|
|
|
|