Index: media/filters/ffmpeg_video_decoder.cc |
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc |
index d7bbf82d28bebec52aee5d782be414e627f61bf7..04598338bb3505a4943ff4d680a3001e198d8c57 100644 |
--- a/media/filters/ffmpeg_video_decoder.cc |
+++ b/media/filters/ffmpeg_video_decoder.cc |
@@ -309,7 +309,7 @@ void FFmpegVideoDecoder::DecodeBuffer( |
} |
// Any successful decode counts! |
- if (buffer->GetDataSize()) { |
+ if (!buffer->IsEndOfStream() && buffer->GetDataSize() > 0) { |
PipelineStatistics statistics; |
statistics.video_bytes_decoded = buffer->GetDataSize(); |
statistics_cb_.Run(statistics); |
@@ -336,22 +336,27 @@ bool FFmpegVideoDecoder::Decode( |
scoped_refptr<VideoFrame>* video_frame) { |
DCHECK(video_frame); |
+ // Reset frame to default values. |
+ avcodec_get_frame_defaults(av_frame_); |
+ |
// Create a packet for input data. |
// Due to FFmpeg API changes we no longer have const read-only pointers. |
AVPacket packet; |
av_init_packet(&packet); |
- packet.data = const_cast<uint8*>(buffer->GetData()); |
- packet.size = buffer->GetDataSize(); |
- |
- // Let FFmpeg handle presentation timestamp reordering. |
- codec_context_->reordered_opaque = buffer->GetTimestamp().InMicroseconds(); |
+ if (buffer->IsEndOfStream()) { |
+ packet.data = NULL; |
+ packet.size = 0; |
+ } else { |
+ packet.data = const_cast<uint8*>(buffer->GetData()); |
+ packet.size = buffer->GetDataSize(); |
- // Reset frame to default values. |
- avcodec_get_frame_defaults(av_frame_); |
+ // Let FFmpeg handle presentation timestamp reordering. |
+ codec_context_->reordered_opaque = buffer->GetTimestamp().InMicroseconds(); |
- // This is for codecs not using get_buffer to initialize |
- // |av_frame_->reordered_opaque| |
- av_frame_->reordered_opaque = codec_context_->reordered_opaque; |
+ // This is for codecs not using get_buffer to initialize |
+ // |av_frame_->reordered_opaque| |
+ av_frame_->reordered_opaque = codec_context_->reordered_opaque; |
+ } |
int frame_decoded = 0; |
int result = avcodec_decode_video2(codec_context_, |
@@ -360,10 +365,7 @@ bool FFmpegVideoDecoder::Decode( |
&packet); |
// Log the problem if we can't decode a video frame and exit early. |
if (result < 0) { |
- LOG(ERROR) << "Error decoding a video frame with timestamp: " |
- << buffer->GetTimestamp().InMicroseconds() << " us, duration: " |
- << buffer->GetDuration().InMicroseconds() << " us, packet size: " |
- << buffer->GetDataSize() << " bytes"; |
+ LOG(ERROR) << "Error decoding video: " << buffer->AsHumanReadableString(); |
*video_frame = NULL; |
return false; |
} |