Mercurial > libavcodec.hg
comparison mjpeg.c @ 26:ce751dfbcace libavcodec
added correct component id handling
| author | glantau |
|---|---|
| date | Mon, 06 Aug 2001 01:04:59 +0000 |
| parents | 1e131bc21101 |
| children | b611fafddf9e |
comparison
equal
deleted
inserted
replaced
| 25:2f603eb2f23d | 26:ce751dfbcace |
|---|---|
| 440 int buffer_size; | 440 int buffer_size; |
| 441 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ | 441 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ |
| 442 INT16 quant_matrixes[4][64]; | 442 INT16 quant_matrixes[4][64]; |
| 443 VLC vlcs[2][4]; | 443 VLC vlcs[2][4]; |
| 444 int width, height; | 444 int width, height; |
| 445 int nb_components; | |
| 446 int component_id[MAX_COMPONENTS]; | |
| 445 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */ | 447 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */ |
| 446 int v_count[MAX_COMPONENTS]; | 448 int v_count[MAX_COMPONENTS]; |
| 447 int h_max, v_max; /* maximum h and v counts */ | 449 int h_max, v_max; /* maximum h and v counts */ |
| 448 int quant_index[4]; /* quant table index for each component */ | 450 int quant_index[4]; /* quant table index for each component */ |
| 449 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */ | 451 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */ |
| 550 } | 552 } |
| 551 | 553 |
| 552 static int mjpeg_decode_sof0(MJpegDecodeContext *s, | 554 static int mjpeg_decode_sof0(MJpegDecodeContext *s, |
| 553 UINT8 *buf, int buf_size) | 555 UINT8 *buf, int buf_size) |
| 554 { | 556 { |
| 555 int len, nb_components, i, index, width, height; | 557 int len, nb_components, i, width, height; |
| 556 | 558 |
| 557 init_get_bits(&s->gb, buf, buf_size); | 559 init_get_bits(&s->gb, buf, buf_size); |
| 558 | 560 |
| 559 /* XXX: verify len field validity */ | 561 /* XXX: verify len field validity */ |
| 560 len = get_bits(&s->gb, 16); | 562 len = get_bits(&s->gb, 16); |
| 566 | 568 |
| 567 nb_components = get_bits(&s->gb, 8); | 569 nb_components = get_bits(&s->gb, 8); |
| 568 if (nb_components <= 0 || | 570 if (nb_components <= 0 || |
| 569 nb_components > MAX_COMPONENTS) | 571 nb_components > MAX_COMPONENTS) |
| 570 return -1; | 572 return -1; |
| 573 s->nb_components = nb_components; | |
| 571 s->h_max = 1; | 574 s->h_max = 1; |
| 572 s->v_max = 1; | 575 s->v_max = 1; |
| 573 for(i=0;i<nb_components;i++) { | 576 for(i=0;i<nb_components;i++) { |
| 574 /* component id */ | 577 /* component id */ |
| 575 index = get_bits(&s->gb, 8) - 1; | 578 s->component_id[i] = get_bits(&s->gb, 8) - 1; |
| 576 /* XXX: avoid this limitation */ | |
| 577 if (index < 0 || index >= MAX_COMPONENTS) | |
| 578 return -1; | |
| 579 s->h_count[i] = get_bits(&s->gb, 4); | 579 s->h_count[i] = get_bits(&s->gb, 4); |
| 580 s->v_count[i] = get_bits(&s->gb, 4); | 580 s->v_count[i] = get_bits(&s->gb, 4); |
| 581 /* compute hmax and vmax (only used in interleaved case) */ | 581 /* compute hmax and vmax (only used in interleaved case) */ |
| 582 if (s->h_count[i] > s->h_max) | 582 if (s->h_count[i] > s->h_max) |
| 583 s->h_max = s->h_count[i]; | 583 s->h_max = s->h_count[i]; |
| 584 if (s->v_count[i] > s->v_max) | 584 if (s->v_count[i] > s->v_max) |
| 585 s->v_max = s->v_count[i]; | 585 s->v_max = s->v_count[i]; |
| 586 | 586 #if 1 |
| 587 /* XXX: only 420 is accepted */ | 587 /* XXX: only 420 is accepted */ |
| 588 if ((i == 0 && (s->h_count[i] != 2 || s->v_count[i] != 2)) || | 588 if ((i == 0 && (s->h_count[i] != 2 || s->v_count[i] != 2)) || |
| 589 (i != 0 && (s->h_count[i] != 1 || s->v_count[i] != 1))) | 589 (i != 0 && (s->h_count[i] != 1 || s->v_count[i] != 1))) |
| 590 return -1; | 590 return -1; |
| 591 #endif | |
| 591 s->quant_index[i] = get_bits(&s->gb, 8); | 592 s->quant_index[i] = get_bits(&s->gb, 8); |
| 592 if (s->quant_index[i] >= 4) | 593 if (s->quant_index[i] >= 4) |
| 593 return -1; | 594 return -1; |
| 594 dprintf("component %d %d:%d\n", i, s->h_count[i], s->v_count[i]); | 595 dprintf("component %d %d:%d\n", i, s->h_count[i], s->v_count[i]); |
| 595 } | 596 } |
| 694 | 695 |
| 695 static int mjpeg_decode_sos(MJpegDecodeContext *s, | 696 static int mjpeg_decode_sos(MJpegDecodeContext *s, |
| 696 UINT8 *buf, int buf_size) | 697 UINT8 *buf, int buf_size) |
| 697 { | 698 { |
| 698 int len, nb_components, i, j, n, h, v; | 699 int len, nb_components, i, j, n, h, v; |
| 699 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index; | 700 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id; |
| 700 int comp_index[4]; | 701 int comp_index[4]; |
| 701 int dc_index[4]; | 702 int dc_index[4]; |
| 702 int ac_index[4]; | 703 int ac_index[4]; |
| 703 int nb_blocks[4]; | 704 int nb_blocks[4]; |
| 704 int h_count[4]; | 705 int h_count[4]; |
| 712 if (nb_components != 3) | 713 if (nb_components != 3) |
| 713 return -1; | 714 return -1; |
| 714 vmax = 0; | 715 vmax = 0; |
| 715 hmax = 0; | 716 hmax = 0; |
| 716 for(i=0;i<nb_components;i++) { | 717 for(i=0;i<nb_components;i++) { |
| 717 index = get_bits(&s->gb, 8) - 1; | 718 id = get_bits(&s->gb, 8) - 1; |
| 718 /* XXX: this limitation is not OK */ | 719 /* find component index */ |
| 719 if (index < 0 || index >= 4) | 720 for(index=0;index<s->nb_components;index++) |
| 720 return -1; | 721 if (id == s->component_id[index]) |
| 722 break; | |
| 723 if (index == s->nb_components) | |
| 724 return -1; | |
| 725 | |
| 721 comp_index[i] = index; | 726 comp_index[i] = index; |
| 722 | |
| 723 nb_blocks[i] = s->h_count[index] * s->v_count[index]; | 727 nb_blocks[i] = s->h_count[index] * s->v_count[index]; |
| 724 h_count[i] = s->h_count[index]; | 728 h_count[i] = s->h_count[index]; |
| 725 v_count[i] = s->v_count[index]; | 729 v_count[i] = s->v_count[index]; |
| 726 | 730 |
| 727 dc_index[i] = get_bits(&s->gb, 4); | 731 dc_index[i] = get_bits(&s->gb, 4); |
