aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/dashenc.c
diff options
context:
space:
mode:
authorVishwanath Dixit <vdixit@akamai.com>2018-04-11 12:30:18 +0530
committerKarthick Jeyapal <kjeyapal@akamai.com>2018-04-17 14:31:22 +0530
commitab789e184c20bd32e50b083a8731ba9b34088d66 (patch)
treefbabf8c2beb235d46791615e6e619dde074f9d18 /libavformat/dashenc.c
parent01ba52852d2ada3c79fe02a7de5bc1fdc27d56e8 (diff)
downloadffmpeg-ab789e184c20bd32e50b083a8731ba9b34088d66.tar.gz
avformat/dashenc: segmentation at the configured segment duration rate
When use_template is enabled and use_timeline is disabled, typically it is required to generate the segments at the configured segment duration rate on an average. This commit is particularly needed to handle the segmentation when video frame rates are fractional like 29.97 or 59.94 fps.
Diffstat (limited to 'libavformat/dashenc.c')
-rw-r--r--libavformat/dashenc.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 7169e1101d..ad52730b6d 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -1267,6 +1267,7 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
DASHContext *c = s->priv_data;
AVStream *st = s->streams[pkt->stream_index];
OutputStream *os = &c->streams[pkt->stream_index];
+ int64_t seg_end_duration, elapsed_duration;
int ret;
ret = update_stream_extradata(s, os, st->codecpar);
@@ -1294,10 +1295,18 @@ static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
if (os->first_pts == AV_NOPTS_VALUE)
os->first_pts = pkt->pts;
+ if (c->use_template && !c->use_timeline) {
+ elapsed_duration = pkt->pts - os->first_pts;
+ seg_end_duration = (int64_t) os->segment_index * c->seg_duration;
+ } else {
+ elapsed_duration = pkt->pts - os->start_pts;
+ seg_end_duration = c->seg_duration;
+ }
+
if ((!c->has_video || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
pkt->flags & AV_PKT_FLAG_KEY && os->packets_written &&
- av_compare_ts(pkt->pts - os->start_pts, st->time_base,
- c->seg_duration, AV_TIME_BASE_Q) >= 0) {
+ av_compare_ts(elapsed_duration, st->time_base,
+ seg_end_duration, AV_TIME_BASE_Q) >= 0) {
int64_t prev_duration = c->last_duration;
c->last_duration = av_rescale_q(pkt->pts - os->start_pts,