summaryrefslogtreecommitdiff
path: root/libavformat/segment.c
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2016-03-23 09:24:22 -0500
committerRodger Combs <rodger.combs@gmail.com>2016-04-02 03:03:13 -0500
commitd38fe9f4930cba9379c1309c2433420a360f40ab (patch)
tree3d5ca744e98ca3d1b2f8eb585551cdfde5ef2ce0 /libavformat/segment.c
parentb3eda69490db5172f08a2816bc828ca920b4e1c2 (diff)
downloadffmpeg-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.c30
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,
};