Commit ab789e18 authored by Vishwanath Dixit's avatar Vishwanath Dixit Committed by Karthick Jeyapal

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.
parent 01ba5285
......@@ -228,7 +228,10 @@ ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264
@item -min_seg_duration @var{microseconds}
This is a deprecated option to set the segment length in microseconds, use @var{seg_duration} instead.
@item -seg_duration @var{duration}
Set the segment length in seconds (fractional value can be set).
Set the segment length in seconds (fractional value can be set). The value is
treated as average segment duration when @var{use_template} is enabled and
@var{use_timeline} is disabled and as minimum segment duration for all the other
use cases.
@item -window_size @var{size}
Set the maximum number of segments kept in the manifest.
@item -extra_window_size @var{size}
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment