summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido Cella <guido@guidocella.xyz>2021-10-02 19:12:39 +0200
committerDudemanguy <random342@airmail.cc>2021-10-14 15:39:07 +0000
commit00669dabd3f57c4791e463120f73a1566cac2426 (patch)
treee5e1d00447b617985dc5a56821c82d177193e120
parentf386fd79b2df57d54d5ec0d93d4958f56a527631 (diff)
downloadmpv-00669dabd3f57c4791e463120f73a1566cac2426.tar.bz2
mpv-00669dabd3f57c4791e463120f73a1566cac2426.tar.xz
demux_lavf: improve image detection
This moves the image check to where the number of frames is available of comparison, which allows not detecting jpg and png videos as images, and detecting 1-frame gifs as images. This works with the mjpeg and png videos in the FATE suite, though unfortunately the bmp video is still detected as an image since it has nb_frames = 0. aliaspix streams are also now considered images. Attached pictures are now treated like standalone images, so audio with attached pictures now has mf-fps as container-fps instead of unavailable, which makes it consistent with external cover art, which was already being assigned mf-fps. Unfortunately images in a codec commonly used for videos are never detected, and detection was inaccurate even using the now private codec_info_nb_frames field in AVStream, and mediainfo gets them wrong too, so I guess it's just a lost cause.
-rw-r--r--demux/demux_lavf.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c
index 71fb9fc289..1092911f50 100644
--- a/demux/demux_lavf.c
+++ b/demux/demux_lavf.c
@@ -138,7 +138,6 @@ struct format_hack {
bool use_stream_ids : 1; // has a meaningful native stream IDs (export it)
bool fully_read : 1; // set demuxer.fully_read flag
bool detect_charset : 1; // format is a small text file, possibly not UTF8
- bool image_format : 1; // expected to contain exactly 1 frame
// Do not confuse player's position estimation (position is into external
// segment, with e.g. HLS, player knows about the playlist main file only).
bool clear_filepos : 1;
@@ -205,8 +204,6 @@ static const struct format_hack format_hacks[] = {
BLACKLIST("bin"),
// Useless, does not work with custom streams.
BLACKLIST("image2"),
- // Image demuxers ("<name>_pipe" is detected explicitly)
- {"image2pipe", .image_format = true},
{0}
};
@@ -528,11 +525,6 @@ static int lavf_check_file(demuxer_t *demuxer, enum demux_check check)
return -1;
}
- if (bstr_endswith0(bstr0(priv->avif->name), "_pipe")) {
- MP_VERBOSE(demuxer, "Assuming this is an image format.\n");
- priv->format_hack.image_format = true;
- }
-
if (lavfdopts->hacks)
priv->avif_flags = priv->avif->flags | priv->format_hack.if_flags;
@@ -714,8 +706,16 @@ static void handle_new_stream(demuxer_t *demuxer, int i)
sh->codec->disp_h = codec->height;
if (st->avg_frame_rate.num)
sh->codec->fps = av_q2d(st->avg_frame_rate);
- if (priv->format_hack.image_format)
+ if (st->nb_frames <= 1 && (
+ sh->attached_picture ||
+ bstr_endswith0(bstr0(priv->avif->name), "_pipe") ||
+ strcmp(priv->avif->name, "alias_pix") == 0 ||
+ strcmp(priv->avif->name, "gif") == 0 ||
+ strcmp(priv->avif->name, "image2pipe") == 0
+ )) {
+ MP_VERBOSE(demuxer, "Assuming this is an image format.\n");
sh->codec->fps = priv->mf_fps;
+ }
sh->codec->par_w = st->sample_aspect_ratio.num;
sh->codec->par_h = st->sample_aspect_ratio.den;