From bc185fc1611fe4cf38e7b0f79919e76e0205f03c Mon Sep 17 00:00:00 2001
From: Baptiste Coudurier <baptiste.coudurier@gmail.com>
Date: Mon, 2 Feb 2009 10:04:36 +0000
Subject: [PATCH] fix flush and interleaving by edit units

Originally committed as revision 16937 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 libavformat/mxfenc.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index bb39897c19a..03409079cb6 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1296,25 +1296,37 @@ static int mxf_interleave_get_packet(AVFormatContext *s, AVPacket *out, AVPacket
 
     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;
     }
-- 
GitLab