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

Unified Diff: media/filters/audio_renderer_impl.cc

Issue 141243003: Add AudioBufferStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@decoderstream_rebased
Patch Set: Rebase! Created 6 years, 9 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/audio_renderer_impl.h ('k') | media/filters/audio_renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/audio_renderer_impl.cc
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc
index 182e1490534cca2546ce4caaca39c21eabd86d63..1da4d51b4fd38c6ae29a8dcdbe4d555f3f634dee 100644
--- a/media/filters/audio_renderer_impl.cc
+++ b/media/filters/audio_renderer_impl.cc
@@ -45,8 +45,9 @@ AudioRendererImpl::AudioRendererImpl(
: task_runner_(task_runner),
weak_factory_(this),
sink_(sink),
- decoder_selector_(new AudioDecoderSelector(
- task_runner, decoders.Pass(), set_decryptor_ready_cb)),
+ audio_buffer_stream_(task_runner,
+ decoders.Pass(),
+ set_decryptor_ready_cb),
now_cb_(base::Bind(&base::TimeTicks::Now)),
state_(kUninitialized),
sink_playing_(false),
@@ -56,8 +57,7 @@ AudioRendererImpl::AudioRendererImpl(
audio_time_buffered_(kNoTimestamp()),
current_time_(kNoTimestamp()),
underflow_disabled_(false),
- preroll_aborted_(false) {
-}
+ preroll_aborted_(false) {}
AudioRendererImpl::~AudioRendererImpl() {
// Stop() should have been called and |algorithm_| should have been destroyed.
@@ -146,18 +146,8 @@ void AudioRendererImpl::DoFlush_Locked() {
DCHECK(!pending_read_);
DCHECK_EQ(state_, kPaused);
- if (decrypting_demuxer_stream_) {
- decrypting_demuxer_stream_->Reset(
- base::Bind(&AudioRendererImpl::ResetDecoder, weak_this_));
- return;
- }
-
- ResetDecoder();
-}
-
-void AudioRendererImpl::ResetDecoder() {
- DCHECK(task_runner_->BelongsToCurrentThread());
- decoder_->Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_));
+ audio_buffer_stream_.Reset(
+ base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_));
}
void AudioRendererImpl::ResetDecoderDone() {
@@ -186,22 +176,15 @@ void AudioRendererImpl::ResetDecoderDone() {
void AudioRendererImpl::Stop(const base::Closure& callback) {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(!callback.is_null());
- DCHECK(stop_cb_.is_null());
-
- stop_cb_ = callback;
// TODO(scherkus): Consider invalidating |weak_factory_| and replacing
// task-running guards that check |state_| with DCHECK().
{
base::AutoLock auto_lock(lock_);
- if (state_ == kInitializing) {
- decoder_selector_->Abort();
- return;
- }
if (state_ == kStopped) {
- task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_));
+ task_runner_->PostTask(FROM_HERE, callback);
return;
}
@@ -217,25 +200,7 @@ void AudioRendererImpl::Stop(const base::Closure& callback) {
sink_ = NULL;
}
- if (decrypting_demuxer_stream_) {
- decrypting_demuxer_stream_->Stop(
- base::Bind(&AudioRendererImpl::StopDecoder, weak_this_));
- return;
- }
-
- StopDecoder();
-}
-
-void AudioRendererImpl::StopDecoder() {
- DCHECK(task_runner_->BelongsToCurrentThread());
- DCHECK(!stop_cb_.is_null());
-
- if (decoder_) {
- decoder_->Stop(base::ResetAndReturn(&stop_cb_));
- return;
- }
-
- task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&stop_cb_));
+ audio_buffer_stream_.Stop(callback);
}
void AudioRendererImpl::Preroll(base::TimeDelta time,
@@ -280,53 +245,49 @@ void AudioRendererImpl::Initialize(DemuxerStream* stream,
weak_this_ = weak_factory_.GetWeakPtr();
init_cb_ = init_cb;
- statistics_cb_ = statistics_cb;
underflow_cb_ = underflow_cb;
time_cb_ = time_cb;
ended_cb_ = ended_cb;
disabled_cb_ = disabled_cb;
error_cb_ = error_cb;
- decoder_selector_->SelectDecoder(
+ audio_buffer_stream_.Initialize(
stream,
statistics_cb,
- base::Bind(&AudioRendererImpl::OnDecoderSelected, weak_this_));
+ base::Bind(&AudioRendererImpl::OnAudioBufferStreamInitialized,
+ weak_this_));
}
-void AudioRendererImpl::OnDecoderSelected(
- scoped_ptr<AudioDecoder> decoder,
- scoped_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream) {
+void AudioRendererImpl::OnAudioBufferStreamInitialized(bool success) {
DCHECK(task_runner_->BelongsToCurrentThread());
- scoped_ptr<AudioDecoderSelector> deleter(decoder_selector_.Pass());
- decoder_ = decoder.Pass();
+ base::AutoLock auto_lock(lock_);
- if (!decoder_ || !stop_cb_.is_null()) {
- {
- base::AutoLock auto_lock(lock_);
- ChangeState_Locked(kUninitialized);
- }
- // Stop() called during initialization.
- if (!stop_cb_.is_null()) {
- base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
- Stop(base::ResetAndReturn(&stop_cb_));
- } else {
- base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
- }
+ if (state_ == kStopped) {
+ base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT);
return;
}
- base::AutoLock auto_lock(lock_);
- decrypting_demuxer_stream_ = decrypting_demuxer_stream.Pass();
+ if (!success) {
+ state_ = kUninitialized;
+ base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
+ return;
+ }
- int sample_rate = decoder_->samples_per_second();
+ int sample_rate = audio_buffer_stream_.decoder()->samples_per_second();
// The actual buffer size is controlled via the size of the AudioBus
// provided to Render(), so just choose something reasonable here for looks.
- int buffer_size = decoder_->samples_per_second() / 100;
- audio_parameters_ = AudioParameters(
- AudioParameters::AUDIO_PCM_LOW_LATENCY, decoder_->channel_layout(),
- sample_rate, decoder_->bits_per_channel(), buffer_size);
+ int buffer_size = audio_buffer_stream_.decoder()->samples_per_second() / 100;
+
+ // TODO(rileya): Remove the channel_layout/bits_per_channel/samples_per_second
+ // getters from AudioDecoder, and adjust this accordingly.
+ audio_parameters_ =
+ AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+ audio_buffer_stream_.decoder()->channel_layout(),
+ sample_rate,
+ audio_buffer_stream_.decoder()->bits_per_channel(),
+ buffer_size);
if (!audio_parameters_.IsValid()) {
ChangeState_Locked(kUninitialized);
base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_INITIALIZATION_FAILED);
@@ -382,7 +343,7 @@ void AudioRendererImpl::SetVolume(float volume) {
}
void AudioRendererImpl::DecodedAudioReady(
- AudioDecoder::Status status,
+ AudioBufferStream::Status status,
const scoped_refptr<AudioBuffer>& buffer) {
DVLOG(1) << __FUNCTION__ << "(" << status << ")";
DCHECK(task_runner_->BelongsToCurrentThread());
@@ -393,17 +354,18 @@ void AudioRendererImpl::DecodedAudioReady(
CHECK(pending_read_);
pending_read_ = false;
- if (status == AudioDecoder::kAborted) {
+ if (status == AudioBufferStream::ABORTED ||
+ status == AudioBufferStream::DEMUXER_READ_ABORTED) {
HandleAbortedReadOrDecodeError(false);
return;
}
- if (status == AudioDecoder::kDecodeError) {
+ if (status == AudioBufferStream::DECODE_ERROR) {
HandleAbortedReadOrDecodeError(true);
return;
}
- DCHECK_EQ(status, AudioDecoder::kOk);
+ DCHECK_EQ(status, AudioBufferStream::OK);
DCHECK(buffer.get());
if (state_ == kFlushing) {
@@ -510,7 +472,8 @@ void AudioRendererImpl::AttemptRead_Locked() {
return;
pending_read_ = true;
- decoder_->Read(base::Bind(&AudioRendererImpl::DecodedAudioReady, weak_this_));
+ audio_buffer_stream_.Read(
+ base::Bind(&AudioRendererImpl::DecodedAudioReady, weak_this_));
}
bool AudioRendererImpl::CanRead_Locked() {
« no previous file with comments | « media/filters/audio_renderer_impl.h ('k') | media/filters/audio_renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698