mirror of https://github.com/mpv-player/mpv
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.
This commit is contained in:
parent
fe0c37b007
commit
23a3fa8e90
|
@ -99,6 +99,7 @@ struct format_hack {
|
||||||
const char *mime_type;
|
const char *mime_type;
|
||||||
int probescore;
|
int probescore;
|
||||||
float analyzeduration;
|
float analyzeduration;
|
||||||
|
unsigned int if_flags; // additional AVInputFormat.flags flags
|
||||||
bool max_probe : 1; // use probescore only if max. probe size reached
|
bool max_probe : 1; // use probescore only if max. probe size reached
|
||||||
bool ignore : 1; // blacklisted
|
bool ignore : 1; // blacklisted
|
||||||
bool no_stream : 1; // do not wrap struct stream as AVIOContext
|
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},
|
{"mpeg", .use_stream_ids = true},
|
||||||
{"mpegts", .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("aqtitle"), TEXTSUB("ass"), TEXTSUB("jacosub"), TEXTSUB("microdvd"),
|
||||||
TEXTSUB("mpl2"), TEXTSUB("mpsub"), TEXTSUB("pjs"), TEXTSUB("realtext"),
|
TEXTSUB("mpl2"), TEXTSUB("mpsub"), TEXTSUB("pjs"), TEXTSUB("realtext"),
|
||||||
TEXTSUB("sami"), TEXTSUB("srt"), TEXTSUB("stl"), TEXTSUB("subviewer"),
|
TEXTSUB("sami"), TEXTSUB("srt"), TEXTSUB("stl"), TEXTSUB("subviewer"),
|
||||||
|
@ -148,6 +153,7 @@ typedef struct lavf_priv {
|
||||||
char *filename;
|
char *filename;
|
||||||
struct format_hack format_hack;
|
struct format_hack format_hack;
|
||||||
AVInputFormat *avif;
|
AVInputFormat *avif;
|
||||||
|
int avif_flags;
|
||||||
AVFormatContext *avfc;
|
AVFormatContext *avfc;
|
||||||
AVIOContext *pb;
|
AVIOContext *pb;
|
||||||
int64_t last_pts;
|
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->format_hack.image_format = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv->avif_flags = priv->avif->flags | priv->format_hack.if_flags;
|
||||||
|
|
||||||
demuxer->filetype = priv->avif->name;
|
demuxer->filetype = priv->avif->name;
|
||||||
|
|
||||||
return 0;
|
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);
|
sh->hls_bitrate = dict_get_decimal(st->metadata, "variant_bitrate", 0);
|
||||||
if (!sh->title && sh->hls_bitrate > 0)
|
if (!sh->title && sh->hls_bitrate > 0)
|
||||||
sh->title = talloc_asprintf(sh, "bitrate %d", sh->hls_bitrate);
|
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);
|
select_tracks(demuxer, i);
|
||||||
|
@ -711,7 +719,7 @@ static int demux_open_lavf(demuxer_t *demuxer, enum demux_check check)
|
||||||
|
|
||||||
AVDictionary *dopts = NULL;
|
AVDictionary *dopts = NULL;
|
||||||
|
|
||||||
if ((priv->avif->flags & AVFMT_NOFILE) ||
|
if ((priv->avif_flags & AVFMT_NOFILE) ||
|
||||||
demuxer->stream->type == STREAMTYPE_AVDEVICE ||
|
demuxer->stream->type == STREAMTYPE_AVDEVICE ||
|
||||||
priv->format_hack.no_stream)
|
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);
|
update_metadata(demuxer, NULL);
|
||||||
|
|
||||||
demuxer->ts_resets_possible =
|
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 ?
|
demuxer->start_time = priv->avfc->start_time == AV_NOPTS_VALUE ?
|
||||||
0 : (double)priv->avfc->start_time / AV_TIME_BASE;
|
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;
|
int64_t end = 0;
|
||||||
stream_control(s, STREAM_CTRL_GET_SIZE, &end);
|
stream_control(s, STREAM_CTRL_GET_SIZE, &end);
|
||||||
if (end > 0 && demuxer->ts_resets_possible &&
|
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;
|
avsflags |= AVSEEK_FLAG_BYTE;
|
||||||
priv->last_pts = end * rel_seek_secs;
|
priv->last_pts = end * rel_seek_secs;
|
||||||
|
|
Loading…
Reference in New Issue