comparison mjpeg.c @ 706:e65798d228ea libavcodec

idct permutation cleanup, idct can be selected per context now fixing some threadunsafe code
author michaelni
date Sun, 29 Sep 2002 22:44:22 +0000
parents c3bdb00a98a9
children e96776e1d2ae
comparison
equal deleted inserted replaced
705:107a56aa74f5 706:e65798d228ea
320 put_bits(p, 16, 2 + 1 * (1 + 64)); 320 put_bits(p, 16, 2 + 1 * (1 + 64));
321 #endif 321 #endif
322 put_bits(p, 4, 0); /* 8 bit precision */ 322 put_bits(p, 4, 0); /* 8 bit precision */
323 put_bits(p, 4, 0); /* table 0 */ 323 put_bits(p, 4, 0); /* table 0 */
324 for(i=0;i<64;i++) { 324 for(i=0;i<64;i++) {
325 j = zigzag_direct[i]; 325 j = s->intra_scantable.permutated[i];
326 put_bits(p, 8, s->intra_matrix[j]); 326 put_bits(p, 8, s->intra_matrix[j]);
327 } 327 }
328 #ifdef TWOMATRIXES 328 #ifdef TWOMATRIXES
329 put_bits(p, 4, 0); /* 8 bit precision */ 329 put_bits(p, 4, 0); /* 8 bit precision */
330 put_bits(p, 4, 1); /* table 1 */ 330 put_bits(p, 4, 1); /* table 1 */
331 for(i=0;i<64;i++) { 331 for(i=0;i<64;i++) {
332 j = zigzag_direct[i]; 332 j = s->intra_scantable.permutated[i];
333 put_bits(p, 8, s->chroma_intra_matrix[j]); 333 put_bits(p, 8, s->chroma_intra_matrix[j]);
334 } 334 }
335 #endif 335 #endif
336 336
337 /* huffman table */ 337 /* huffman table */
533 /* AC coefs */ 533 /* AC coefs */
534 534
535 run = 0; 535 run = 0;
536 last_index = s->block_last_index[n]; 536 last_index = s->block_last_index[n];
537 for(i=1;i<=last_index;i++) { 537 for(i=1;i<=last_index;i++) {
538 j = zigzag_direct[i]; 538 j = s->intra_scantable.permutated[i];
539 val = block[j]; 539 val = block[j];
540 if (val == 0) { 540 if (val == 0) {
541 run++; 541 run++;
542 } else { 542 } else {
543 while (run >= 16) { 543 while (run >= 16) {
618 618
619 int buggy_avid; 619 int buggy_avid;
620 int restart_interval; 620 int restart_interval;
621 int restart_count; 621 int restart_count;
622 int interleaved_rows; 622 int interleaved_rows;
623 ScanTable scantable;
624 void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
623 } MJpegDecodeContext; 625 } MJpegDecodeContext;
624 626
625 #define SKIP_REMAINING(gb, len) { \ 627 #define SKIP_REMAINING(gb, len) { \
626 dprintf("reamining %d bytes in marker\n", len); \ 628 dprintf("reamining %d bytes in marker\n", len); \
627 if (len) while (--len) \ 629 if (len) while (--len) \
643 } 645 }
644 646
645 static int mjpeg_decode_init(AVCodecContext *avctx) 647 static int mjpeg_decode_init(AVCodecContext *avctx)
646 { 648 {
647 MJpegDecodeContext *s = avctx->priv_data; 649 MJpegDecodeContext *s = avctx->priv_data;
650 MpegEncContext s2;
648 651
649 s->avctx = avctx; 652 s->avctx = avctx;
653
654 /* ugly way to get the idct & scantable */
655 memset(&s2, 0, sizeof(MpegEncContext));
656 s2.flags= avctx->flags;
657 s2.avctx= avctx;
658 // s2->out_format = FMT_MJPEG;
659 s2.width = 8;
660 s2.height = 8;
661 if (MPV_common_init(&s2) < 0)
662 return -1;
663 s->scantable= s2.intra_scantable;
664 s->idct_put= s2.idct_put;
665 MPV_common_end(&s2);
650 666
651 s->header_state = 0; 667 s->header_state = 0;
652 s->mpeg_enc_ctx_allocated = 0; 668 s->mpeg_enc_ctx_allocated = 0;
653 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into 669 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
654 account FF 00 case */ 670 account FF 00 case */
655 s->start_code = -1; 671 s->start_code = -1;
656 s->buf_ptr = s->buffer; 672 s->buf_ptr = s->buffer;
657 s->first_picture = 1; 673 s->first_picture = 1;
658 s->org_width = avctx->width; 674 s->org_width = avctx->width;
659 s->org_height = avctx->height; 675 s->org_height = avctx->height;
660 676
661 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12); 677 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
662 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12); 678 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
663 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251); 679 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
664 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251); 680 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
665 681
692 if (index >= 4) 708 if (index >= 4)
693 return -1; 709 return -1;
694 dprintf("index=%d\n", index); 710 dprintf("index=%d\n", index);
695 /* read quant table */ 711 /* read quant table */
696 for(i=0;i<64;i++) { 712 for(i=0;i<64;i++) {
697 j = zigzag_direct[i]; 713 j = s->scantable.permutated[i];
698 s->quant_matrixes[index][j] = get_bits(&s->gb, 8); 714 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
699 } 715 }
700 len -= 65; 716 len -= 65;
701 } 717 }
702 718
895 i += run; 911 i += run;
896 if (i >= 64) { 912 if (i >= 64) {
897 dprintf("error count: %d\n", i); 913 dprintf("error count: %d\n", i);
898 return -1; 914 return -1;
899 } 915 }
900 j = zigzag_direct[i]; 916 j = s->scantable.permutated[i];
901 block[j] = level * quant_matrix[j]; 917 block[j] = level * quant_matrix[j];
902 i++; 918 i++;
903 if (i >= 64) 919 if (i >= 64)
904 break; 920 break;
905 } 921 }
1019 ptr = s->current_picture[c] + 1035 ptr = s->current_picture[c] +
1020 (s->linesize[c] * (v * mb_y + y) * 8) + 1036 (s->linesize[c] * (v * mb_y + y) * 8) +
1021 (h * mb_x + x) * 8; 1037 (h * mb_x + x) * 8;
1022 if (s->interlaced && s->bottom_field) 1038 if (s->interlaced && s->bottom_field)
1023 ptr += s->linesize[c] >> 1; 1039 ptr += s->linesize[c] >> 1;
1024 ff_idct_put(ptr, s->linesize[c], s->block); 1040 s->idct_put(ptr, s->linesize[c], s->block);
1025 if (++x == h) { 1041 if (++x == h) {
1026 x = 0; 1042 x = 0;
1027 y++; 1043 y++;
1028 } 1044 }
1029 } 1045 }