Most useful for MPEG-TS. Works by having the underlying muxer configure the bitstream filters, then moving them to our own AVStreams. --- libavformat/segment.c | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/libavformat/segment.c b/libavformat/segment.c index 960a438..d912692 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -628,13 +628,10 @@ static void seg_free_context(SegmentContext *seg) seg->avf = NULL; } -static int seg_write_header(AVFormatContext *s) +static int seg_init(AVFormatContext *s) { SegmentContext *seg = s->priv_data; - AVFormatContext *oc = NULL; - AVDictionary *options = NULL; int ret; - int i; seg->segment_count = 0; if (!seg->write_header_trailer) @@ -702,6 +699,7 @@ static int seg_write_header(AVFormatContext *s) seg->use_rename = proto && !strcmp(proto, "file"); } } + if (seg->list_type == LIST_TYPE_EXT) av_log(s, AV_LOG_WARNING, "'ext' list type option is deprecated in favor of 'csv'\n"); @@ -726,11 +724,25 @@ static int seg_write_header(AVFormatContext *s) if ((ret = segment_mux_init(s)) < 0) goto fail; - oc = seg->avf; if ((ret = set_segment_filename(s)) < 0) goto fail; +fail: + if (ret < 0) + seg_free_context(seg); + + return ret; +} + +static int seg_write_header(AVFormatContext *s) +{ + SegmentContext *seg = s->priv_data; + AVFormatContext *oc = seg->avf; + AVDictionary *options = NULL; + int ret; + int i; + if (seg->write_header_trailer) { if ((ret = s->io_open(s, &oc->pb, seg->header_filename ? seg->header_filename : oc->filename, @@ -944,6 +956,23 @@ fail: return ret; } +static int seg_check_bitstream(struct AVFormatContext *s, const AVPacket *pkt) +{ + SegmentContext *seg = s->priv_data; + AVFormatContext *oc = seg->avf; + if (oc->oformat->check_bitstream) { + int ret = oc->oformat->check_bitstream(oc, pkt); + if (ret == 1) { + AVStream *st = s->streams[pkt->stream_index]; + AVStream *ost = oc->streams[pkt->stream_index]; + st->internal->bsfc = ost->internal->bsfc; + ost->internal->bsfc = NULL; + } + return ret; + } + return 1; +} + #define OFFSET(x) offsetof(SegmentContext, x) #define E AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { @@ -1001,9 +1030,11 @@ AVOutputFormat ff_segment_muxer = { .long_name = NULL_IF_CONFIG_SMALL("segment"), .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, + .check_bitstream = seg_check_bitstream, .priv_class = &seg_class, }; @@ -1019,8 +1050,10 @@ AVOutputFormat ff_stream_segment_muxer = { .long_name = NULL_IF_CONFIG_SMALL("streaming 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, + .check_bitstream = seg_check_bitstream, .priv_class = &sseg_class, }; -- 2.7.3 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel