lavf: split packets before muxing.
authorClément Bœsch <ubitux@gmail.com>
Mon, 3 Dec 2012 22:13:53 +0000 (23:13 +0100)
committerClément Bœsch <ubitux@gmail.com>
Thu, 20 Dec 2012 15:13:52 +0000 (16:13 +0100)
After demuxing, data and side are merged. Before decoding, they are
split. Encoder will perform with data and side split. This means that a
muxer can receive split data (after encoding) but also merged data (if
called directly after demuxing). This commit makes sure data and side
are split for the muxer.

libavformat/mux.c

index 9bcee99..c7e176a 100644 (file)
@@ -484,13 +484,29 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
     return 0;
 }
 
+/**
+ * Move side data from payload to internal struct, call muxer, and restore
+ * original packet.
+ */
+static inline int split_write_packet(AVFormatContext *s, AVPacket *pkt)
+{
+    int ret;
+    AVPacket spkt = *pkt;
+
+    av_packet_split_side_data(&spkt);
+    ret = s->oformat->write_packet(s, &spkt);
+    spkt.data = NULL;
+    av_destruct_packet(&spkt);
+    return ret;
+}
+
 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
 {
     int ret;
 
     if (!pkt) {
         if (s->oformat->flags & AVFMT_ALLOW_FLUSH) {
-            ret = s->oformat->write_packet(s, pkt);
+            ret = s->oformat->write_packet(s, NULL);
             if (ret >= 0 && s->pb && s->pb->error < 0)
                 ret = s->pb->error;
             return ret;
@@ -503,7 +519,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt)
     if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS))
         return ret;
 
-    ret = s->oformat->write_packet(s, pkt);
+    ret = split_write_packet(s, pkt);
     if (ret >= 0 && s->pb && s->pb->error < 0)
         ret = s->pb->error;
 
@@ -733,7 +749,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt)
         if (ret <= 0) //FIXME cleanup needed for ret<0 ?
             return ret;
 
-        ret = s->oformat->write_packet(s, &opkt);
+        ret = split_write_packet(s, &opkt);
         if (ret >= 0)
             s->streams[opkt.stream_index]->nb_frames++;
 
@@ -759,7 +775,7 @@ int av_write_trailer(AVFormatContext *s)
         if (!ret)
             break;
 
-        ret = s->oformat->write_packet(s, &pkt);
+        ret = split_write_packet(s, &pkt);
         if (ret >= 0)
             s->streams[pkt.stream_index]->nb_frames++;