From: Jan Sebechlebsky <sebechlebsky...@gmail.com> Ensure that write_trailer is always called after successful write_header operation so underlying muxer is deinitialized.
Signed-off-by: Jan Sebechlebsky <sebechlebsky...@gmail.com> --- This is a little tricky - we have to ensure that write_trailer is called if the write_header succeeded, however if the io_open fails the AVIOContext is invalid and cause underlying muxer to crash (the muxer may assume that AVIOContext is initialized). So temporarily AVIOContext is initialized to null context just to allow write_trailer to finalize underlying muxer successfully. libavformat/segment.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libavformat/segment.c b/libavformat/segment.c index 7e4e840..df37a56 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -763,6 +763,8 @@ static int seg_init(AVFormatContext *s) av_log(s, AV_LOG_ERROR, "Some of the provided format options in '%s' are not recognized\n", seg->format_options_str); ret = AVERROR(EINVAL); + av_write_trailer(oc); + ff_format_io_close(oc, &oc->pb); goto fail; } @@ -785,8 +787,14 @@ static int seg_init(AVFormatContext *s) } else { close_null_ctxp(&oc->pb); } - if ((ret = oc->io_open(oc, &oc->pb, oc->filename, AVIO_FLAG_WRITE, NULL)) < 0) + if ((ret = oc->io_open(oc, &oc->pb, oc->filename, AVIO_FLAG_WRITE, NULL)) < 0) { + // Some muxers rely on valid AVIOContext so we need to create one + // before performing write trailer + open_null_ctx(&oc->pb); + av_write_trailer(oc); + close_null_ctxp(&oc->pb); goto fail; + } if (!seg->individual_header_trailer) oc->pb->seekable = 0; } -- 1.9.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel