summaryrefslogtreecommitdiff
path: root/libavformat/segment.c
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2016-10-26 22:03:02 -0500
committerRodger Combs <rodger.combs@gmail.com>2016-11-02 01:16:23 -0500
commit8e6478b723affe4d44f94d34b98e0c47f6a0b411 (patch)
tree9211ad16854d32a47b259cbdaeeb836639366bfb /libavformat/segment.c
parent5a51ca2da7b76cad2a86476590c18b26a98eafbe (diff)
lavf/segment: fix autobsf
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r--libavformat/segment.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c
index 868f0a81da..9b3dc178eb 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -798,9 +798,26 @@ static int seg_write_header(AVFormatContext *s)
{
SegmentContext *seg = s->priv_data;
AVFormatContext *oc = seg->avf;
- int ret;
+ int ret, i;
if (!seg->header_written) {
+ for (i = 0; i < s->nb_streams; i++) {
+ AVStream *st = oc->streams[i];
+ AVCodecParameters *ipar, *opar;
+
+ ipar = s->streams[i]->codecpar;
+ opar = oc->streams[i]->codecpar;
+ avcodec_parameters_copy(opar, ipar);
+ if (!oc->oformat->codec_tag ||
+ av_codec_get_id (oc->oformat->codec_tag, ipar->codec_tag) == opar->codec_id ||
+ av_codec_get_tag(oc->oformat->codec_tag, ipar->codec_id) <= 0) {
+ opar->codec_tag = ipar->codec_tag;
+ } else {
+ opar->codec_tag = 0;
+ }
+ st->sample_aspect_ratio = s->streams[i]->sample_aspect_ratio;
+ st->time_base = s->streams[i]->time_base;
+ }
ret = avformat_write_header(oc, NULL);
if (ret < 0)
return ret;
@@ -978,6 +995,25 @@ 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->bsfcs = ost->internal->bsfcs;
+ st->internal->nb_bsfcs = ost->internal->nb_bsfcs;
+ ost->internal->bsfcs = NULL;
+ ost->internal->nb_bsfcs = 0;
+ }
+ return ret;
+ }
+ return 1;
+}
+
#define OFFSET(x) offsetof(SegmentContext, x)
#define E AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
@@ -1041,6 +1077,7 @@ AVOutputFormat ff_segment_muxer = {
.write_packet = seg_write_packet,
.write_trailer = seg_write_trailer,
.deinit = seg_free,
+ .check_bitstream = seg_check_bitstream,
.priv_class = &seg_class,
};
@@ -1061,5 +1098,6 @@ AVOutputFormat ff_stream_segment_muxer = {
.write_packet = seg_write_packet,
.write_trailer = seg_write_trailer,
.deinit = seg_free,
+ .check_bitstream = seg_check_bitstream,
.priv_class = &sseg_class,
};