--- libavformat/segment.c | 55 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 14 deletions(-)
diff --git a/libavformat/segment.c b/libavformat/segment.c index 2dfd232..a79b0f3 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -259,6 +259,7 @@ static int segment_start(AVFormatContext *s, int write_header) if (write_header) { AVDictionary *options = NULL; av_dict_copy(&options, seg->format_options, 0); + av_dict_set(&options, "fflags", "-autobsf", 0); err = avformat_write_header(oc, &options); av_dict_free(&options); if (err < 0) @@ -753,7 +754,8 @@ static int seg_init(AVFormatContext *s) } av_dict_copy(&options, seg->format_options, 0); - ret = avformat_write_header(oc, &options); + av_dict_set(&options, "fflags", "-autobsf", 0); + ret = avformat_init_output(oc, &options); if (av_dict_count(options)) { av_log(s, AV_LOG_ERROR, "Some of the provided format options in '%s' are not recognized\n", seg->format_options_str); @@ -768,14 +770,42 @@ static int seg_init(AVFormatContext *s) seg->segment_frame_count = 0; av_assert0(s->nb_streams == oc->nb_streams); - for (i = 0; i < s->nb_streams; i++) { - AVStream *inner_st = oc->streams[i]; - AVStream *outer_st = s->streams[i]; - avpriv_set_pts_info(outer_st, inner_st->pts_wrap_bits, inner_st->time_base.num, inner_st->time_base.den); + if (ret) { + for (i = 0; i < s->nb_streams; i++) { + AVStream *inner_st = oc->streams[i]; + AVStream *outer_st = s->streams[i]; + avpriv_set_pts_info(outer_st, inner_st->pts_wrap_bits, inner_st->time_base.num, inner_st->time_base.den); + } + + if (oc->avoid_negative_ts > 0 && s->avoid_negative_ts < 0) + s->avoid_negative_ts = 1; } - if (oc->avoid_negative_ts > 0 && s->avoid_negative_ts < 0) - s->avoid_negative_ts = 1; +fail: + av_dict_free(&options); + return ret; +} + +static int seg_write_header(AVFormatContext *s) +{ + SegmentContext *seg = s->priv_data; + AVFormatContext *oc = seg->avf; + int i; + + int ret = avformat_write_header(oc, NULL); + if (ret < 0) + return ret; + + if (!ret) { + for (i = 0; i < s->nb_streams; i++) { + AVStream *inner_st = oc->streams[i]; + AVStream *outer_st = s->streams[i]; + avpriv_set_pts_info(outer_st, inner_st->pts_wrap_bits, inner_st->time_base.num, inner_st->time_base.den); + } + + if (oc->avoid_negative_ts > 0 && s->avoid_negative_ts < 0) + s->avoid_negative_ts = 1; + } if (!seg->write_header_trailer || seg->header_filename) { if (seg->header_filename) { @@ -785,17 +815,12 @@ static int seg_init(AVFormatContext *s) close_null_ctxp(&oc->pb); } if ((ret = oc->io_open(oc, &oc->pb, oc->filename, AVIO_FLAG_WRITE, NULL)) < 0) - goto fail; + return ret; if (!seg->individual_header_trailer) oc->pb->seekable = 0; } -fail: - av_dict_free(&options); - if (ret < 0) - seg_free_context(seg); - - return ret; + return 0; } static int seg_write_packet(AVFormatContext *s, AVPacket *pkt) @@ -1030,6 +1055,7 @@ AVOutputFormat ff_segment_muxer = { .priv_data_size = sizeof(SegmentContext), .flags = AVFMT_NOFILE|AVFMT_GLOBALHEADER, .init = seg_init, + .write_header = seg_write_header, .write_packet = seg_write_packet, .write_trailer = seg_write_trailer, .deinit = seg_free, @@ -1050,6 +1076,7 @@ AVOutputFormat ff_stream_segment_muxer = { .priv_data_size = sizeof(SegmentContext), .flags = AVFMT_NOFILE, .init = seg_init, + .write_header = seg_write_header, .write_packet = seg_write_packet, .write_trailer = seg_write_trailer, .deinit = seg_free, -- 2.7.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel