Index: ffmpeg-0.8.1/libavformat/utils.c
===================================================================
--- ffmpeg-0.8.1.orig/libavformat/utils.c	2011-07-28 19:38:23.000000000 +0200
+++ ffmpeg-0.8.1/libavformat/utils.c	2011-07-30 18:58:42.000000000 +0200
@@ -1858,7 +1858,8 @@
     duration = INT64_MIN;
     for(i = 0;i < ic->nb_streams; i++) {
         st = ic->streams[i];
-        if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
+        if (st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE &&
+	    st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
             start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
             if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
                 if (start_time1 < start_time_text)
@@ -3178,17 +3181,42 @@
 
 int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush){
     AVPacketList *pktl;
-    int stream_count=0;
+    int stream_count=0, noninterleaved_count=0;
+    int64_t delta_dts_min = INT64_MAX;
     int i;
 
     if(pkt){
         ff_interleave_add_packet(s, pkt, ff_interleave_compare_dts);
     }
 
-    for(i=0; i < s->nb_streams; i++)
-        stream_count+= !!s->streams[i]->last_in_packet_buffer;
-
-    if(stream_count && (s->nb_streams == stream_count || flush)){
+    for(i=0; i < s->nb_streams; i++) {
+        if (s->streams[i]->last_in_packet_buffer) {
+	    int64_t delta_dts =
+		av_rescale_q(s->streams[i]->last_in_packet_buffer->pkt.dts,
+			     s->streams[i]->time_base,
+			     AV_TIME_BASE_Q) -
+		av_rescale_q(s->packet_buffer->pkt.dts,
+			     s->streams[s->packet_buffer->pkt.stream_index]->time_base,
+			     AV_TIME_BASE_Q);
+	    if (delta_dts < delta_dts_min)
+		delta_dts_min = delta_dts;
+	    ++stream_count;
+	} else {
+	    if(s->streams[i]->stream_copy == 2 ||
+	       s->streams[i]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
+		++noninterleaved_count;
+	}
+    }
+
+    if (s->nb_streams == stream_count)
+	flush = 1;
+    else if (!flush &&
+	     s->nb_streams == stream_count+noninterleaved_count &&
+	     delta_dts_min > 20*AV_TIME_BASE) {
+av_log(s, AV_LOG_DEBUG, "flushing with %d noninterleaved\n", noninterleaved_count);
+             flush = 1;
+    }
+    if(stream_count && flush){
         pktl= s->packet_buffer;
         *out= pktl->pkt;
 
