| 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]);
|
| }
|
|
|