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

Submitted by velocityra@gmail.com on Aug. 20, 2019, 1:37 p.m.

Details

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

Commit Message

velocityra@gmail.com Aug. 20, 2019, 1:37 p.m.
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.

In all known files, the 2 codes are mapped to symbol 0 so only
that case is checked.

---

[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 | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

Comments

Moritz Barsnick Aug. 22, 2019, 12:54 p.m.
On Tue, Aug 20, 2019 at 16:37:37 +0300, Nick Renieris wrote:
> Some JPEGs [1] have incorrect DHT entries that map 2 codes to

This [1] becomes part of the commit message, ...

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

..., and this not, as far as I can tell, because you used three dashes to
separate? I may be totally wrong.

> Signed-off-by: Nick Renieris <velocityra@gmail.com>
> ---

Like these.

Moritz

Patch hide | download patch | download mbox

diff --git a/libavcodec/jpegtables.c b/libavcodec/jpegtables.c
index cbe5523cb4..fa5c6f9fc5 100644
--- a/libavcodec/jpegtables.c
+++ b/libavcodec/jpegtables.c
@@ -130,14 +130,25 @@  void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
 {
     int i, j, k,nb, code, sym;
 
-    code = 0;
+    /* Some badly encoded files [1] map 2 different codes to symbol 0.
+       Only the first one is valid, so we zero-initialize this here and
+       make sure we only set it once (the first time) in the loop below.
+
+       [1]: Embedded JPEGs in "X7 RAW" and "X7 CinemaDNG" samples here:
+            https://www.dji.com/gr/zenmuse-x7/info#downloads
+     */
+    huff_size[0] = 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 (sym != 0 || huff_size[sym] == 0) { /* see comment above */
+                huff_size[sym] = i;
+                huff_code[sym] = code;
+            }
             code++;
         }
         code <<= 1;