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

Unified Diff: trunk/src/media/filters/video_decoder_selector.cc

Issue 14320005: Revert 194993 "Remove reference counting from media::VideoDecode..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: trunk/src/media/filters/video_decoder_selector.cc
===================================================================
--- trunk/src/media/filters/video_decoder_selector.cc (revision 195011)
+++ trunk/src/media/filters/video_decoder_selector.cc (working copy)
@@ -19,10 +19,10 @@
VideoDecoderSelector::VideoDecoderSelector(
const scoped_refptr<base::MessageLoopProxy>& message_loop,
- ScopedVector<VideoDecoder> decoders,
+ const VideoDecoderList& decoders,
const SetDecryptorReadyCB& set_decryptor_ready_cb)
: message_loop_(message_loop),
- decoders_(decoders.Pass()),
+ decoders_(decoders),
set_decryptor_ready_cb_(set_decryptor_ready_cb),
ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
}
@@ -43,8 +43,7 @@
const VideoDecoderConfig& config = stream->video_decoder_config();
if (!config.IsValidConfig()) {
DLOG(ERROR) << "Invalid video stream config.";
- base::ResetAndReturn(&select_decoder_cb_).Run(
- scoped_ptr<VideoDecoder>(), NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
return;
}
@@ -52,19 +51,24 @@
statistics_cb_ = statistics_cb;
if (!config.is_encrypted()) {
- InitializeDecoder(decoders_.begin());
+ if (decoders_.empty()) {
+ DLOG(ERROR) << "No video decoder can be used to decode the input stream.";
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
+ return;
+ }
+
+ InitializeNextDecoder();
return;
}
// This could happen if Encrypted Media Extension (EME) is not enabled.
if (set_decryptor_ready_cb_.is_null()) {
- base::ResetAndReturn(&select_decoder_cb_).Run(
- scoped_ptr<VideoDecoder>(), NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
return;
}
- video_decoder_.reset(new DecryptingVideoDecoder(
- message_loop_, set_decryptor_ready_cb_));
+ video_decoder_ = new DecryptingVideoDecoder(message_loop_,
+ set_decryptor_ready_cb_);
video_decoder_->Initialize(
input_stream_,
@@ -79,10 +83,19 @@
DCHECK(message_loop_->BelongsToCurrentThread());
if (status == PIPELINE_OK) {
- base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder_.Pass(), NULL);
+ decoders_.clear();
+ base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder_, NULL);
return;
}
+ video_decoder_ = NULL;
+
+ if (decoders_.empty()) {
+ DLOG(ERROR) << "No video decoder can be used to decode the input stream.";
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
+ return;
+ }
+
decrypted_stream_ = new DecryptingDemuxerStream(
message_loop_, set_decryptor_ready_cb_);
@@ -99,48 +112,42 @@
if (status != PIPELINE_OK) {
decrypted_stream_ = NULL;
- base::ResetAndReturn(&select_decoder_cb_).Run(
- scoped_ptr<VideoDecoder>(), NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
return;
}
DCHECK(!decrypted_stream_->video_decoder_config().is_encrypted());
input_stream_ = decrypted_stream_;
- InitializeDecoder(decoders_.begin());
+ InitializeNextDecoder();
}
-void VideoDecoderSelector::InitializeDecoder(
- ScopedVector<VideoDecoder>::iterator iter) {
+void VideoDecoderSelector::InitializeNextDecoder() {
DCHECK(message_loop_->BelongsToCurrentThread());
+ DCHECK(!decoders_.empty());
- if (iter == decoders_.end()) {
- base::ResetAndReturn(&select_decoder_cb_).Run(
- scoped_ptr<VideoDecoder>(), NULL);
- return;
- }
-
- (*iter)->Initialize(
- input_stream_,
- BindToCurrentLoop(base::Bind(
- &VideoDecoderSelector::DecoderInitDone,
- weak_ptr_factory_.GetWeakPtr(),
- iter)),
- statistics_cb_);
+ video_decoder_ = decoders_.front();
+ decoders_.pop_front();
+ DCHECK(video_decoder_);
+ video_decoder_->Initialize(input_stream_,
+ BindToCurrentLoop(base::Bind(
+ &VideoDecoderSelector::DecoderInitDone,
+ weak_ptr_factory_.GetWeakPtr())),
+ statistics_cb_);
}
-void VideoDecoderSelector::DecoderInitDone(
- ScopedVector<VideoDecoder>::iterator iter, PipelineStatus status) {
+void VideoDecoderSelector::DecoderInitDone(PipelineStatus status) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (status != PIPELINE_OK) {
- InitializeDecoder(++iter);
+ if (!decoders_.empty())
+ InitializeNextDecoder();
+ else
+ base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
return;
}
- scoped_ptr<VideoDecoder> video_decoder(*iter);
- decoders_.weak_erase(iter);
-
- base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder.Pass(),
+ decoders_.clear();
+ base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder_,
decrypted_stream_);
}
« no previous file with comments | « trunk/src/media/filters/video_decoder_selector.h ('k') | trunk/src/media/filters/video_decoder_selector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698