Index: media/filters/ffmpeg_audio_decoder.cc |
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc |
index 00832a05abf048953b45fce0b040667b3ded9679..30673a7b0c1da213770ab76c0a62358db02dc49b 100644 |
--- a/media/filters/ffmpeg_audio_decoder.cc |
+++ b/media/filters/ffmpeg_audio_decoder.cc |
@@ -141,7 +141,8 @@ FFmpegAudioDecoder::~FFmpegAudioDecoder() { |
} |
void FFmpegAudioDecoder::Initialize(const AudioDecoderConfig& config, |
- const PipelineStatusCB& status_cb) { |
+ const PipelineStatusCB& status_cb, |
+ const OutputCB& output_cb) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
DCHECK(!config.is_encrypted()); |
@@ -156,6 +157,7 @@ void FFmpegAudioDecoder::Initialize(const AudioDecoderConfig& config, |
} |
// Success! |
+ output_cb_ = BindToCurrentLoop(output_cb); |
state_ = kNormal; |
initialize_cb.Run(PIPELINE_OK); |
} |
@@ -168,33 +170,24 @@ void FFmpegAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer, |
DecodeCB decode_cb_bound = BindToCurrentLoop(decode_cb); |
if (state_ == kError) { |
- decode_cb_bound.Run(kDecodeError, NULL); |
+ decode_cb_bound.Run(kDecodeError); |
return; |
} |
- // Return empty frames if decoding has finished. |
+ // Do nothing if decoding has finished. |
if (state_ == kDecodeFinished) { |
- decode_cb_bound.Run(kOk, AudioBuffer::CreateEOSBuffer()); |
+ decode_cb_bound.Run(kOk); |
return; |
} |
if (!buffer) { |
xhwang
2014/06/05 21:53:50
hmm, should this ever happen?
Sergey Ulanov
2014/06/06 22:49:40
Done.
|
- decode_cb_bound.Run(kAborted, NULL); |
+ decode_cb_bound.Run(kAborted); |
return; |
} |
DecodeBuffer(buffer, decode_cb_bound); |
} |
-scoped_refptr<AudioBuffer> FFmpegAudioDecoder::GetDecodeOutput() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- if (queued_audio_.empty()) |
- return NULL; |
- scoped_refptr<AudioBuffer> out = queued_audio_.front(); |
- queued_audio_.pop_front(); |
- return out; |
-} |
- |
void FFmpegAudioDecoder::Reset(const base::Closure& closure) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
@@ -257,7 +250,7 @@ void FFmpegAudioDecoder::DecodeBuffer( |
// occurs with some damaged files. |
if (!buffer->end_of_stream() && buffer->timestamp() == kNoTimestamp()) { |
DVLOG(1) << "Received a buffer without timestamps!"; |
- decode_cb.Run(kDecodeError, NULL); |
+ decode_cb.Run(kDecodeError); |
return; |
} |
@@ -278,30 +271,20 @@ void FFmpegAudioDecoder::DecodeBuffer( |
if (!FFmpegDecode(buffer)) { |
state_ = kError; |
- decode_cb.Run(kDecodeError, NULL); |
+ decode_cb.Run(kDecodeError); |
return; |
} |
- if (queued_audio_.empty()) { |
- if (state_ == kFlushCodec) { |
- DCHECK(buffer->end_of_stream()); |
- state_ = kDecodeFinished; |
- decode_cb.Run(kOk, AudioBuffer::CreateEOSBuffer()); |
- return; |
- } |
- |
- decode_cb.Run(kNotEnoughData, NULL); |
- return; |
+ if (state_ == kFlushCodec) { |
+ state_ = kDecodeFinished; |
+ output_cb_.Run(AudioBuffer::CreateEOSBuffer()); |
xhwang
2014/06/05 21:53:50
should we keep calling FFmpegDecode(EOS) until the
Sergey Ulanov
2014/06/06 22:49:40
There is a loop in FFmpegDecode() which should flu
|
} |
- decode_cb.Run(kOk, queued_audio_.front()); |
- queued_audio_.pop_front(); |
+ decode_cb.Run(kOk); |
} |
bool FFmpegAudioDecoder::FFmpegDecode( |
const scoped_refptr<DecoderBuffer>& buffer) { |
- DCHECK(queued_audio_.empty()); |
- |
AVPacket packet; |
av_init_packet(&packet); |
if (buffer->end_of_stream()) { |
@@ -362,7 +345,6 @@ bool FFmpegAudioDecoder::FFmpegDecode( |
<< " the mimetype."; |
} |
// This is an unrecoverable error, so bail out. |
- queued_audio_.clear(); |
av_frame_unref(av_frame_.get()); |
return false; |
} |
@@ -386,9 +368,9 @@ bool FFmpegAudioDecoder::FFmpegDecode( |
const int decoded_frames = frame_decoded ? output->frame_count() : 0; |
if (IsEndOfStream(result, decoded_frames, buffer)) { |
DCHECK_EQ(packet.size, 0); |
- queued_audio_.push_back(AudioBuffer::CreateEOSBuffer()); |
+ output_cb_.Run(AudioBuffer::CreateEOSBuffer()); |
} else if (discard_helper_->ProcessBuffers(buffer, output)) { |
- queued_audio_.push_back(output); |
+ output_cb_.Run(output); |
} |
} while (packet.size > 0); |