📄 jpeg.lst
字号:
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE JPEG
OBJECT MODULE PLACED IN jpeg.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE jpeg.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "jpeg.h"
2 #include "uart.h"
3 #include "tft.h"
4
5 unsigned long xdata ImgWidth=0,ImgHeight=0;
6 unsigned long xdata counter=0;
7
8 //在JPEG函数里面用到的变量
9 long xdata SampRate_Y_H,SampRate_Y_V;
10 long xdata SampRate_U_H,SampRate_U_V;
11 long xdata SampRate_V_H,SampRate_V_V;
12 long xdata H_YtoU,V_YtoU,H_YtoV,V_YtoV;
13 long xdata Y_in_MCU,U_in_MCU,V_in_MCU;
14 unsigned char *lpJpegBuf;
15 unsigned char *lp;
16 long xdata qt_table[3][64];
17 long xdata comp_num;
18 unsigned char xdata comp_index[3];
19 unsigned char xdata YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;
20 unsigned char xdata HufTabIndex;
21 long *YQtTable,*UQtTable,*VQtTable;
22 unsigned char xdata And[9]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};
23 long xdata code_pos_table[4][16],code_len_table[4][16];
24 unsigned long xdata code_value_table[4][256];
25 unsigned long xdata huf_max_value[4][16],huf_min_value[4][16];
26 long xdata BitPos,CurByte;
27 long xdata rrun,vvalue;
28 long xdata MCUBuffer[640];
29 long xdata QtZzMCUBuffer[640];
30 long xdata BlockBuffer[64];
31 long xdata ycoef,ucoef,vcoef;
32 unsigned char xdata longervalFlag;
33 long xdata longerval;
34 long xdata Y[256],U[256],V[256];
35 unsigned char data sizei,sizej;
36 long xdata restart;
37 unsigned long xdata iclip[1024];
38 unsigned long xdata *iclp;
39
40 //开始显示的坐标值
41 long xdata CurX=0;
42 long xdata CurY=0;
43
44 long code Zig_Zag[8][8]={{0,1,5,6,14,15,27,28},
45 {2,4,7,13,16,26,29,42},
46 {3,8,12,17,25,30,41,43},
47 {9,11,18,24,37,40,44,53},
48 {10,19,23,32,39,45,52,54},
49 {20,22,33,38,46,51,55,60},
50 {21,34,37,47,50,56,59,61},
51 {35,36,48,49,57,58,62,63}
52 };
53
54
55
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 2
56 //读取JPEG代码,并解码
57 unsigned char LoadJpegFile (unsigned char *JpegFileName)
58 {
59 1 unsigned char *hJpegBuf;
60 1 long xdata funcret;
61 1
62 1 hJpegBuf=JpegFileName;//JPEG文件头
63 1 lpJpegBuf=(unsigned char*)hJpegBuf;//转换为变量指针
64 1 InitTable();
65 1 if((funcret=InitTag())!=FUNC_OK)//初始化表头不成功
66 1 {
67 2 //showerror(funcret);//错误信息显示
68 2 return FALSE;
69 2 }
70 1 if((SampRate_Y_H==0)||(SampRate_Y_V==0))
71 1 {
72 2 return FALSE ;
73 2 }
74 1 funcret=Decode();
75 1 if(funcret==FUNC_OK)//解码成功
76 1 {
77 2 return TRUE;
78 2 }
79 1 else
80 1 {
81 2 return FALSE;
82 2 }
83 1 }
84
85 ////////////////////////////////////////////////////////////////////////////////
86 long InitTag()
87 {
88 1 unsigned char xdata finish=FALSE;
89 1 unsigned char xdata id;
90 1
91 1 long xdata i,j,k;
92 1 long xdata huftab1,huftab2;
93 1 long xdata huftabindex;
94 1 unsigned char xdata hf_table_index;
95 1 unsigned char xdata qt_table_index;
96 1 unsigned char xdata comnum;
97 1
98 1 unsigned char *lptemp;
99 1 long xdata colorount;
100 1
101 1 unsigned long data temp1,temp2;
102 1 unsigned long idata llength;
103 1
104 1 lp=lpJpegBuf+2;//跳过两个字节SOI(0xFF,0xD8 Start of Image)
105 1
106 1 while (!finish)
107 1 {
108 2 id=*(lp+1);//取出低位字节(高位在前,低位在后)
109 2 lp+=2; //跳过取出的字节
110 2 switch (id)
111 2 {
112 3 case M_APP0: //JFIF APP0 segment marker (0xE0)
113 3 temp1=*(lp+1);temp2=*lp;
114 3 llength=MAKEWORD(temp1,temp2);
115 3 lp+=llength;
116 3 break;
117 3 case M_DQT: //定义量化表(0xFF,0xDB)
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 3
118 3 llength=MAKEWORD(*(lp+1),*lp);//(量化表长度)
119 3 qt_table_index=(*(lp+2))&0x0f;//量化表信息bit 0..3: QT 号(0..3, 否则错误)
120 3 //bit 4..7: QT 精度, 0 = 8 bit, 否则 16 bit
121 3 lptemp=lp+3; //n 字节的 QT, n = 64*(精度+1)
122 3 if(llength<80) //精度为 8 bit
123 3 {
124 4 for(i=0;i<64;i++)
125 4 qt_table[qt_table_index][i]=(long)*(lptemp++);
126 4 }
127 3 else //精度为 16 bit
128 3 {
129 4 for(i=0;i<64;i++)qt_table[qt_table_index][i]=(long)*(lptemp++);
130 4 qt_table_index=(*(lptemp++))&0x0f;
131 4 for(i=0;i<64;i++)qt_table[qt_table_index][i]=(long)*(lptemp++);
132 4 }
133 3 lp+=llength; //跳过量化表
134 3 break;
135 3 case M_SOF0: //帧开始 (baseline JPEG 0xFF,0xC0)
136 3 llength=MAKEWORD(*(lp+1),*lp); //长度 (高字节, 低字节), 8+components*3
137 3 ImgHeight=MAKEWORD(*(lp+4),*(lp+3));//图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
138 3 ImgWidth=MAKEWORD(*(lp+6),*(lp+5)); //图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0
139 3 comp_num=*(lp+7);//components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4
-
140 3 if((comp_num!=1)&&(comp_num!=3))return FUNC_FORMAT_ERROR;
141 3 if(comp_num==3) //YCbCr/YIQ 彩色图
142 3 {
143 4 comp_index[0]=*(lp+8); //component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
144 4 SampRate_Y_H=(*(lp+9))>>4; //水平采样系数
145 4 SampRate_Y_V=(*(lp+9))&0x0f;//垂直采样系数
146 4 YQtTable=(long *)qt_table[*(lp+10)];//通过量化表号取得量化表地址
147 4
148 4 comp_index[1]=*(lp+11); //component id
149 4 SampRate_U_H=(*(lp+12))>>4; //水平采样系数
150 4 SampRate_U_V=(*(lp+12))&0x0f; //垂直采样系数
151 4 UQtTable=(long *)qt_table[*(lp+13)];//通过量化表号取得量化表地址
152 4
153 4 comp_index[2]=*(lp+14); //component id
154 4 SampRate_V_H=(*(lp+15))>>4; //水平采样系数
155 4 SampRate_V_V=(*(lp+15))&0x0f; //垂直采样系数
156 4 VQtTable=(long *)qt_table[*(lp+16)];//通过量化表号取得量化表地址
157 4 }
158 3 else //component id
159 3 {
160 4 comp_index[0]=*(lp+8);
161 4 SampRate_Y_H=(*(lp+9))>>4;
162 4 SampRate_Y_V=(*(lp+9))&0x0f;
163 4 YQtTable=(long *)qt_table[*(lp+10)];//灰度图的量化表都一样
164 4
165 4 comp_index[1]=*(lp+8);
166 4 SampRate_U_H=1;
167 4 SampRate_U_V=1;
168 4 UQtTable=(long *)qt_table[*(lp+10)];
169 4
170 4 comp_index[2]=*(lp+8);
171 4 SampRate_V_H=1;
172 4 SampRate_V_V=1;
173 4 VQtTable=(long *)qt_table[*(lp+10)];
174 4 }
175 3 lp+=llength;
176 3 break;
177 3 case M_DHT: //定义 Huffman Table(0xFF,0xC4)
178 3 llength=MAKEWORD(*(lp+1),*lp);//长度 (高字节, 低字节)
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 4
179 3 if (llength<0xd0) // Huffman Table信息 (1 byte)
180 3 {
181 4 huftab1=(long)(*(lp+2))>>4; //huftab1=0,1(HT 类型,0 = DC 1 = AC)
182 4 huftab2=(long)(*(lp+2))&0x0f; //huftab2=0,1(HT 号 ,0 = Y 1 = UV)
183 4 huftabindex=huftab1*2+huftab2; //0 = YDC 1 = UVDC 2 = YAC 3 = UVAC
184 4 lptemp=lp+3;
185 4 for (i=0; i<16; i++) //16 bytes: 长度是 1..16 代码的符号数
186 4 code_len_table[huftabindex][i]=(long)(*(lptemp++));//码长为i的码字个数
187 4 j=0;
188 4 for (i=0; i<16; i++) //得出HT的所有码字的对应值
189 4 {
190 5 if(code_len_table[huftabindex][i]!=0)
191 5 {
192 6 k=0;
193 6 while(k<code_len_table[huftabindex][i])
194 6 {
195 7 code_value_table[huftabindex][k+j]=(long)(*(lptemp++));
196 7 k++;
197 7 }
198 6 j+=k;
199 6 }
200 5 }
201 4 i=0;
202 4 while (code_len_table[huftabindex][i]==0)i++;
203 4 for (j=0;j<i;j++)
204 4 {
205 5 huf_min_value[huftabindex][j]=0;
206 5 huf_max_value[huftabindex][j]=0;
207 5 }
208 4 huf_min_value[huftabindex][i]=0;
209 4 huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;
210 4 for (j=i+1;j<16;j++)
211 4 {
212 5 huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;
213 5 huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;
214 5 }
215 4 code_pos_table[huftabindex][0]=0;
216 4 for (j=1;j<16;j++)
217 4 code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];
218 4 lp+=llength;
219 4 } //if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -