diff mbox

[FFmpeg-devel] lavf/img2dec: Auto-detect svg images

Message ID CAB0OVGo4_zParNpjUPEH6eAukjkB__FVzgms-pecTrTLX++eLw@mail.gmail.com
State Withdrawn
Headers show

Commit Message

Carl Eugen Hoyos Oct. 1, 2017, 11:20 p.m. UTC
Hi!

Attached patch implements auto-detection of svg images.

Please review, Carl Eugen

Comments

Clément Bœsch Oct. 2, 2017, 5:52 a.m. UTC | #1
On Mon, Oct 02, 2017 at 01:20:15AM +0200, Carl Eugen Hoyos wrote:
> Hi!
> 
> Attached patch implements auto-detection of svg images.
> 
> Please review, Carl Eugen

> From f06137f38f166740565e58d5c7c88777508f59ec Mon Sep 17 00:00:00 2001
> From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
> Date: Mon, 2 Oct 2017 01:13:29 +0200
> Subject: [PATCH] lavf/img2dec: Auto-detect svg images.
> 
> ---
>  libavformat/img2dec.c |   17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
> index 19cae87..468c820 100644
> --- a/libavformat/img2dec.c
> +++ b/libavformat/img2dec.c
> @@ -34,6 +34,7 @@
>  #include "internal.h"
>  #include "img2.h"
>  #include "libavcodec/mjpeg.h"
> +#include "subtitles.h"
>  
>  #if HAVE_GLOB
>  /* Locally define as 0 (bitwise-OR no-op) any missing glob options that
> @@ -875,8 +876,20 @@ static int sunrast_probe(AVProbeData *p)
>  
>  static int svg_probe(AVProbeData *p)
>  {
> -    if (av_match_ext(p->filename, "svg") || av_match_ext(p->filename, "svgz"))
> -        return AVPROBE_SCORE_EXTENSION + 1;
> +    const uint8_t *b = p->buf;
> +    const uint8_t *end = p->buf + p->buf_size;
> +    if (memcmp(p->buf, "<?xml", 5))
> +        return 0;
> +    while (b < end) {
> +        b += ff_subtitles_next_line(b);
> +        if (b >= end)
> +            return 0;

> +        if (!strstr(b, "<!DOCTYPE "))
> +            continue;

at least the svg from inkscape do not have a doctype

> +        b += 9;
> +        if (strstr(b, "svg"))
> +            return AVPROBE_SCORE_MAX;
> +    }A

don't you want to keep an extension fallback?

also, I would guess strstr() is going to be slow, so maybe just look for a
line starting with "<svg".
wm4 Oct. 2, 2017, 9:43 a.m. UTC | #2
On Mon, 2 Oct 2017 01:20:15 +0200
Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:

> Hi!
> 
> Attached patch implements auto-detection of svg images.
> 
> Please review, Carl Eugen

That looks like it'd be extremely fragile and react to anything that is
XML and happens to have the string "svg" and "<!DOCTYPE" on the same
line in the probe buffer. Also nonsensical "b += 9;".
Carl Eugen Hoyos Oct. 2, 2017, 9:51 a.m. UTC | #3
2017-10-02 11:43 GMT+02:00 wm4 <nfxjfg@googlemail.com>:
> On Mon, 2 Oct 2017 01:20:15 +0200
> Carl Eugen Hoyos <ceffmpeg@gmail.com> wrote:
>
>> Hi!
>>
>> Attached patch implements auto-detection of svg images.
>>
>> Please review, Carl Eugen
>
> That looks like it'd be extremely fragile and react to anything that is
> XML and happens to have the string "svg" and "<!DOCTYPE" on the same
> line in the probe buffer.

Which would most likely be an svg file, no?

> Also nonsensical "b += 9;".

The same memory location could be "DOCTYPE" and "svg" at
the same time?

Anyway, this patch was superseded.

Carl Eugen
diff mbox

Patch

From f06137f38f166740565e58d5c7c88777508f59ec Mon Sep 17 00:00:00 2001
From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
Date: Mon, 2 Oct 2017 01:13:29 +0200
Subject: [PATCH] lavf/img2dec: Auto-detect svg images.

---
 libavformat/img2dec.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index 19cae87..468c820 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -34,6 +34,7 @@ 
 #include "internal.h"
 #include "img2.h"
 #include "libavcodec/mjpeg.h"
+#include "subtitles.h"
 
 #if HAVE_GLOB
 /* Locally define as 0 (bitwise-OR no-op) any missing glob options that
@@ -875,8 +876,20 @@  static int sunrast_probe(AVProbeData *p)
 
 static int svg_probe(AVProbeData *p)
 {
-    if (av_match_ext(p->filename, "svg") || av_match_ext(p->filename, "svgz"))
-        return AVPROBE_SCORE_EXTENSION + 1;
+    const uint8_t *b = p->buf;
+    const uint8_t *end = p->buf + p->buf_size;
+    if (memcmp(p->buf, "<?xml", 5))
+        return 0;
+    while (b < end) {
+        b += ff_subtitles_next_line(b);
+        if (b >= end)
+            return 0;
+        if (!strstr(b, "<!DOCTYPE "))
+            continue;
+        b += 9;
+        if (strstr(b, "svg"))
+            return AVPROBE_SCORE_MAX;
+    }
     return 0;
 }
 
-- 
1.7.10.4