summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-02-26 01:39:32 +0200
committerMartin Storsjö <martin@martin.st>2012-10-04 13:52:09 +0300
commit0edae4e6286096023cdd6adea74722fa06029867 (patch)
treebfd51b86d6e47ec570902f934ccba1d8eed996b2
parentaa9f128b7cf35509c9520a9b8d936ea79d77db0b (diff)
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@martin.st>
-rw-r--r--libavformat/segment.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c
index e6dafe3133..ccd8a91e41 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;
}