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

Unified Diff: media/filters/audio_renderer_impl.cc

Issue 10669022: Add status parameter to DemuxerStream::ReadCB (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 6 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: media/filters/audio_renderer_impl.cc
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc
index 4af31fcf018291fc50db1c17be5162f501869b9a..8dfeeda57c4f3e9dbd233fc086e22f193e26c0d2 100644
--- a/media/filters/audio_renderer_impl.cc
+++ b/media/filters/audio_renderer_impl.cc
@@ -227,7 +227,8 @@ AudioRendererImpl::~AudioRendererImpl() {
DCHECK(!algorithm_.get());
}
-void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
+void AudioRendererImpl::DecodedAudioReady(AudioDecoder::Status status,
+ const scoped_refptr<Buffer>& buffer) {
base::AutoLock auto_lock(lock_);
DCHECK(state_ == kPaused || state_ == kSeeking || state_ == kPlaying ||
state_ == kUnderflow || state_ == kRebuffering || state_ == kStopped);
@@ -235,7 +236,20 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
CHECK(pending_read_);
pending_read_ = false;
- if (buffer && buffer->IsEndOfStream()) {
+ if (status == AudioDecoder::kDecodeError) {
+ HandleDecodeError();
+ return;
+ }
+
+ if (status == AudioDecoder::kAborted) {
+ HandleAbortedRead();
+ return;
+ }
+
+ DCHECK_EQ(status, AudioDecoder::kOk);
+ DCHECK(buffer);
+
+ if (buffer->IsEndOfStream()) {
received_end_of_stream_ = true;
// Transition to kPlaying if we are currently handling an underflow since
@@ -249,7 +263,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
NOTREACHED();
return;
case kPaused:
- if (buffer && !buffer->IsEndOfStream())
+ if (!buffer->IsEndOfStream())
algorithm_->EnqueueBuffer(buffer);
DCHECK(!pending_read_);
base::ResetAndReturn(&pause_cb_).Run();
@@ -259,7 +273,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
ScheduleRead_Locked();
return;
}
- if (buffer && !buffer->IsEndOfStream()) {
+ if (!buffer->IsEndOfStream()) {
algorithm_->EnqueueBuffer(buffer);
if (!algorithm_->IsQueueFull())
return;
@@ -270,7 +284,7 @@ void AudioRendererImpl::DecodedAudioReady(scoped_refptr<Buffer> buffer) {
case kPlaying:
case kUnderflow:
case kRebuffering:
- if (buffer && !buffer->IsEndOfStream())
+ if (!buffer->IsEndOfStream())
algorithm_->EnqueueBuffer(buffer);
return;
case kStopped:
@@ -508,4 +522,45 @@ void AudioRendererImpl::DisableUnderflowForTesting() {
underflow_disabled_ = true;
}
+void AudioRendererImpl::HandleDecodeError() {
+ switch (state_) {
+ case kUninitialized:
+ NOTREACHED();
+ return;
+ case kPaused:
+ base::ResetAndReturn(&pause_cb_).Run();
Ami GONE FROM CHROMIUM 2012/06/26 00:33:21 does the error get dropped at this point?
acolwell GONE FROM CHROMIUM 2012/07/12 01:19:38 Done.
+ return;
+ case kSeeking:
+ state_ = kPaused;
+ base::ResetAndReturn(&seek_cb_).Run(PIPELINE_ERROR_DECODE);
+ return;
+ case kPlaying:
+ case kUnderflow:
+ case kRebuffering:
+ case kStopped:
+ host()->SetError(PIPELINE_ERROR_DECODE);
+ return;
+ }
+}
+
+void AudioRendererImpl::HandleAbortedRead() {
+ switch (state_) {
+ case kUninitialized:
+ NOTREACHED();
+ return;
+ case kPaused:
+ base::ResetAndReturn(&pause_cb_).Run();
+ return;
+ case kSeeking:
+ state_ = kPaused;
+ base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
+ return;
+ case kPlaying:
+ case kUnderflow:
+ case kRebuffering:
+ case kStopped:
+ return;
+ }
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698