Index: media/filters/decrypting_audio_decoder.cc |
=================================================================== |
--- media/filters/decrypting_audio_decoder.cc (revision 277175) |
+++ media/filters/decrypting_audio_decoder.cc (working copy) |
@@ -45,8 +45,7 @@ |
weak_factory_(this) {} |
void DecryptingAudioDecoder::Initialize(const AudioDecoderConfig& config, |
- const PipelineStatusCB& status_cb, |
- const OutputCB& output_cb) { |
+ const PipelineStatusCB& status_cb) { |
DVLOG(2) << "Initialize()"; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(decode_cb_.is_null()); |
@@ -54,7 +53,6 @@ |
weak_this_ = weak_factory_.GetWeakPtr(); |
init_cb_ = BindToCurrentLoop(status_cb); |
- output_cb_ = BindToCurrentLoop(output_cb); |
if (!config.IsValidConfig()) { |
DLOG(ERROR) << "Invalid audio stream config."; |
@@ -94,11 +92,17 @@ |
// Return empty (end-of-stream) frames if decoding has finished. |
if (state_ == kDecodeFinished) { |
- output_cb_.Run(AudioBuffer::CreateEOSBuffer()); |
- base::ResetAndReturn(&decode_cb_).Run(kOk); |
+ base::ResetAndReturn(&decode_cb_).Run(kOk, AudioBuffer::CreateEOSBuffer()); |
return; |
} |
+ if (!queued_audio_frames_.empty()) { |
+ DCHECK(!buffer); |
+ base::ResetAndReturn(&decode_cb_).Run(kOk, queued_audio_frames_.front()); |
+ queued_audio_frames_.pop_front(); |
+ return; |
+ } |
+ |
// Initialize the |next_output_timestamp_| to be the timestamp of the first |
// non-EOS buffer. |
if (timestamp_helper_->base_timestamp() == kNoTimestamp() && |
@@ -111,6 +115,14 @@ |
DecodePendingBuffer(); |
} |
+scoped_refptr<AudioBuffer> DecryptingAudioDecoder::GetDecodeOutput() { |
+ if (queued_audio_frames_.empty()) |
+ return NULL; |
+ scoped_refptr<AudioBuffer> out = queued_audio_frames_.front(); |
+ queued_audio_frames_.pop_front(); |
+ return out; |
+} |
+ |
void DecryptingAudioDecoder::Reset(const base::Closure& closure) { |
DVLOG(2) << "Reset() - state: " << state_; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -137,7 +149,7 @@ |
if (state_ == kWaitingForKey) { |
DCHECK(!decode_cb_.is_null()); |
pending_buffer_to_decode_ = NULL; |
- base::ResetAndReturn(&decode_cb_).Run(kAborted); |
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL); |
} |
DCHECK(decode_cb_.is_null()); |
@@ -162,7 +174,7 @@ |
if (!init_cb_.is_null()) |
base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
if (!decode_cb_.is_null()) |
- base::ResetAndReturn(&decode_cb_).Run(kAborted); |
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL); |
if (!reset_cb_.is_null()) |
base::ResetAndReturn(&reset_cb_).Run(); |
@@ -253,6 +265,7 @@ |
DCHECK_EQ(state_, kPendingDecode) << state_; |
DCHECK(!decode_cb_.is_null()); |
DCHECK(pending_buffer_to_decode_.get()); |
+ DCHECK(queued_audio_frames_.empty()); |
bool need_to_try_again_if_nokey_is_returned = key_added_while_decode_pending_; |
key_added_while_decode_pending_ = false; |
@@ -262,7 +275,7 @@ |
pending_buffer_to_decode_ = NULL; |
if (!reset_cb_.is_null()) { |
- base::ResetAndReturn(&decode_cb_).Run(kAborted); |
+ base::ResetAndReturn(&decode_cb_).Run(kAborted, NULL); |
DoReset(); |
return; |
} |
@@ -272,7 +285,7 @@ |
if (status == Decryptor::kError) { |
DVLOG(2) << "DeliverFrame() - kError"; |
state_ = kDecodeFinished; // TODO add kError state |
- base::ResetAndReturn(&decode_cb_).Run(kDecodeError); |
+ base::ResetAndReturn(&decode_cb_).Run(kDecodeError, NULL); |
return; |
} |
@@ -296,22 +309,23 @@ |
DVLOG(2) << "DeliverFrame() - kNeedMoreData"; |
if (scoped_pending_buffer_to_decode->end_of_stream()) { |
state_ = kDecodeFinished; |
- output_cb_.Run(AudioBuffer::CreateEOSBuffer()); |
- base::ResetAndReturn(&decode_cb_).Run(kOk); |
+ base::ResetAndReturn(&decode_cb_) |
+ .Run(kOk, AudioBuffer::CreateEOSBuffer()); |
return; |
} |
state_ = kIdle; |
- base::ResetAndReturn(&decode_cb_).Run(kOk); |
+ base::ResetAndReturn(&decode_cb_).Run(kNotEnoughData, NULL); |
return; |
} |
DCHECK_EQ(status, Decryptor::kSuccess); |
DCHECK(!frames.empty()); |
- ProcessDecodedFrames(frames); |
+ EnqueueFrames(frames); |
state_ = kIdle; |
- base::ResetAndReturn(&decode_cb_).Run(kOk); |
+ base::ResetAndReturn(&decode_cb_).Run(kOk, queued_audio_frames_.front()); |
+ queued_audio_frames_.pop_front(); |
} |
void DecryptingAudioDecoder::OnKeyAdded() { |
@@ -336,12 +350,14 @@ |
base::ResetAndReturn(&reset_cb_).Run(); |
} |
-void DecryptingAudioDecoder::ProcessDecodedFrames( |
+void DecryptingAudioDecoder::EnqueueFrames( |
const Decryptor::AudioBuffers& frames) { |
- for (Decryptor::AudioBuffers::const_iterator iter = frames.begin(); |
- iter != frames.end(); |
+ queued_audio_frames_ = frames; |
+ |
+ for (Decryptor::AudioBuffers::iterator iter = queued_audio_frames_.begin(); |
+ iter != queued_audio_frames_.end(); |
++iter) { |
- scoped_refptr<AudioBuffer> frame = *iter; |
+ scoped_refptr<AudioBuffer>& frame = *iter; |
DCHECK(!frame->end_of_stream()) << "EOS frame returned."; |
DCHECK_GT(frame->frame_count(), 0) << "Empty frame returned."; |
@@ -356,8 +372,6 @@ |
frame->set_timestamp(current_time); |
timestamp_helper_->AddFrames(frame->frame_count()); |
- |
- output_cb_.Run(frame); |
} |
} |