[FFmpeg-devel,v12,05/14] lavc/jpegtables: Handle multiple mappings to the same value

Submitted by velocityra@gmail.com on Aug. 9, 2019, 4:29 p.m.

Details

Message ID 20190809162959.17924-5-velocityra@gmail.com
State New
Headers show

Commit Message

velocityra@gmail.com Aug. 9, 2019, 4:29 p.m.
From: Nick Renieris <velocityra@gmail.com>

Some JPEGs [1] have incorrect DHT entries that map 2 codes to
the same value.

The second (last) mapping does not ever actually appear in the
code stream, therefore ignoring any mappings after the first one
fixes this.

Without this, an "mjpeg_decode_dc: bad vlc: 0:0" error is thrown.

---

[1]: Embedded JPEGs in "X7 RAW" and "X7 CinemaDNG" samples here:
     https://www.dji.com/gr/zenmuse-x7/info#downloads

Signed-off-by: Nick Renieris <velocityra@gmail.com>
---
 libavcodec/jpegtables.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

Comments

Michael Niedermayer Aug. 10, 2019, 1:11 p.m.
On Fri, Aug 09, 2019 at 07:29:50PM +0300, Nick Renieris wrote:
> From: Nick Renieris <velocityra@gmail.com>
> 
> Some JPEGs [1] have incorrect DHT entries that map 2 codes to
> the same value.
> 
> The second (last) mapping does not ever actually appear in the
> code stream, therefore ignoring any mappings after the first one
> fixes this.
> 
> Without this, an "mjpeg_decode_dc: bad vlc: 0:0" error is thrown.
> 
> ---
> 
> [1]: Embedded JPEGs in "X7 RAW" and "X7 CinemaDNG" samples here:
>      https://www.dji.com/gr/zenmuse-x7/info#downloads
> 
> Signed-off-by: Nick Renieris <velocityra@gmail.com>
> ---
>  libavcodec/jpegtables.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/jpegtables.c b/libavcodec/jpegtables.c
> index cbe5523cb4..6f596cfc92 100644
> --- a/libavcodec/jpegtables.c
> +++ b/libavcodec/jpegtables.c
> @@ -130,14 +130,27 @@ void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
>  {
>      int i, j, k,nb, code, sym;
>  
> -    code = 0;
> +    /* Zero-initialize huff_size (needed for multiple mappings check below) */
> +    k = 0;
> +    for(i=1;i<=16;i++) {
> +        nb = bits_table[i];
> +        for(j=0;j<nb;j++) {
> +            sym = val_table[k++];
> +            huff_size[sym] = 0;
> +        }
> +    }
> +
>      k = 0;
> +    code = 0;
>      for(i=1;i<=16;i++) {
>          nb = bits_table[i];
>          for(j=0;j<nb;j++) {
>              sym = val_table[k++];
> -            huff_size[sym] = i;
> -            huff_code[sym] = code;
> +            /* If there are multiple mappings to the same sym (bad files), keep the first code */
> +            if (huff_size[sym] == 0) {
> +                huff_size[sym] = i;
> +                huff_code[sym] = code;
> +            }

do these occur with sym different from 0 ?
if its just 0 then this can be simplified alot

[...]
velocityra@gmail.com Aug. 10, 2019, 1:42 p.m.
I haven't seen any files with sym!=0, just thought I'd solve the general case.
I'll change only for sym==0. Can always be changed later if any such
samples are found.


Στις Σάβ, 10 Αυγ 2019 στις 4:11 μ.μ., ο/η Michael Niedermayer
<michael@niedermayer.cc> έγραψε:
>
> On Fri, Aug 09, 2019 at 07:29:50PM +0300, Nick Renieris wrote:
> > From: Nick Renieris <velocityra@gmail.com>
> >
> > Some JPEGs [1] have incorrect DHT entries that map 2 codes to
> > the same value.
> >
> > The second (last) mapping does not ever actually appear in the
> > code stream, therefore ignoring any mappings after the first one
> > fixes this.
> >
> > Without this, an "mjpeg_decode_dc: bad vlc: 0:0" error is thrown.
> >
> > ---
> >
> > [1]: Embedded JPEGs in "X7 RAW" and "X7 CinemaDNG" samples here:
> >      https://www.dji.com/gr/zenmuse-x7/info#downloads
> >
> > Signed-off-by: Nick Renieris <velocityra@gmail.com>
> > ---
> >  libavcodec/jpegtables.c | 19 ++++++++++++++++---
> >  1 file changed, 16 insertions(+), 3 deletions(-)
> >
> > diff --git a/libavcodec/jpegtables.c b/libavcodec/jpegtables.c
> > index cbe5523cb4..6f596cfc92 100644
> > --- a/libavcodec/jpegtables.c
> > +++ b/libavcodec/jpegtables.c
> > @@ -130,14 +130,27 @@ void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
> >  {
> >      int i, j, k,nb, code, sym;
> >
> > -    code = 0;
> > +    /* Zero-initialize huff_size (needed for multiple mappings check below) */
> > +    k = 0;
> > +    for(i=1;i<=16;i++) {
> > +        nb = bits_table[i];
> > +        for(j=0;j<nb;j++) {
> > +            sym = val_table[k++];
> > +            huff_size[sym] = 0;
> > +        }
> > +    }
> > +
> >      k = 0;
> > +    code = 0;
> >      for(i=1;i<=16;i++) {
> >          nb = bits_table[i];
> >          for(j=0;j<nb;j++) {
> >              sym = val_table[k++];
> > -            huff_size[sym] = i;
> > -            huff_code[sym] = code;
> > +            /* If there are multiple mappings to the same sym (bad files), keep the first code */
> > +            if (huff_size[sym] == 0) {
> > +                huff_size[sym] = i;
> > +                huff_code[sym] = code;
> > +            }
>
> do these occur with sym different from 0 ?
> if its just 0 then this can be simplified alot
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> I do not agree with what you have to say, but I'll defend to the death your
> right to say it. -- Voltaire
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

Patch hide | download patch | download mbox

diff --git a/libavcodec/jpegtables.c b/libavcodec/jpegtables.c
index cbe5523cb4..6f596cfc92 100644
--- a/libavcodec/jpegtables.c
+++ b/libavcodec/jpegtables.c
@@ -130,14 +130,27 @@  void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
 {
     int i, j, k,nb, code, sym;
 
-    code = 0;
+    /* Zero-initialize huff_size (needed for multiple mappings check below) */
+    k = 0;
+    for(i=1;i<=16;i++) {
+        nb = bits_table[i];
+        for(j=0;j<nb;j++) {
+            sym = val_table[k++];
+            huff_size[sym] = 0;
+        }
+    }
+
     k = 0;
+    code = 0;
     for(i=1;i<=16;i++) {
         nb = bits_table[i];
         for(j=0;j<nb;j++) {
             sym = val_table[k++];
-            huff_size[sym] = i;
-            huff_code[sym] = code;
+            /* If there are multiple mappings to the same sym (bad files), keep the first code */
+            if (huff_size[sym] == 0) {
+                huff_size[sym] = i;
+                huff_code[sym] = code;
+            }
             code++;
         }
         code <<= 1;