Mercurial > libavcodec.hg
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 } |