Index: media/filters/ffmpeg_demuxer.cc |
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc |
index e47c59eebc5f34c201ac8dcafc3c41483f2b7a67..38e4879c7af6e3a369796cc702b41ea69428ab08 100644 |
--- a/media/filters/ffmpeg_demuxer.cc |
+++ b/media/filters/ffmpeg_demuxer.cc |
@@ -845,6 +845,18 @@ void FFmpegDemuxer::OnReadFrameDone(ScopedAVPacket packet, int result) { |
packet.swap(new_packet); |
} |
+ // Special case for opus in ogg. FFmpeg is pre-trimming the codec delay |
+ // from the packet timestamp. Chrome expects to handle this itself inside |
+ // the decoder, so shift timestamps by the delay in this case. |
+ if (strcmp(glue_->format_context()->iformat->name, "ogg") == 0) { |
acolwell GONE FROM CHROMIUM
2013/12/12 22:40:46
Add a TODO & crbug to get this difference between
DaleCurtis
2013/12/12 23:36:04
Done.
|
+ const AVCodecContext* codec_context = |
+ glue_->format_context()->streams[packet->stream_index]->codec; |
+ if (codec_context->codec_id == AV_CODEC_ID_OPUS && |
+ codec_context->delay > 0) { |
+ packet->pts += codec_context->delay; |
+ } |
+ } |
+ |
FFmpegDemuxerStream* demuxer_stream = streams_[packet->stream_index]; |
demuxer_stream->EnqueuePacket(packet.Pass()); |
} |