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

Unified Diff: media/filters/video_decoder_selector.cc

Issue 14348007: Reland: Remove reference counting from media::VideoDecoder and friends. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixes 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
« no previous file with comments | « media/filters/video_decoder_selector.h ('k') | media/filters/video_decoder_selector_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/video_decoder_selector.cc
diff --git a/media/filters/video_decoder_selector.cc b/media/filters/video_decoder_selector.cc
index b1f186f2cf280abaab4a8181ae1d5a49ecee00ef..f1aebb26426a476fd85f7316fd50ab1a55811654 100644
--- a/media/filters/video_decoder_selector.cc
+++ b/media/filters/video_decoder_selector.cc
@@ -19,10 +19,10 @@ namespace media {
VideoDecoderSelector::VideoDecoderSelector(
const scoped_refptr<base::MessageLoopProxy>& message_loop,
- const VideoDecoderList& decoders,
+ ScopedVector<VideoDecoder> decoders,
const SetDecryptorReadyCB& set_decryptor_ready_cb)
: message_loop_(message_loop),
- decoders_(decoders),
+ decoders_(decoders.Pass()),
set_decryptor_ready_cb_(set_decryptor_ready_cb),
ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) {
}
@@ -43,7 +43,8 @@ void VideoDecoderSelector::SelectVideoDecoder(
const VideoDecoderConfig& config = stream->video_decoder_config();
if (!config.IsValidConfig()) {
DLOG(ERROR) << "Invalid video stream config.";
- base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(
+ scoped_ptr<VideoDecoder>(), NULL);
return;
}
@@ -51,24 +52,19 @@ void VideoDecoderSelector::SelectVideoDecoder(
statistics_cb_ = statistics_cb;
if (!config.is_encrypted()) {
- 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();
+ InitializeDecoder(decoders_.begin());
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(NULL, NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(
+ scoped_ptr<VideoDecoder>(), NULL);
return;
}
- video_decoder_ = new DecryptingVideoDecoder(message_loop_,
- set_decryptor_ready_cb_);
+ video_decoder_.reset(new DecryptingVideoDecoder(
+ message_loop_, set_decryptor_ready_cb_));
video_decoder_->Initialize(
input_stream_,
@@ -83,16 +79,7 @@ void VideoDecoderSelector::DecryptingVideoDecoderInitDone(
DCHECK(message_loop_->BelongsToCurrentThread());
if (status == PIPELINE_OK) {
- 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);
+ base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder_.Pass(), NULL);
return;
}
@@ -112,42 +99,48 @@ void VideoDecoderSelector::DecryptingDemuxerStreamInitDone(
if (status != PIPELINE_OK) {
decrypted_stream_ = NULL;
- base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
+ base::ResetAndReturn(&select_decoder_cb_).Run(
+ scoped_ptr<VideoDecoder>(), NULL);
return;
}
DCHECK(!decrypted_stream_->video_decoder_config().is_encrypted());
input_stream_ = decrypted_stream_;
- InitializeNextDecoder();
+ InitializeDecoder(decoders_.begin());
}
-void VideoDecoderSelector::InitializeNextDecoder() {
+void VideoDecoderSelector::InitializeDecoder(
+ ScopedVector<VideoDecoder>::iterator iter) {
DCHECK(message_loop_->BelongsToCurrentThread());
- DCHECK(!decoders_.empty());
-
- 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_);
+
+ 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_);
}
-void VideoDecoderSelector::DecoderInitDone(PipelineStatus status) {
+void VideoDecoderSelector::DecoderInitDone(
+ ScopedVector<VideoDecoder>::iterator iter, PipelineStatus status) {
DCHECK(message_loop_->BelongsToCurrentThread());
if (status != PIPELINE_OK) {
- if (!decoders_.empty())
- InitializeNextDecoder();
- else
- base::ResetAndReturn(&select_decoder_cb_).Run(NULL, NULL);
+ InitializeDecoder(++iter);
return;
}
- decoders_.clear();
- base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder_,
+ scoped_ptr<VideoDecoder> video_decoder(*iter);
+ decoders_.weak_erase(iter);
+
+ base::ResetAndReturn(&select_decoder_cb_).Run(video_decoder.Pass(),
decrypted_stream_);
}
« no previous file with comments | « media/filters/video_decoder_selector.h ('k') | media/filters/video_decoder_selector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698