[FFmpeg-cvslog] libavformat/utils: Treat subtitle streams as noninterleaved when 20 seconds have passed without a packet

wg git at videolan.org
Wed Sep 7 00:43:38 CEST 2011


ffmpeg | branch: master | wg <video06 at malloc.de> | Wed Sep  7 00:10:44 2011 +0200| [37ed5df5c5e06a55724fb9eb215da1594b648282] | committer: Michael Niedermayer

libavformat/utils: Treat subtitle streams as noninterleaved when 20 seconds have passed without a packet

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=37ed5df5c5e06a55724fb9eb215da1594b648282
---

 libavformat/utils.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 1017d52..c657279 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3220,17 +3220,41 @@ static int ff_interleave_compare_dts(AVFormatContext *s, AVPacket *next, AVPacke
 
 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;
+    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]->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
+                ++noninterleaved_count;
+        }
+    }
 
-    if(stream_count && (s->nb_streams == stream_count || flush)){
+    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;
 



More information about the ffmpeg-cvslog mailing list