summaryrefslogtreecommitdiff
path: root/libavformat/mux.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-07-26 00:56:32 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-07-26 01:11:00 +0200
commita06fac353ce2bd055f920e7f6f5e2145736d2d2c (patch)
treea898c3f541fb669adc998ab6de3bf366e17d4a1c /libavformat/mux.c
parent24327706e173c86ad7738dd9c21f214cc78cd8d1 (diff)
avformat/mux: ignore delayed vp8/9 packets in max_interleave_delta calculation
libvpx adds very significant delay, which appears normal and we must buffer all other streams no matter what to interleave them correctly Fixes Ticket3440 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/mux.c')
-rw-r--r--libavformat/mux.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/libavformat/mux.c b/libavformat/mux.c
index bd9f7e5dcc..b264ce02e6 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -778,7 +778,9 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
for (i = 0; i < s->nb_streams; i++) {
if (s->streams[i]->last_in_packet_buffer) {
++stream_count;
- } else if (s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
+ } else if (s->streams[i]->codec->codec_type != AVMEDIA_TYPE_ATTACHMENT &&
+ s->streams[i]->codec->codec_id != AV_CODEC_ID_VP8 &&
+ s->streams[i]->codec->codec_id != AV_CODEC_ID_VP9) {
++noninterleaved_count;
}
}
@@ -786,7 +788,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
if (s->internal->nb_interleaved_streams == stream_count)
flush = 1;
- if (s->max_interleave_delta > 0 && s->packet_buffer && !flush) {
+ if (s->max_interleave_delta > 0 &&
+ s->packet_buffer &&
+ !flush &&
+ s->internal->nb_interleaved_streams == stream_count+noninterleaved_count
+ ) {
AVPacket *top_pkt = &s->packet_buffer->pkt;
int64_t delta_dts = INT64_MIN;
int64_t top_dts = av_rescale_q(top_pkt->dts,