[FFmpeg-cvslog] segment: Properly create new AVStreams for the chained muxer

Martin Storsjö git at videolan.org
Fri Oct 5 15:06:45 CEST 2012


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Sun Feb 26 01:39:32 2012 +0200| [0edae4e6286096023cdd6adea74722fa06029867] | committer: Martin Storsjö

segment: Properly create new AVStreams for the chained muxer

Before, the chained muxer reused the AVStreams array from
the outer muxer, which made it impossible to use the proper
public functions (such as av_write_frame) when calling the
chained muxer.

Signed-off-by: Martin Storsjö <martin at martin.st>

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

 libavformat/segment.c |   21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/libavformat/segment.c b/libavformat/segment.c
index e6dafe3..ccd8a91 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -147,8 +147,15 @@ static int seg_write_header(AVFormatContext *s)
     oc->interrupt_callback = s->interrupt_callback;
     seg->avf = oc;
 
-    oc->streams = s->streams;
-    oc->nb_streams = s->nb_streams;
+    for (i = 0; i < s->nb_streams; i++) {
+        AVStream *st;
+        if (!(st = avformat_new_stream(oc, NULL))) {
+            ret = AVERROR(ENOMEM);
+            goto fail;
+        }
+        avcodec_copy_context(st->codec, s->streams[i]->codec);
+        st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio;
+    }
 
     if (av_get_frame_filename(oc->filename, sizeof(oc->filename),
                               s->filename, seg->number++) < 0) {
@@ -172,8 +179,6 @@ static int seg_write_header(AVFormatContext *s)
 
 fail:
     if (ret) {
-        oc->streams = NULL;
-        oc->nb_streams = 0;
         if (seg->list)
             avio_close(seg->pb);
         avformat_free_context(oc);
@@ -185,7 +190,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     SegmentContext *seg = s->priv_data;
     AVFormatContext *oc = seg->avf;
-    AVStream *st = oc->streams[pkt->stream_index];
+    AVStream *st = s->streams[pkt->stream_index];
     int64_t end_pts = seg->recording_time * seg->number;
     int ret;
 
@@ -217,12 +222,10 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
         }
     }
 
-    ret = oc->oformat->write_packet(oc, pkt);
+    ret = ff_write_chained(oc, pkt->stream_index, pkt, s);
 
 fail:
     if (ret < 0) {
-        oc->streams = NULL;
-        oc->nb_streams = 0;
         if (seg->list)
             avio_close(seg->pb);
         avformat_free_context(oc);
@@ -238,8 +241,6 @@ static int seg_write_trailer(struct AVFormatContext *s)
     int ret = segment_end(oc);
     if (seg->list)
         avio_close(seg->pb);
-    oc->streams = NULL;
-    oc->nb_streams = 0;
     avformat_free_context(oc);
     return ret;
 }



More information about the ffmpeg-cvslog mailing list