aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/segment.c
diff options
context:
space:
mode:
authorGyan Doshi <ffmpeg@gyani.pro>2019-05-21 17:15:54 +0530
committerGyan Doshi <ffmpeg@gyani.pro>2019-05-28 12:30:29 +0530
commiteae251ead9e380c722dce7ac3f4e97017bff9a7b (patch)
treeeb0f764afaacc1675547c1c5bd13fe76c2f27c18 /libavformat/segment.c
parent9b069eb14e07d8faec32f2eef2d12e514290268f (diff)
downloadffmpeg-eae251ead9e380c722dce7ac3f4e97017bff9a7b.tar.gz
avformat/segment: populate empty outer stream extradata from packet
At present, if the outer stream extradata is empty but first packet has extradata as a side data element, then only the first segment's muxer instance may be able to extract this side data and use it. For all other segments, extradata in packet side data could be missing and generated segments may be invalid or unplayable in some apps e.g. for an ADTS AAC stream segmented to MP4, the adtstoasc BSF will add extradata to the first packet. The MOV muxer for the first segment will add this to codecpar for the inner stream and write Decoder Specific Information within the esds box. For other segments, their esds' will not have this decSpecificInfo and they can't be opened in Quicktime player or by services like nginx-vod-module.
Diffstat (limited to 'libavformat/segment.c')
-rw-r--r--libavformat/segment.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/libavformat/segment.c b/libavformat/segment.c
index 90004600bd..6e37707f9f 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -859,6 +859,20 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
if (!seg->avf || !seg->avf->pb)
return AVERROR(EINVAL);
+ if (!st->codecpar->extradata_size) {
+ int pkt_extradata_size = 0;
+ uint8_t *pkt_extradata = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &pkt_extradata_size);
+ if (pkt_extradata && pkt_extradata_size > 0) {
+ ret = ff_alloc_extradata(st->codecpar, pkt_extradata_size);
+ if (ret < 0) {
+ av_log(s, AV_LOG_WARNING, "Unable to add extradata to stream. Output segments may be invalid.\n");
+ goto calc_times;
+ }
+ memcpy(st->codecpar->extradata, pkt_extradata, pkt_extradata_size);
+ st->codecpar->extradata_size = pkt_extradata_size;
+ }
+ }
+
calc_times:
if (seg->times) {
end_pts = seg->segment_count < seg->nb_times ?