summaryrefslogtreecommitdiffstats
path: root/demux/demux_lavf.c
diff options
context:
space:
mode:
Diffstat (limited to 'demux/demux_lavf.c')
-rw-r--r--demux/demux_lavf.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index e2b6ca673d..da0dbd46aa 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -939,6 +939,26 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
demuxer->fully_read = priv->format_hack.fully_read;
+ if (priv->avfc->duration > 0) {
+ demuxer->duration = (double)priv->avfc->duration / AV_TIME_BASE;
+ } else {
+ double total_duration = 0;
+ double av_duration = 0;
+ for (int n = 0; n < priv->avfc->nb_streams; n++) {
+ AVStream *st = priv->avfc->streams[n];
+ if (st->duration <= 0)
+ continue;
+ double f_duration = st->duration * av_q2d(st->time_base);
+ total_duration = MPMAX(total_duration, f_duration);
+ if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ||
+ st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
+ av_duration = MPMAX(av_duration, f_duration);
+ }
+ double duration = av_duration > 0 ? av_duration : total_duration;
+ if (duration > 0)
+ demuxer->duration = duration;
+ }
+
return 0;
}
@@ -1045,30 +1065,6 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
lavf_priv_t *priv = demuxer->priv;
switch (cmd) {
- case DEMUXER_CTRL_GET_TIME_LENGTH:
- if (priv->avfc->duration <= 0) {
- double total_duration = 0;
- double av_duration = 0;
- for (int n = 0; n < priv->avfc->nb_streams; n++) {
- AVStream *st = priv->avfc->streams[n];
- if (st->duration <= 0)
- continue;
- double f_duration = st->duration * av_q2d(st->time_base);
- total_duration = MPMAX(total_duration, f_duration);
- if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ||
- st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
- av_duration = MPMAX(av_duration, f_duration);
- }
- double duration = av_duration > 0 ? av_duration : total_duration;
- if (duration <= 0)
- return CONTROL_FALSE;
- *(double *)arg = duration;
- return CONTROL_OK;
- }
-
- *((double *)arg) = (double)priv->avfc->duration / AV_TIME_BASE;
- return CONTROL_OK;
-
case DEMUXER_CTRL_SWITCHED_TRACKS:
{
select_tracks(demuxer, 0);