comparison simple_idct.c @ 719:2b7ff6dfee35 libavcodec

first version of IDCT248 for DV decoding support
author bellard
date Thu, 03 Oct 2002 13:41:33 +0000
parents 4263629270c8
children ff90043f4a2d
comparison
equal deleted inserted replaced
718:16dab8296293 719:2b7ff6dfee35
657 idctSparseCol(block + i); 657 idctSparseCol(block + i);
658 } 658 }
659 659
660 #endif 660 #endif
661 661
662 #undef COL_SHIFT 662 /* 2x4x8 idct */
663
664 #define CN_SHIFT 12
665 #define C_FIX(x) ((int)((x) * (1 << CN_SHIFT) + 0.5))
666 #define C0 C_FIX(0.7071067811)
667 #define C1 C_FIX(0.9238795324)
668 #define C2 C_FIX(0.3826834324)
669
670 /* row idct is multiple by 16 * sqrt(2.0), col idct4 is multiplied by
671 sqrt(2). An extra division by two is needed for the first butterfly
672 stage */
673 #define C_SHIFT (4+1+12+1)
674
675 static inline void idct4col(UINT8 *dest, int line_size, const INT16 *col)
676 {
677 int c0, c1, c2, c3, a0, a1, a2, a3;
678 const UINT8 *cm = cropTbl + MAX_NEG_CROP;
679
680 a0 = col[8*0];
681 a1 = col[8*2];
682 a2 = col[8*4];
683 a3 = col[8*6];
684 c0 = (a0 + a2) * C0 + (1 << (C_SHIFT - 1)) + (128 << C_SHIFT);
685 c2 = (a0 - a2) * C0 + (1 << (C_SHIFT - 1)) + (128 << C_SHIFT);
686 c1 = a1 * C1 + a3 * C2;
687 c3 = a1 * C2 - a3 * C1;
688 dest[0] = cm[(c0 + c1) >> C_SHIFT];
689 dest += line_size;
690 dest[0] = cm[(c2 + c3) >> C_SHIFT];
691 dest += line_size;
692 dest[0] = cm[(c2 - c3) >> C_SHIFT];
693 dest += line_size;
694 dest[0] = cm[(c0 - c1) >> C_SHIFT];
695 }
696
697 #define BF(k) \
698 {\
699 int a0, a1;\
700 a0 = ptr[k];\
701 a1 = ptr[8 + k];\
702 ptr[k] = a0 + a1;\
703 ptr[8 + k] = a0 - a1;\
704 }
705
706 /* only used by DV codec. The input must be interlaced. 128 is added
707 to the pixels before clamping to avoid systematic error
708 (1024*sqrt(2)) offset would be needed otherwise. */
709 /* XXX: I think a 1.0/sqrt(2) normalization should be needed to
710 compensate the extra butterfly stage - I don't have the full DV
711 specification */
712 void simple_idct248_put(UINT8 *dest, int line_size, INT16 *block)
713 {
714 int i;
715 INT16 *ptr;
716
717 /* butterfly */
718 ptr = block;
719 for(i=0;i<4;i++) {
720 BF(0);
721 BF(1);
722 BF(2);
723 BF(3);
724 BF(4);
725 BF(5);
726 BF(6);
727 BF(7);
728 ptr += 2 * 8;
729 }
730
731 /* IDCT8 on each line */
732 for(i=0; i<8; i++) {
733 idctRowCondDC(block + i*8);
734 }
735
736 /* IDCT4 and store */
737 for(i=0;i<8;i++) {
738 idct4col(dest + i, 2 * line_size, block + i);
739 idct4col(dest + line_size + i, 2 * line_size, block + 8 + i);
740 }
741 }