[FFmpeg-devel] [PATCH] avformat/img2dec: fix glob pattern detection.

Alexander Strasser eclipse7 at gmx.net
Thu Oct 2 22:51:13 CEST 2014


Hi Benoit,

  thank you for investigating this issue and sending a patch.

On 2014-09-22 12:30 +0200, Benoit Fouet wrote:
> The is_glob() function was not working with unescaped glob patterns,
> which is the way only glob_sequence (which is deprecated) works.
> Fixes ticket #3948
> ---
>  libavformat/img2dec.c | 14 +-------------
>  1 file changed, 1 insertion(+), 13 deletions(-)
> 
> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
> index a21429f..64ebc31 100644
> --- a/libavformat/img2dec.c
> +++ b/libavformat/img2dec.c
> @@ -75,19 +75,7 @@ static int infer_size(int *width_ptr, int *height_ptr, int size)
>  static int is_glob(const char *path)

  The way you want to change this function makes its semantics
unsuitable for the other place it is called. Actually it is not
the is_glob that is wrong here but the problem is the way the
demuxer selection changed since commit b3fd2b17 which fixed
ticket #3901.

  Though I agree it would be desirable to have the command line
pointed out in ticket #3948 still working.

  One way to do achieve it is to be more heuristic like you
did below.

>  {
>  #if HAVE_GLOB
> -    size_t span = 0;
> -    const char *p = path;
> -
> -    while (p = strchr(p, '%')) {
> -        if (*(++p) == '%') {
> -            ++p;
> -            continue;
> -        }
> -        if (span = strspn(p, "*?[]{}"))
> -            break;
> -    }
> -    /* Did we hit a glob char or get to the end? */
> -    return span != 0;
> +    return strspn(path, "%*?[]{}") != 0;

  This seems wrong; it would only work for '*.png' but
not for './*.png' or 'dir/*.png'. or  'foo-*.png' etc.

  Maybe something like this patch would be acceptable
(WARNING: only lightly tested):

diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index 16bd699..aa7c2f6 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -160,7 +160,7 @@ static int img_read_probe(AVProbeData *p)
     if (p->filename && ff_guess_image2_codec(p->filename)) {
         if (av_filename_number_test(p->filename))
             return AVPROBE_SCORE_MAX;
-        else if (is_glob(p->filename))
+        else if (p->filename[strcspn(p->filename, "*?{\0")]) // glob pattern?
             return AVPROBE_SCORE_MAX;
         else if (p->buf_size == 0)
             return 0;

[...]

  Alexander
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141002/f7be06c5/attachment.asc>


More information about the ffmpeg-devel mailing list