summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorNick Renieris <velocityra@gmail.com>2019-08-29 16:10:44 +0300
committerPaul B Mahol <onemda@gmail.com>2019-09-02 09:26:52 +0200
commit03f95403eb1105be50a983ef8dd135927d39f407 (patch)
tree31611747408b083093ccd7fad469daf957ee08fb /libavcodec
parent6763192cff8fa62072e9add2230ecf16e5b850f3 (diff)
lavc/jpegtables: Handle multiple mappings to the same value
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>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/jpegtables.c17
1 files changed, 14 insertions, 3 deletions
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;