📄 jpeg.lst
字号:
675 2 {
676 3 lastbyte=ReadByte();
677 3 valueex=(valueex<<8)+(unsigned char)lastbyte;
678 3 tempsize-=8;
679 3 } //while
680 2 lastbyte=ReadByte();
681 2 BitPos-=tempsize;
682 2 valueex=(valueex<<tempsize)+(lastbyte>>BitPos);
683 2 CurByte=lastbyte&And[BitPos];
684 2 } //else
685 1 sign=valueex>>(runsize-1);
686 1 if(sign)vvalue=valueex;//解出的码值
687 1 else
688 1 {
689 2 valueex=valueex^0xffff;
690 2 temp=0xffff<<runsize;
691 2 vvalue=-(long)(valueex^temp);
692 2 }
693 1 return FUNC_OK;
694 1 }
695 //反量化MCU中的每个组件 入口 MCUBuffer 出口 QtZzMCUBuffer
696 void IQtIZzMCUComponent(long flag)
697 {
698 1 long xdata H,VV;
699 1 long xdata i,j;
700 1 long *pQtZzMCUBuffer;
701 1 long *pMCUBuffer;
702 1
703 1 switch(flag){
704 2 case 0:
705 2 H=SampRate_Y_H;
706 2 VV=SampRate_Y_V;
707 2 pMCUBuffer=MCUBuffer;
708 2 pQtZzMCUBuffer=QtZzMCUBuffer;
709 2 break;
710 2 case 1:
711 2 H=SampRate_U_H;
712 2 VV=SampRate_U_V;
713 2 pMCUBuffer=MCUBuffer+Y_in_MCU*64;
714 2 pQtZzMCUBuffer=QtZzMCUBuffer+Y_in_MCU*64;
715 2 break;
716 2 case 2:
717 2 H=SampRate_V_H;
718 2 VV=SampRate_V_V;
719 2 pMCUBuffer=MCUBuffer+(Y_in_MCU+U_in_MCU)*64;
720 2 pQtZzMCUBuffer=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;
721 2 break;
722 2 }
723 1 for(i=0;i<VV;i++)
724 1 for (j=0;j<H;j++)
725 1 IQtIZzBlock(pMCUBuffer+(i*H+j)*64,pQtZzMCUBuffer+(i*H+j)*64,flag);
726 1 }
727 //要量化的字
728 //反量化 8*8 DU
729 void IQtIZzBlock(long *s ,long * d,long flag)
730 {
731 1 long xdata i,j;
732 1 long xdata tag;
733 1 long *pQt;
734 1 long xdata buffer2[8][8];
735 1 long *buffer1;
736 1 long xdata offset;
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 13
737 1
738 1 switch(flag)
739 1 {
740 2 case 0: //亮度
741 2 pQt=YQtTable;
742 2 offset=128;
743 2 break;
744 2 case 1: //红
745 2 pQt=UQtTable;
746 2 offset=0;
747 2 break;
748 2 case 2: //蓝
749 2 pQt=VQtTable;
750 2 offset=0;
751 2 break;
752 2 }
753 1
754 1 for(i=0;i<8;i++)
755 1 for(j=0;j<8;j++)
756 1 {
757 2 tag=Zig_Zag[i][j];
758 2 buffer2[i][j]=(long)s[tag]*(long)pQt[tag];
759 2 }
760 1 buffer1=(long *)buffer2;
761 1 Fast_IDCT(buffer1);//反DCT
762 1 for(i=0;i<8;i++)
763 1 for(j=0;j<8;j++)
764 1 d[i*8+j]=buffer2[i][j]+offset;
765 1 }
766
767 //快速反DCT
768 void Fast_IDCT(long * block)
769 {
770 1 long data i;
771 1 for (i=0; i<8; i++)idctrow(block+8*i);
772 1 for (i=0; i<8; i++)idctcol(block+i);
773 1 }
774 //从源文件读取一个字节
775 unsigned char ReadByte()
776 {
777 1 unsigned char xdata i;
778 1
779 1 i=*(lp++);// lp 为解码的起始位置
780 1 if(i==0xff)lp++;
781 1 BitPos=8;
782 1 CurByte=i;
783 1 return i;
784 1 }
785 //初始化快速反DCT
786 void Initialize_Fast_IDCT()
787 {
788 1 long xdata i;
789 1
790 1 iclp = iclip+512;
791 1 for (i= -512; i<512; i++)
792 1 iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
793 1 }
794 ////////////////////////////////////////////////////////////////////////
795 void idctrow(long * blk)
796 {
797 1 long data x0, x1, x2, x3, x4, x5, x6, x7, x8;
798 1 //longcut
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 14
799 1 if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
800 1 (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
801 1 {
802 2 blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
803 2 return;
804 2 }
805 1 x0 = (blk[0]<<11) + 128; // for proper rounding in the fourth stage
806 1 //first stage
807 1 x8 = W7*(x4+x5);
808 1 x4 = x8 + (W1-W7)*x4;
809 1 x5 = x8 - (W1+W7)*x5;
810 1 x8 = W3*(x6+x7);
811 1 x6 = x8 - (W3-W5)*x6;
812 1 x7 = x8 - (W3+W5)*x7;
813 1 //second stage
814 1 x8 = x0 + x1;
815 1 x0 -= x1;
816 1 x1 = W6*(x3+x2);
817 1 x2 = x1 - (W2+W6)*x2;
818 1 x3 = x1 + (W2-W6)*x3;
819 1 x1 = x4 + x6;
820 1 x4 -= x6;
821 1 x6 = x5 + x7;
822 1 x5 -= x7;
823 1 //third stage
824 1 x7 = x8 + x3;
825 1 x8 -= x3;
826 1 x3 = x0 + x2;
827 1 x0 -= x2;
828 1 x2 = (181*(x4+x5)+128)>>8;
829 1 x4 = (181*(x4-x5)+128)>>8;
830 1 //fourth stage
831 1 blk[0] = (x7+x1)>>8;
832 1 blk[1] = (x3+x2)>>8;
833 1 blk[2] = (x0+x4)>>8;
834 1 blk[3] = (x8+x6)>>8;
835 1 blk[4] = (x8-x6)>>8;
836 1 blk[5] = (x0-x4)>>8;
837 1 blk[6] = (x3-x2)>>8;
838 1 blk[7] = (x7-x1)>>8;
839 1 }
840
841 void idctcol(long * blk)
842 {
843 1 long xdata x0, x1, x2, x3, x4, x5, x6, x7, x8;
844 1 //longcut
845 1 if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
846 1 (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
847 1 {
848 2 blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]
849 2 =blk[8*6]=blk[8*7]=iclp[(blk[8*0]+32)>>6];
850 2 return;
851 2 }
852 1 x0 = (blk[8*0]<<8) + 8192;
853 1 //first stage
854 1 x8 = W7*(x4+x5) + 4;
855 1 x4 = (x8+(W1-W7)*x4)>>3;
856 1 x5 = (x8-(W1+W7)*x5)>>3;
857 1 x8 = W3*(x6+x7) + 4;
858 1 x6 = (x8-(W3-W5)*x6)>>3;
859 1 x7 = (x8-(W3+W5)*x7)>>3;
860 1 //second stage
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 15
861 1 x8 = x0 + x1;
862 1 x0 -= x1;
863 1 x1 = W6*(x3+x2) + 4;
864 1 x2 = (x1-(W2+W6)*x2)>>3;
865 1 x3 = (x1+(W2-W6)*x3)>>3;
866 1 x1 = x4 + x6;
867 1 x4 -= x6;
868 1 x6 = x5 + x7;
869 1 x5 -= x7;
870 1 //third stage
871 1 x7 = x8 + x3;
872 1 x8 -= x3;
873 1 x3 = x0 + x2;
874 1 x0 -= x2;
875 1 x2 = (181*(x4+x5)+128)>>8;
876 1 x4 = (181*(x4-x5)+128)>>8;
877 1 //fourth stage
878 1 blk[8*0] = iclp[(x7+x1)>>14];
879 1 blk[8*1] = iclp[(x3+x2)>>14];
880 1 blk[8*2] = iclp[(x0+x4)>>14];
881 1 blk[8*3] = iclp[(x8+x6)>>14];
882 1 blk[8*4] = iclp[(x8-x6)>>14];
883 1 blk[8*5] = iclp[(x0-x4)>>14];
884 1 blk[8*6] = iclp[(x3-x2)>>14];
885 1 blk[8*7] = iclp[(x7-x1)>>14];
886 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 20679 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = 18579 528
PDATA SIZE = ---- ----
DATA SIZE = 2 50
IDATA SIZE = ---- 4
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -