diff --git a/libavformat/segment.c b/libavformat/segment.c index 7931e2e926..9a4a1d52dc 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -335,7 +335,7 @@ static int seg_write_header(AVFormatContext *s) if (seg->list_type == LIST_TYPE_EXT) av_log(s, AV_LOG_WARNING, "'ext' list type option is deprecated in favor of 'csv'\n"); - for (i = 0; i< s->nb_streams; i++) + for (i = 0; i < s->nb_streams; i++) seg->has_video += (s->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO); @@ -360,8 +360,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->segment_idx++) < 0) { @@ -381,11 +388,7 @@ static int seg_write_header(AVFormatContext *s) fail: if (ret) { - if (oc) { - oc->streams = NULL; - oc->nb_streams = 0; - avformat_free_context(oc); - } + avformat_free_context(oc); if (seg->list) segment_list_close(s); } @@ -396,7 +399,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; int ret; @@ -424,12 +427,10 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) (double)(pkt->pts + pkt->duration) * av_q2d(st->time_base)); } - 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->list_pb); avformat_free_context(oc); @@ -449,8 +450,6 @@ static int seg_write_trailer(struct AVFormatContext *s) av_opt_free(seg); av_freep(&seg->times); - oc->streams = NULL; - oc->nb_streams = 0; avformat_free_context(oc); return ret; }