Index: media/filters/ffmpeg_audio_decoder.cc |
=================================================================== |
--- media/filters/ffmpeg_audio_decoder.cc (revision 17376) |
+++ media/filters/ffmpeg_audio_decoder.cc (working copy) |
@@ -99,10 +99,11 @@ |
output_buffer_size < 0 || |
static_cast<size_t>(output_buffer_size) > kOutputBufferSize) { |
host_->Error(PIPELINE_ERROR_DECODE); |
- } else if (result == 0) { |
- // TODO(scherkus): does this mark EOS? Do we want to fulfill a read request |
- // with zero size? |
- } else { |
+ return; |
+ } |
+ |
+ // If we have decoded something, enqueue the result. |
+ if (output_buffer_size) { |
DataBuffer* result_buffer = new DataBuffer(); |
memcpy(result_buffer->GetWritableData(output_buffer_size), |
output_buffer, output_buffer_size); |
@@ -119,7 +120,19 @@ |
result_buffer->SetTimestamp(input->GetTimestamp()); |
EnqueueResult(result_buffer); |
+ return; |
} |
+ |
+ // Three conditions to meet to declare end of stream for this decoder: |
+ // 1. FFmpeg didn't read anything. |
+ // 2. FFmpeg didn't output anything. |
+ // 3. An end of stream buffer is received. |
+ if (result == 0 && output_buffer_size == 0 && input->IsEndOfStream()) { |
+ DataBuffer* result_buffer = new DataBuffer(); |
+ result_buffer->SetTimestamp(input->GetTimestamp()); |
+ result_buffer->SetDuration(input->GetDuration()); |
+ EnqueueResult(result_buffer); |
+ } |
} |
base::TimeDelta FFmpegAudioDecoder::CalculateDuration(size_t size) { |