[FFmpeg-cvslog] r16937 - trunk/libavformat/mxfenc.c

bcoudurier subversion
Mon Feb 2 11:04:37 CET 2009


Author: bcoudurier
Date: Mon Feb  2 11:04:36 2009
New Revision: 16937

Log:
fix flush and interleaving by edit units

Modified:
   trunk/libavformat/mxfenc.c

Modified: trunk/libavformat/mxfenc.c
==============================================================================
--- trunk/libavformat/mxfenc.c	Mon Feb  2 11:03:38 2009	(r16936)
+++ trunk/libavformat/mxfenc.c	Mon Feb  2 11:04:36 2009	(r16937)
@@ -1296,25 +1296,37 @@ static int mxf_interleave_get_packet(AVF
 
     if (stream_count && (s->nb_streams == stream_count || flush)) {
         pktl = s->packet_buffer;
-        *out = pktl->pkt;
-        //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts);
-        s->packet_buffer = pktl->next;
-        av_freep(&pktl);
-
-        if (flush && stream_count < s->nb_streams) {
+        if (s->nb_streams != stream_count) {
+            MXFContext *mxf = s->priv_data;
+            AVPacketList *first = NULL;
+            // find first packet in edit unit
+            while (pktl) {
+                AVStream *st = s->streams[pktl->pkt.stream_index];
+                if (st->index == mxf->edit_unit_start)
+                    break;
+                else if (!first)
+                    first = pktl;
+                pktl = pktl->next;
+            }
             // purge packet queue
-            pktl = s->packet_buffer;
             while (pktl) {
                 AVPacketList *next = pktl->next;
                 av_free_packet(&pktl->pkt);
                 av_freep(&pktl);
                 pktl = next;
             }
-            s->packet_buffer = NULL;
+            if (!first)
+                goto out;
+            pktl = first;
         }
 
+        *out = pktl->pkt;
+        //av_log(s, AV_LOG_DEBUG, "out st:%d dts:%lld\n", (*out).stream_index, (*out).dts);
+        s->packet_buffer = pktl->next;
+        av_freep(&pktl);
         return 1;
     } else {
+    out:
         av_init_packet(out);
         return 0;
     }




More information about the ffmpeg-cvslog mailing list