| Index: source/patched-ffmpeg-mt/libavcodec/mjpegdec.c | 
| =================================================================== | 
| --- source/patched-ffmpeg-mt/libavcodec/mjpegdec.c	(revision 65184) | 
| +++ source/patched-ffmpeg-mt/libavcodec/mjpegdec.c	(working copy) | 
| @@ -44,23 +44,22 @@ | 
| static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, | 
| int nb_codes, int use_static, int is_ac) | 
| { | 
| -    uint8_t huff_size[256+16]; | 
| -    uint16_t huff_code[256+16]; | 
| +    uint8_t huff_size[256]; | 
| +    uint16_t huff_code[256]; | 
| +    uint16_t huff_sym[256]; | 
| +    int i; | 
|  | 
| assert(nb_codes <= 256); | 
|  | 
| memset(huff_size, 0, sizeof(huff_size)); | 
| ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table); | 
|  | 
| -    if(is_ac){ | 
| -        memmove(huff_size+16, huff_size, sizeof(uint8_t)*nb_codes); | 
| -        memmove(huff_code+16, huff_code, sizeof(uint16_t)*nb_codes); | 
| -        memset(huff_size, 0, sizeof(uint8_t)*16); | 
| -        memset(huff_code, 0, sizeof(uint16_t)*16); | 
| -        nb_codes += 16; | 
| -    } | 
| +    for(i=0; i<256; i++) | 
| +        huff_sym[i]= i + 16*is_ac; | 
|  | 
| -    return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, use_static); | 
| +    if(is_ac) huff_sym[0]= 16*256; | 
| + | 
| +    return init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, huff_sym, 2, 2, use_static); | 
| } | 
|  | 
| static void build_basic_mjpeg_vlc(MJpegDecodeContext * s) { | 
| @@ -72,6 +71,10 @@ | 
| ff_mjpeg_val_ac_luminance, 251, 0, 1); | 
| build_vlc(&s->vlcs[1][1], ff_mjpeg_bits_ac_chrominance, | 
| ff_mjpeg_val_ac_chrominance, 251, 0, 1); | 
| +    build_vlc(&s->vlcs[2][0], ff_mjpeg_bits_ac_luminance, | 
| +              ff_mjpeg_val_ac_luminance, 251, 0, 0); | 
| +    build_vlc(&s->vlcs[2][1], ff_mjpeg_bits_ac_chrominance, | 
| +              ff_mjpeg_val_ac_chrominance, 251, 0, 0); | 
| } | 
|  | 
| av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) | 
| @@ -191,6 +194,13 @@ | 
| if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1, 0, class > 0) < 0){ | 
| return -1; | 
| } | 
| + | 
| +        if(class>0){ | 
| +            free_vlc(&s->vlcs[2][index]); | 
| +            if(build_vlc(&s->vlcs[2][index], bits_table, val_table, code_max + 1, 0, 0) < 0){ | 
| +            return -1; | 
| +            } | 
| +        } | 
| } | 
| return 0; | 
| } | 
| @@ -407,16 +417,13 @@ | 
| /* AC coefs */ | 
| i = 0; | 
| {OPEN_READER(re, &s->gb) | 
| -    for(;;) { | 
| +    do { | 
| UPDATE_CACHE(re, &s->gb); | 
| GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) | 
|  | 
| -        /* EOB */ | 
| -        if (code == 0x10) | 
| -            break; | 
| i += ((unsigned)code) >> 4; | 
| -        if(code != 0x100){ | 
| code &= 0xf; | 
| +        if(code){ | 
| if(code > MIN_CACHE_BITS - 16){ | 
| UPDATE_CACHE(re, &s->gb) | 
| } | 
| @@ -428,19 +435,14 @@ | 
|  | 
| LAST_SKIP_BITS(re, &s->gb, code) | 
|  | 
| -            if (i >= 63) { | 
| -                if(i == 63){ | 
| -                    j = s->scantable.permutated[63]; | 
| -                    block[j] = level * quant_matrix[j]; | 
| -                    break; | 
| -                } | 
| +            if (i > 63) { | 
| av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); | 
| return -1; | 
| } | 
| j = s->scantable.permutated[i]; | 
| block[j] = level * quant_matrix[j]; | 
| } | 
| -    } | 
| +    }while(i<63); | 
| CLOSE_READER(re, &s->gb)} | 
|  | 
| return 0; | 
| @@ -476,12 +478,12 @@ | 
| {OPEN_READER(re, &s->gb) | 
| for(i=ss;;i++) { | 
| UPDATE_CACHE(re, &s->gb); | 
| -        GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) | 
| -        /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */ | 
| -        code -= 16; | 
| -        if(code & 0xF) { | 
| -            i += ((unsigned) code) >> 4; | 
| -            code &= 0xf; | 
| +        GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2) | 
| + | 
| +        run = ((unsigned) code) >> 4; | 
| +        code &= 0xF; | 
| +        if(code) { | 
| +            i += run; | 
| if(code > MIN_CACHE_BITS - 16){ | 
| UPDATE_CACHE(re, &s->gb) | 
| } | 
| @@ -505,17 +507,20 @@ | 
| j = s->scantable.permutated[i]; | 
| block[j] = level * quant_matrix[j] << Al; | 
| }else{ | 
| -            run = ((unsigned) code) >> 4; | 
| if(run == 0xF){// ZRL - skip 15 coefficients | 
| i += 15; | 
| +                if (i >= se) { | 
| +                    av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i); | 
| +                    return -1; | 
| +                } | 
| }else{ | 
| -                val = run; | 
| -                run = (1 << run); | 
| -                UPDATE_CACHE(re, &s->gb); | 
| -                run += (GET_CACHE(re, &s->gb) >> (32 - val)) & (run - 1); | 
| -                if(val) | 
| -                    LAST_SKIP_BITS(re, &s->gb, val); | 
| -                *EOBRUN = run - 1; | 
| +                val = (1 << run); | 
| +                if(run){ | 
| +                    UPDATE_CACHE(re, &s->gb); | 
| +                    val += NEG_USR32(GET_CACHE(re, &s->gb), run); | 
| +                    LAST_SKIP_BITS(re, &s->gb, run); | 
| +                } | 
| +                *EOBRUN = val - 1; | 
| break; | 
| } | 
| } | 
| @@ -564,9 +569,8 @@ | 
| else { | 
| for(;;i++) { | 
| UPDATE_CACHE(re, &s->gb); | 
| -            GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) | 
| -            /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */ | 
| -            code -= 16; | 
| +            GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2) | 
| + | 
| if(code & 0xF) { | 
| run = ((unsigned) code) >> 4; | 
| UPDATE_CACHE(re, &s->gb); | 
| @@ -1521,7 +1525,7 @@ | 
| av_freep(&s->ljpeg_buffer); | 
| s->ljpeg_buffer_size=0; | 
|  | 
| -    for(i=0;i<2;i++) { | 
| +    for(i=0;i<3;i++) { | 
| for(j=0;j<4;j++) | 
| free_vlc(&s->vlcs[i][j]); | 
| } | 
|  |