summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido Cella <guido@guidocella.xyz>2021-10-14 16:36:57 +0200
committerDudemanguy <random342@airmail.cc>2021-10-14 15:39:07 +0000
commit9954fe01a91494b7b631d50a35e7c1d43b729529 (patch)
tree9ee5492c1d4724fbb9323f0f9d36376fbf3836ec
parent00669dabd3f57c4791e463120f73a1566cac2426 (diff)
downloadmpv-9954fe01a91494b7b631d50a35e7c1d43b729529.tar.bz2
mpv-9954fe01a91494b7b631d50a35e7c1d43b729529.tar.xz
player: add track-list/N/image sub-property
This exposes whether a video track is detected as an image, which is useful for profile conditions, property expansion and lavfi-complex. The lavf demuxer sets image to true when the existing check detects an image. When the lavf demuxer fails, the mf one guesses if the file is an image by its extension, so sh->image is set to true when the mf demuxer succeds and there's only one file. The mkv demuxer just sets image to true for any attached picture. The timeline demuxer just copies the value of image from source to destination. This sets image to true for attached pictures, standalone images and images added with !new_stream in EDL playlists, but it is imperfect since you could concatenate multiple images in an EDL playlist (which should be done with the mf demuxer anyway). This is good enough anyway since the comment of the modified function already says it is "Imperfect and arbitrary".
-rw-r--r--DOCS/interface-changes.rst1
-rw-r--r--DOCS/man/input.rst13
-rw-r--r--demux/demux_lavf.c1
-rw-r--r--demux/demux_mf.c6
-rw-r--r--demux/demux_mkv.c1
-rw-r--r--demux/demux_timeline.c1
-rw-r--r--demux/stheader.h1
-rw-r--r--player/command.c1
-rw-r--r--player/core.h1
-rw-r--r--player/loadfile.c1
10 files changed, 22 insertions, 5 deletions
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,