Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: source/patched-ffmpeg-mt/libavcodec/mjpegdec.c

Issue 4533003: patched ffmpeg nov 2 (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * MJPEG decoder 2 * MJPEG decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard 3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2003 Alex Beregszaszi 4 * Copyright (c) 2003 Alex Beregszaszi
5 * Copyright (c) 2003-2004 Michael Niedermayer 5 * Copyright (c) 2003-2004 Michael Niedermayer
6 * 6 *
7 * Support for external huffman table, various fixes (AVID workaround), 7 * Support for external huffman table, various fixes (AVID workaround),
8 * aspecting, new decode_frame mechanism and apple mjpeg-b support 8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
9 * by Alex Beregszaszi 9 * by Alex Beregszaszi
10 * 10 *
(...skipping 26 matching lines...) Expand all
37 #include "avcodec.h" 37 #include "avcodec.h"
38 #include "dsputil.h" 38 #include "dsputil.h"
39 #include "mjpeg.h" 39 #include "mjpeg.h"
40 #include "mjpegdec.h" 40 #include "mjpegdec.h"
41 #include "jpeglsdec.h" 41 #include "jpeglsdec.h"
42 42
43 43
44 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_tab le, 44 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_tab le,
45 int nb_codes, int use_static, int is_ac) 45 int nb_codes, int use_static, int is_ac)
46 { 46 {
47 uint8_t huff_size[256+16]; 47 uint8_t huff_size[256];
48 uint16_t huff_code[256+16]; 48 uint16_t huff_code[256];
49 uint16_t huff_sym[256];
50 int i;
49 51
50 assert(nb_codes <= 256); 52 assert(nb_codes <= 256);
51 53
52 memset(huff_size, 0, sizeof(huff_size)); 54 memset(huff_size, 0, sizeof(huff_size));
53 ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table); 55 ff_mjpeg_build_huffman_codes(huff_size, huff_code, bits_table, val_table);
54 56
55 if(is_ac){ 57 for(i=0; i<256; i++)
56 memmove(huff_size+16, huff_size, sizeof(uint8_t)*nb_codes); 58 huff_sym[i]= i + 16*is_ac;
57 memmove(huff_code+16, huff_code, sizeof(uint16_t)*nb_codes);
58 memset(huff_size, 0, sizeof(uint8_t)*16);
59 memset(huff_code, 0, sizeof(uint16_t)*16);
60 nb_codes += 16;
61 }
62 59
63 return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, use_stat ic); 60 if(is_ac) huff_sym[0]= 16*256;
61
62 return init_vlc_sparse(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, h uff_sym, 2, 2, use_static);
64 } 63 }
65 64
66 static void build_basic_mjpeg_vlc(MJpegDecodeContext * s) { 65 static void build_basic_mjpeg_vlc(MJpegDecodeContext * s) {
67 build_vlc(&s->vlcs[0][0], ff_mjpeg_bits_dc_luminance, 66 build_vlc(&s->vlcs[0][0], ff_mjpeg_bits_dc_luminance,
68 ff_mjpeg_val_dc, 12, 0, 0); 67 ff_mjpeg_val_dc, 12, 0, 0);
69 build_vlc(&s->vlcs[0][1], ff_mjpeg_bits_dc_chrominance, 68 build_vlc(&s->vlcs[0][1], ff_mjpeg_bits_dc_chrominance,
70 ff_mjpeg_val_dc, 12, 0, 0); 69 ff_mjpeg_val_dc, 12, 0, 0);
71 build_vlc(&s->vlcs[1][0], ff_mjpeg_bits_ac_luminance, 70 build_vlc(&s->vlcs[1][0], ff_mjpeg_bits_ac_luminance,
72 ff_mjpeg_val_ac_luminance, 251, 0, 1); 71 ff_mjpeg_val_ac_luminance, 251, 0, 1);
73 build_vlc(&s->vlcs[1][1], ff_mjpeg_bits_ac_chrominance, 72 build_vlc(&s->vlcs[1][1], ff_mjpeg_bits_ac_chrominance,
74 ff_mjpeg_val_ac_chrominance, 251, 0, 1); 73 ff_mjpeg_val_ac_chrominance, 251, 0, 1);
74 build_vlc(&s->vlcs[2][0], ff_mjpeg_bits_ac_luminance,
75 ff_mjpeg_val_ac_luminance, 251, 0, 0);
76 build_vlc(&s->vlcs[2][1], ff_mjpeg_bits_ac_chrominance,
77 ff_mjpeg_val_ac_chrominance, 251, 0, 0);
75 } 78 }
76 79
77 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) 80 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
78 { 81 {
79 MJpegDecodeContext *s = avctx->priv_data; 82 MJpegDecodeContext *s = avctx->priv_data;
80 83
81 s->avctx = avctx; 84 s->avctx = avctx;
82 dsputil_init(&s->dsp, avctx); 85 dsputil_init(&s->dsp, avctx);
83 ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); 86 ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
84 s->buffer_size = 0; 87 s->buffer_size = 0;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 } 187 }
185 len -= n; 188 len -= n;
186 189
187 /* build VLC and flush previous vlc if present */ 190 /* build VLC and flush previous vlc if present */
188 free_vlc(&s->vlcs[class][index]); 191 free_vlc(&s->vlcs[class][index]);
189 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n", 192 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
190 class, index, code_max + 1); 193 class, index, code_max + 1);
191 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1 , 0, class > 0) < 0){ 194 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1 , 0, class > 0) < 0){
192 return -1; 195 return -1;
193 } 196 }
197
198 if(class>0){
199 free_vlc(&s->vlcs[2][index]);
200 if(build_vlc(&s->vlcs[2][index], bits_table, val_table, code_max + 1 , 0, 0) < 0){
201 return -1;
202 }
203 }
194 } 204 }
195 return 0; 205 return 0;
196 } 206 }
197 207
198 int ff_mjpeg_decode_sof(MJpegDecodeContext *s) 208 int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
199 { 209 {
200 int len, nb_components, i, width, height, pix_fmt_id; 210 int len, nb_components, i, width, height, pix_fmt_id;
201 211
202 /* XXX: verify len field validity */ 212 /* XXX: verify len field validity */
203 len = get_bits(&s->gb, 16); 213 len = get_bits(&s->gb, 16);
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 if (val == 0xffff) { 410 if (val == 0xffff) {
401 av_log(s->avctx, AV_LOG_ERROR, "error dc\n"); 411 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
402 return -1; 412 return -1;
403 } 413 }
404 val = val * quant_matrix[0] + s->last_dc[component]; 414 val = val * quant_matrix[0] + s->last_dc[component];
405 s->last_dc[component] = val; 415 s->last_dc[component] = val;
406 block[0] = val; 416 block[0] = val;
407 /* AC coefs */ 417 /* AC coefs */
408 i = 0; 418 i = 0;
409 {OPEN_READER(re, &s->gb) 419 {OPEN_READER(re, &s->gb)
410 for(;;) { 420 do {
411 UPDATE_CACHE(re, &s->gb); 421 UPDATE_CACHE(re, &s->gb);
412 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) 422 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
413 423
414 /* EOB */
415 if (code == 0x10)
416 break;
417 i += ((unsigned)code) >> 4; 424 i += ((unsigned)code) >> 4;
418 if(code != 0x100){
419 code &= 0xf; 425 code &= 0xf;
426 if(code){
420 if(code > MIN_CACHE_BITS - 16){ 427 if(code > MIN_CACHE_BITS - 16){
421 UPDATE_CACHE(re, &s->gb) 428 UPDATE_CACHE(re, &s->gb)
422 } 429 }
423 { 430 {
424 int cache=GET_CACHE(re,&s->gb); 431 int cache=GET_CACHE(re,&s->gb);
425 int sign=(~cache)>>31; 432 int sign=(~cache)>>31;
426 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign; 433 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
427 } 434 }
428 435
429 LAST_SKIP_BITS(re, &s->gb, code) 436 LAST_SKIP_BITS(re, &s->gb, code)
430 437
431 if (i >= 63) { 438 if (i > 63) {
432 if(i == 63){
433 j = s->scantable.permutated[63];
434 block[j] = level * quant_matrix[j];
435 break;
436 }
437 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); 439 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
438 return -1; 440 return -1;
439 } 441 }
440 j = s->scantable.permutated[i]; 442 j = s->scantable.permutated[i];
441 block[j] = level * quant_matrix[j]; 443 block[j] = level * quant_matrix[j];
442 } 444 }
443 } 445 }while(i<63);
444 CLOSE_READER(re, &s->gb)} 446 CLOSE_READER(re, &s->gb)}
445 447
446 return 0; 448 return 0;
447 } 449 }
448 450
449 static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block, int comp onent, 451 static int decode_dc_progressive(MJpegDecodeContext *s, DCTELEM *block, int comp onent,
450 int dc_index, int16_t *quant_matrix, int Al) 452 int dc_index, int16_t *quant_matrix, int Al)
451 { 453 {
452 int val; 454 int val;
453 s->dsp.clear_block(block); 455 s->dsp.clear_block(block);
(...skipping 15 matching lines...) Expand all
469 { 471 {
470 int code, i, j, level, val, run; 472 int code, i, j, level, val, run;
471 473
472 if(*EOBRUN){ 474 if(*EOBRUN){
473 (*EOBRUN)--; 475 (*EOBRUN)--;
474 return 0; 476 return 0;
475 } 477 }
476 {OPEN_READER(re, &s->gb) 478 {OPEN_READER(re, &s->gb)
477 for(i=ss;;i++) { 479 for(i=ss;;i++) {
478 UPDATE_CACHE(re, &s->gb); 480 UPDATE_CACHE(re, &s->gb);
479 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) 481 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2)
480 /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */ 482
481 code -= 16; 483 run = ((unsigned) code) >> 4;
482 if(code & 0xF) { 484 code &= 0xF;
483 i += ((unsigned) code) >> 4; 485 if(code) {
484 code &= 0xf; 486 i += run;
485 if(code > MIN_CACHE_BITS - 16){ 487 if(code > MIN_CACHE_BITS - 16){
486 UPDATE_CACHE(re, &s->gb) 488 UPDATE_CACHE(re, &s->gb)
487 } 489 }
488 { 490 {
489 int cache=GET_CACHE(re,&s->gb); 491 int cache=GET_CACHE(re,&s->gb);
490 int sign=(~cache)>>31; 492 int sign=(~cache)>>31;
491 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign; 493 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
492 } 494 }
493 495
494 LAST_SKIP_BITS(re, &s->gb, code) 496 LAST_SKIP_BITS(re, &s->gb, code)
495 497
496 if (i >= se) { 498 if (i >= se) {
497 if(i == se){ 499 if(i == se){
498 j = s->scantable.permutated[se]; 500 j = s->scantable.permutated[se];
499 block[j] = level * quant_matrix[j] << Al; 501 block[j] = level * quant_matrix[j] << Al;
500 break; 502 break;
501 } 503 }
502 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); 504 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
503 return -1; 505 return -1;
504 } 506 }
505 j = s->scantable.permutated[i]; 507 j = s->scantable.permutated[i];
506 block[j] = level * quant_matrix[j] << Al; 508 block[j] = level * quant_matrix[j] << Al;
507 }else{ 509 }else{
508 run = ((unsigned) code) >> 4;
509 if(run == 0xF){// ZRL - skip 15 coefficients 510 if(run == 0xF){// ZRL - skip 15 coefficients
510 i += 15; 511 i += 15;
512 if (i >= se) {
513 av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
514 return -1;
515 }
511 }else{ 516 }else{
512 val = run; 517 val = (1 << run);
513 run = (1 << run); 518 if(run){
514 UPDATE_CACHE(re, &s->gb); 519 UPDATE_CACHE(re, &s->gb);
515 run += (GET_CACHE(re, &s->gb) >> (32 - val)) & (run - 1); 520 val += NEG_USR32(GET_CACHE(re, &s->gb), run);
516 if(val) 521 LAST_SKIP_BITS(re, &s->gb, run);
517 LAST_SKIP_BITS(re, &s->gb, val); 522 }
518 *EOBRUN = run - 1; 523 *EOBRUN = val - 1;
519 break; 524 break;
520 } 525 }
521 } 526 }
522 } 527 }
523 CLOSE_READER(re, &s->gb)} 528 CLOSE_READER(re, &s->gb)}
524 if(i > *last_nnz) 529 if(i > *last_nnz)
525 *last_nnz = i; 530 *last_nnz = i;
526 return 0; 531 return 0;
527 } 532 }
528 533
(...skipping 28 matching lines...) Expand all
557 { 562 {
558 int code, i=ss, j, sign, val, run; 563 int code, i=ss, j, sign, val, run;
559 int last = FFMIN(se, *last_nnz); 564 int last = FFMIN(se, *last_nnz);
560 565
561 OPEN_READER(re, &s->gb); 566 OPEN_READER(re, &s->gb);
562 if(*EOBRUN) 567 if(*EOBRUN)
563 (*EOBRUN)--; 568 (*EOBRUN)--;
564 else { 569 else {
565 for(;;i++) { 570 for(;;i++) {
566 UPDATE_CACHE(re, &s->gb); 571 UPDATE_CACHE(re, &s->gb);
567 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) 572 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2)
568 /* Progressive JPEG use AC coeffs from zero and this decoder sets of fset 16 by default */ 573
569 code -= 16;
570 if(code & 0xF) { 574 if(code & 0xF) {
571 run = ((unsigned) code) >> 4; 575 run = ((unsigned) code) >> 4;
572 UPDATE_CACHE(re, &s->gb); 576 UPDATE_CACHE(re, &s->gb);
573 val = SHOW_UBITS(re, &s->gb, 1); 577 val = SHOW_UBITS(re, &s->gb, 1);
574 LAST_SKIP_BITS(re, &s->gb, 1); 578 LAST_SKIP_BITS(re, &s->gb, 1);
575 ZERO_RUN; 579 ZERO_RUN;
576 j = s->scantable.permutated[i]; 580 j = s->scantable.permutated[i];
577 val--; 581 val--;
578 block[j] = ((quant_matrix[j]^val)-val) << Al; 582 block[j] = ((quant_matrix[j]^val)-val) << Al;
579 if(i == se) { 583 if(i == se) {
(...skipping 934 matching lines...) Expand 10 before | Expand all | Expand 10 after
1514 int i, j; 1518 int i, j;
1515 1519
1516 if (s->picture.data[0]) 1520 if (s->picture.data[0])
1517 avctx->release_buffer(avctx, &s->picture); 1521 avctx->release_buffer(avctx, &s->picture);
1518 1522
1519 av_free(s->buffer); 1523 av_free(s->buffer);
1520 av_free(s->qscale_table); 1524 av_free(s->qscale_table);
1521 av_freep(&s->ljpeg_buffer); 1525 av_freep(&s->ljpeg_buffer);
1522 s->ljpeg_buffer_size=0; 1526 s->ljpeg_buffer_size=0;
1523 1527
1524 for(i=0;i<2;i++) { 1528 for(i=0;i<3;i++) {
1525 for(j=0;j<4;j++) 1529 for(j=0;j<4;j++)
1526 free_vlc(&s->vlcs[i][j]); 1530 free_vlc(&s->vlcs[i][j]);
1527 } 1531 }
1528 for(i=0; i<MAX_COMPONENTS; i++) { 1532 for(i=0; i<MAX_COMPONENTS; i++) {
1529 av_freep(&s->blocks[i]); 1533 av_freep(&s->blocks[i]);
1530 av_freep(&s->last_nnz[i]); 1534 av_freep(&s->last_nnz[i]);
1531 } 1535 }
1532 return 0; 1536 return 0;
1533 } 1537 }
1534 1538
(...skipping 19 matching lines...) Expand all
1554 sizeof(MJpegDecodeContext), 1558 sizeof(MJpegDecodeContext),
1555 ff_mjpeg_decode_init, 1559 ff_mjpeg_decode_init,
1556 NULL, 1560 NULL,
1557 ff_mjpeg_decode_end, 1561 ff_mjpeg_decode_end,
1558 ff_mjpeg_decode_frame, 1562 ff_mjpeg_decode_frame,
1559 CODEC_CAP_DR1, 1563 CODEC_CAP_DR1,
1560 NULL, 1564 NULL,
1561 .max_lowres = 3, 1565 .max_lowres = 3,
1562 .long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"), 1566 .long_name = NULL_IF_CONFIG_SMALL("Nintendo Gamecube THP video"),
1563 }; 1567 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698