From 00669dabd3f57c4791e463120f73a1566cac2426 Mon Sep 17 00:00:00 2001 From: Guido Cella Date: Sat, 2 Oct 2021 19:12:39 +0200 Subject: 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. --- demux/demux_lavf.c | 18 +++++++++--------- 1 file 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 ("_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; -- cgit v1.2.3