Browse Source

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>
tags/n2.4
Michael Niedermayer 10 years ago
parent
commit
a06fac353c
1 changed files with 8 additions and 2 deletions
  1. +8
    -2
      libavformat/mux.c

+ 8
- 2
libavformat/mux.c View File

@@ -778,7 +778,9 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
for (i = 0; i < s->nb_streams; i++) { for (i = 0; i < s->nb_streams; i++) {
if (s->streams[i]->last_in_packet_buffer) { if (s->streams[i]->last_in_packet_buffer) {
++stream_count; ++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; ++noninterleaved_count;
} }
} }
@@ -786,7 +788,11 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
if (s->internal->nb_interleaved_streams == stream_count) if (s->internal->nb_interleaved_streams == stream_count)
flush = 1; 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; AVPacket *top_pkt = &s->packet_buffer->pkt;
int64_t delta_dts = INT64_MIN; int64_t delta_dts = INT64_MIN;
int64_t top_dts = av_rescale_q(top_pkt->dts, int64_t top_dts = av_rescale_q(top_pkt->dts,


Loading…
Cancel
Save