diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index 759d5fa9ea..d4b96f80df 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -45,6 +45,7 @@ Interface changes - make `current-window-scale` writeable and use it in the default input.conf - add `--input-builtin-bindings` flag to control loading of built-in key bindings during start-up (default: yes). + - add ``track-list/N/image`` sub-property --- mpv 0.33.0 --- - add `--d3d11-exclusive-fs` flag to enable D3D11 exclusive fullscreen mode diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index cd360d600b..1a148589dd 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -2838,11 +2838,15 @@ Property list ``track-list/N/lang`` Track language as identified by the file. Not always available. - ``track-list/N/albumart`` + ``track-list/N/image`` ``yes``/true if this is a video track that consists of a single - picture, ``no``/false or unavailable otherwise. This is used for video - tracks that are really images embedded in audio files and for external - cover art. + picture, ``no``/false or unavailable otherwise. The heuristic used to + determine if a stream is an image doesn't attempt to detect images in + codecs normally used for videos. Otherwise, it is reliable. + + ``track-list/N/albumart`` + ``yes``/true if this is an image embedded in an audio file or external + cover art, ``no``/false or unavailable otherwise. ``track-list/N/default`` ``yes``/true if the track has the default flag set in the file, @@ -2936,6 +2940,7 @@ Property list "src-id" MPV_FORMAT_INT64 "title" MPV_FORMAT_STRING "lang" MPV_FORMAT_STRING + "image" MPV_FORMAT_FLAG "albumart" MPV_FORMAT_FLAG "default" MPV_FORMAT_FLAG "forced" MPV_FORMAT_FLAG diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 1092911f50..942f29e61a 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -714,6 +714,7 @@ static void handle_new_stream(demuxer_t *demuxer, int i) strcmp(priv->avif->name, "image2pipe") == 0 )) { MP_VERBOSE(demuxer, "Assuming this is an image format.\n"); + sh->image = true; sh->codec->fps = priv->mf_fps; } sh->codec->par_w = st->sample_aspect_ratio.num; diff --git a/demux/demux_mf.c b/demux/demux_mf.c index 40f94f4e4e..69fa0fa91c 100644 --- a/demux/demux_mf.c +++ b/demux/demux_mf.c @@ -381,8 +381,12 @@ static int demux_open_mf(demuxer_t *demuxer, enum demux_check check) // create a new video stream header struct sh_stream *sh = demux_alloc_sh_stream(STREAM_VIDEO); - struct mp_codec_params *c = sh->codec; + if (mf->nr_of_files == 1) { + MP_VERBOSE(demuxer, "Assuming this is an image format.\n"); + sh->image = true; + } + struct mp_codec_params *c = sh->codec; c->codec = codec; c->disp_w = 0; c->disp_h = 0; diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index d07f8fe1e0..b0117f0b6d 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1300,6 +1300,7 @@ static void add_coverart(struct demuxer *demuxer) sh->attached_picture->pts = 0; talloc_steal(sh, sh->attached_picture); sh->attached_picture->keyframe = true; + sh->image = true; } sh->title = att->name; demux_add_sh_stream(demuxer, sh); diff --git a/demux/demux_timeline.c b/demux/demux_timeline.c index 9b4a049aee..5572fb53bf 100644 --- a/demux/demux_timeline.c +++ b/demux/demux_timeline.c @@ -525,6 +525,7 @@ static void apply_meta(struct sh_stream *dst, struct sh_stream *src) dst->missing_timestamps = src->missing_timestamps; if (src->attached_picture) dst->attached_picture = src->attached_picture; + dst->image = src->image; } // This is mostly for EDL user-defined metadata. diff --git a/demux/stheader.h b/demux/stheader.h index 6be3b16463..8d2129e05b 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -48,6 +48,7 @@ struct sh_stream { bool dependent_track; // container dependent track flag bool visual_impaired_track; // container flag bool hearing_impaired_track;// container flag + bool image; // video stream is an image bool still_image; // video stream contains still images int hls_bitrate; diff --git a/player/command.c b/player/command.c index f2fb031819..2f17de2cf8 100644 --- a/player/command.c +++ b/player/command.c @@ -1949,6 +1949,7 @@ static int get_track_entry(int item, int action, void *arg, void *ctx) .unavailable = !track->lang}, {"audio-channels", SUB_PROP_INT(track_channels(track)), .unavailable = track_channels(track) <= 0}, + {"image", SUB_PROP_FLAG(track->image)}, {"albumart", SUB_PROP_FLAG(track->attached_picture)}, {"default", SUB_PROP_FLAG(track->default_track)}, {"forced", SUB_PROP_FLAG(track->forced_track)}, diff --git a/player/core.h b/player/core.h index 1d5b395b07..b59713721e 100644 --- a/player/core.h +++ b/player/core.h @@ -136,6 +136,7 @@ struct track { char *title; bool default_track, forced_track, dependent_track; bool visual_impaired_track, hearing_impaired_track; + bool image; bool attached_picture; char *lang; diff --git a/player/loadfile.c b/player/loadfile.c index 3c0415aed6..51865cf191 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -421,6 +421,7 @@ static struct track *add_stream_track(struct MPContext *mpctx, .dependent_track = stream->dependent_track, .visual_impaired_track = stream->visual_impaired_track, .hearing_impaired_track = stream->hearing_impaired_track, + .image = stream->image, .attached_picture = stream->attached_picture != NULL, .lang = stream->lang, .demuxer = demuxer,