diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2016-03-23 09:24:22 -0500 |
---|---|---|
committer | Rodger Combs <rodger.combs@gmail.com> | 2016-04-02 03:03:13 -0500 |
commit | d38fe9f4930cba9379c1309c2433420a360f40ab (patch) | |
tree | 3d5ca744e98ca3d1b2f8eb585551cdfde5ef2ce0 /libavformat/segment.c | |
parent | b3eda69490db5172f08a2816bc828ca920b4e1c2 (diff) | |
download | ffmpeg-d38fe9f4930cba9379c1309c2433420a360f40ab.tar.gz |
lavf/segment: support automatic bitstream filtering
Most useful for MPEG-TS. Works by having the underlying muxer configure the
bitstream filters, then moving them to our own AVStreams.
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r-- | libavformat/segment.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c index 9ed1987709..2931905347 100644 --- a/libavformat/segment.c +++ b/libavformat/segment.c @@ -632,10 +632,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; + AVFormatContext *oc = seg->avf; AVDictionary *options = NULL; int ret; int i; @@ -706,6 +706,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"); @@ -730,10 +731,10 @@ 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; + oc = seg->avf; if (seg->write_header_trailer) { if ((ret = s->io_open(s, &oc->pb, @@ -948,6 +949,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[] = { @@ -1005,9 +1023,10 @@ AVOutputFormat ff_segment_muxer = { .long_name = NULL_IF_CONFIG_SMALL("segment"), .priv_data_size = sizeof(SegmentContext), .flags = AVFMT_NOFILE|AVFMT_GLOBALHEADER, - .write_header = seg_write_header, + .init = seg_init, .write_packet = seg_write_packet, .write_trailer = seg_write_trailer, + .check_bitstream = seg_check_bitstream, .priv_class = &seg_class, }; @@ -1023,8 +1042,9 @@ AVOutputFormat ff_stream_segment_muxer = { .long_name = NULL_IF_CONFIG_SMALL("streaming segment muxer"), .priv_data_size = sizeof(SegmentContext), .flags = AVFMT_NOFILE, - .write_header = seg_write_header, + .init = seg_init, .write_packet = seg_write_packet, .write_trailer = seg_write_trailer, + .check_bitstream = seg_check_bitstream, .priv_class = &sseg_class, }; |