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

Unified Diff: media/filters/audio_renderer_impl.cc

Issue 11492003: Encrypted Media: Support Audio Decrypt-Only. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: working and not hacky; need to update comments and tests Created 8 years 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: media/filters/audio_renderer_impl.cc
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc
index c07048161d9967fde1beb70e79059d208d7e2719..00f26b27f19a0aa649f0392c091082d0314bdf77 100644
--- a/media/filters/audio_renderer_impl.cc
+++ b/media/filters/audio_renderer_impl.cc
@@ -19,6 +19,8 @@
#include "media/base/bind_to_loop.h"
#include "media/base/demuxer_stream.h"
#include "media/base/media_switches.h"
+#include "media/filters/audio_decoder_factory.h"
+#include "media/filters/decrypting_demuxer_stream.h"
namespace media {
@@ -92,6 +94,14 @@ void AudioRendererImpl::DoPause() {
void AudioRendererImpl::Flush(const base::Closure& callback) {
DCHECK(pipeline_thread_checker_.CalledOnValidThread());
+
+ // XXX(xhwang): We we want to wait for decrypting_demuxer_stream_->Reset() to
+ // fire the callback? It seems it's not strictly necessary. If that's true,
+ // shall we remove the completion callback in DecyrptingDemuxerStream::Reset()
+ // all together?
+ if (decrypting_demuxer_stream_)
+ decrypting_demuxer_stream_->Reset(base::Bind(&base::DoNothing));
xhwang 2012/12/11 02:27:40 Similar to what we are doing in media pipeline, th
ddorwin 2012/12/11 05:13:34 I defer to scherkus.
scherkus (not reviewing) 2012/12/11 20:52:15 Why do we not need to wait? Is it because it's syn
xhwang 2012/12/12 23:43:28 Added another callback so we actually wait.
+
decoder_->Reset(callback);
}
@@ -149,15 +159,17 @@ void AudioRendererImpl::Preroll(base::TimeDelta time,
sink_->Pause(true);
}
-void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream,
- const AudioDecoderList& decoders,
- const PipelineStatusCB& init_cb,
- const StatisticsCB& statistics_cb,
- const base::Closure& underflow_cb,
- const TimeCB& time_cb,
- const base::Closure& ended_cb,
- const base::Closure& disabled_cb,
- const PipelineStatusCB& error_cb) {
+void AudioRendererImpl::Initialize(
+ const scoped_refptr<DemuxerStream>& stream,
+ const AudioDecoderList& decoders,
+ const RequestDecryptorNotificationCB& request_decryptor_notification_cb,
+ const PipelineStatusCB& init_cb,
+ const StatisticsCB& statistics_cb,
+ const base::Closure& underflow_cb,
+ const TimeCB& time_cb,
+ const base::Closure& ended_cb,
+ const base::Closure& disabled_cb,
+ const PipelineStatusCB& error_cb) {
DCHECK(pipeline_thread_checker_.CalledOnValidThread());
DCHECK(stream);
DCHECK(!decoders.empty());
@@ -180,46 +192,31 @@ void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream,
disabled_cb_ = disabled_cb;
error_cb_ = error_cb;
- scoped_ptr<AudioDecoderList> decoder_list(new AudioDecoderList(decoders));
- InitializeNextDecoder(stream, decoder_list.Pass());
-}
-
-void AudioRendererImpl::InitializeNextDecoder(
- const scoped_refptr<DemuxerStream>& demuxer_stream,
- scoped_ptr<AudioDecoderList> decoders) {
- DCHECK(pipeline_thread_checker_.CalledOnValidThread());
- DCHECK(!decoders->empty());
-
- scoped_refptr<AudioDecoder> decoder = decoders->front();
- decoders->pop_front();
-
- DCHECK(decoder);
- decoder_ = decoder;
- decoder->Initialize(
- demuxer_stream, BindToLoop(base::MessageLoopProxy::current(), base::Bind(
- &AudioRendererImpl::OnDecoderInitDone, this, demuxer_stream,
- base::Passed(&decoders))),
- statistics_cb_);
+ factory_.reset(new AudioDecoderFactory(base::MessageLoopProxy::current(),
+ decoders,
+ request_decryptor_notification_cb));
+ factory_->InitAudioDecoder(
+ stream,
+ statistics_cb,
+ base::Bind(&AudioRendererImpl::OnDecoderInitDone, this));
}
void AudioRendererImpl::OnDecoderInitDone(
- const scoped_refptr<DemuxerStream>& demuxer_stream,
- scoped_ptr<AudioDecoderList> decoders,
- PipelineStatus status) {
+ const scoped_refptr<AudioDecoder>& audio_decoder,
ddorwin 2012/12/11 05:13:34 Would selected_decoder be a more helpful name?
xhwang 2012/12/12 23:43:28 Done.
+ const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) {
DCHECK(pipeline_thread_checker_.CalledOnValidThread());
+ decoder_ = audio_decoder;
+ decrypting_demuxer_stream_ = decrypting_demuxer_stream;
+ factory_.reset();
ddorwin 2012/12/11 05:13:34 Should we have the factory manage its own lifetime
xhwang 2012/12/11 19:43:04 After the audio decoder (and decrypting_demuxer_st
ddorwin 2012/12/12 00:30:25 Init() AddRef()'s then errors or success DeRef() a
xhwang 2012/12/12 23:43:28 Pass the scoped_ptr in the callback to keep it ali
+
if (state_ == kStopped) {
DCHECK(!sink_);
ddorwin 2012/12/11 05:13:34 Should we have stored decoder_ at 209 in this case
xhwang 2012/12/11 19:43:04 It's a little tricky. We are passing const-ref of
return;
}
- if (!decoders->empty() && status == DECODER_ERROR_NOT_SUPPORTED) {
- InitializeNextDecoder(demuxer_stream, decoders.Pass());
- return;
- }
-
- if (status != PIPELINE_OK) {
- base::ResetAndReturn(&init_cb_).Run(status);
+ if (!decoder_) {
+ base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
return;
}

Powered by Google App Engine
This is Rietveld 408576698