diff options
author | wm4 <wm4@nowhere> | 2015-03-20 22:10:00 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-03-20 22:10:00 +0100 |
commit | 23a3fa8e9057b94d62db0b9604671a1d846ea295 (patch) | |
tree | e105939e1ca557c96b56996f4b4eb0470230cfe6 /demux/demux_lavf.c | |
parent | fe0c37b00715e17d84b524b0f6f57d910a82806d (diff) | |
download | mpv-23a3fa8e9057b94d62db0b9604671a1d846ea295.tar.bz2 mpv-23a3fa8e9057b94d62db0b9604671a1d846ea295.tar.xz |
demux_lavf: assume h264/hevc raw streams have no timestamps
There are obscure methods to add timestamps to such streams, but assume
they're unused.
Diffstat (limited to 'demux/demux_lavf.c')
-rw-r--r-- | demux/demux_lavf.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 2799dd33f9..ba7c96cc6f 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -99,6 +99,7 @@ struct format_hack { const char *mime_type; int probescore; float analyzeduration; + unsigned int if_flags; // additional AVInputFormat.flags flags bool max_probe : 1; // use probescore only if max. probe size reached bool ignore : 1; // blacklisted bool no_stream : 1; // do not wrap struct stream as AVIOContext @@ -127,6 +128,10 @@ static const struct format_hack format_hacks[] = { {"mpeg", .use_stream_ids = true}, {"mpegts", .use_stream_ids = true}, + // In theory, such streams might contain timestamps, but virtually none do. + {"h264", .if_flags = AVFMT_NOTIMESTAMPS }, + {"hevc", .if_flags = AVFMT_NOTIMESTAMPS }, + TEXTSUB("aqtitle"), TEXTSUB("ass"), TEXTSUB("jacosub"), TEXTSUB("microdvd"), TEXTSUB("mpl2"), TEXTSUB("mpsub"), TEXTSUB("pjs"), TEXTSUB("realtext"), TEXTSUB("sami"), TEXTSUB("srt"), TEXTSUB("stl"), TEXTSUB("subviewer"), @@ -148,6 +153,7 @@ typedef struct lavf_priv { char *filename; struct format_hack format_hack; AVInputFormat *avif; + int avif_flags; AVFormatContext *avfc; AVIOContext *pb; int64_t last_pts; @@ -384,6 +390,8 @@ static int lavf_check_file(demuxer_t *demuxer, enum demux_check check) priv->format_hack.image_format = true; } + priv->avif_flags = priv->avif->flags | priv->format_hack.if_flags; + demuxer->filetype = priv->avif->name; return 0; @@ -617,7 +625,7 @@ static void handle_stream(demuxer_t *demuxer, int i) sh->hls_bitrate = dict_get_decimal(st->metadata, "variant_bitrate", 0); if (!sh->title && sh->hls_bitrate > 0) sh->title = talloc_asprintf(sh, "bitrate %d", sh->hls_bitrate); - sh->missing_timestamps = !!(priv->avif->flags & AVFMT_NOTIMESTAMPS); + sh->missing_timestamps = !!(priv->avif_flags & AVFMT_NOTIMESTAMPS); } select_tracks(demuxer, i); @@ -711,7 +719,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check) AVDictionary *dopts = NULL; - if ((priv->avif->flags & AVFMT_NOFILE) || + if ((priv->avif_flags & AVFMT_NOFILE) || demuxer->stream->type == STREAMTYPE_AVDEVICE || priv->format_hack.no_stream) { @@ -795,7 +803,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check) update_metadata(demuxer, NULL); demuxer->ts_resets_possible = - priv->avif->flags & (AVFMT_TS_DISCONT | AVFMT_NOTIMESTAMPS); + priv->avif_flags & (AVFMT_TS_DISCONT | AVFMT_NOTIMESTAMPS); demuxer->start_time = priv->avfc->start_time == AV_NOPTS_VALUE ? 0 : (double)priv->avfc->start_time / AV_TIME_BASE; @@ -883,7 +891,7 @@ static void demux_seek_lavf(demuxer_t *demuxer, double rel_seek_secs, int flags) int64_t end = 0; stream_control(s, STREAM_CTRL_GET_SIZE, &end); if (end > 0 && demuxer->ts_resets_possible && - !(priv->avif->flags & AVFMT_NO_BYTE_SEEK)) + !(priv->avif_flags & AVFMT_NO_BYTE_SEEK)) { avsflags |= AVSEEK_FLAG_BYTE; priv->last_pts = end * rel_seek_secs; |