Ticket #429: ffmpeg-subtitle-interleave.diff

File ffmpeg-subtitle-interleave.diff, 2.3 KB (added by wg, 8 years ago)

Treat subtitle streams as noninterleaved when 20 seconds have passed without a packet

  • libavformat/utils.c

    old new  
    18581858    duration = INT64_MIN;
    18591859    for(i = 0;i < ic->nb_streams; i++) {
    18601860        st = ic->streams[i];
    1861         if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
     1861        if (st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE &&
     1862            st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
    18621863            start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
    18631864            if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
    18641865                if (start_time1 < start_time_text)
     
    31783181
    31793182int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
    31803183    AVPacketList *pktl;
    3181     int stream_count=0;
     3184    int stream_count=0, noninterleaved_count=0;
     3185    int64_t delta_dts_min = INT64_MAX;
    31823186    int i;
    31833187
    31843188    if(pkt){
    31853189        ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
    31863190    }
    31873191
    3188     for(i=0; i < s->nb_streams; i++)
    3189         stream_count+= !!s->streams[i]->last_in_packet_buffer;
    3190 
    3191     if(stream_count && (s->nb_streams == stream_count || flush)){
     3192    for(i=0; i < s->nb_streams; i++) {
     3193        if (s->streams[i]->last_in_packet_buffer) {
     3194            int64_t delta_dts =
     3195                av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
     3196                             s->streams[i]->time_base,
     3197                             AV_TIME_BASE_Q) -
     3198                av_rescale_q(s->packet_buffer->pkt.dts,
     3199                             s->streams[s->packet_buffer->pkt.stream_index]->time_base,
     3200                             AV_TIME_BASE_Q);
     3201            if (delta_dts < delta_dts_min)
     3202                delta_dts_min = delta_dts;
     3203            ++stream_count;
     3204        } else {
     3205            if(s->streams[i]->stream_copy == 2 ||
     3206               s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
     3207                ++noninterleaved_count;
     3208        }
     3209    }
     3210
     3211    if (s->nb_streams == stream_count)
     3212        flush = 1;
     3213    else if (!flush &&
     3214             s->nb_streams == stream_count+noninterleaved_count &&
     3215             delta_dts_min > 20*AV_TIME_BASE) {
     3216av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
     3217             flush = 1;
     3218    }
     3219    if(stream_count && flush){
    31923220        pktl= s->packet_buffer;
    31933221        *out= pktl->pkt;
    31943222