📄 jpeg.lst
字号:
220 3 else
221 3 {
222 4 hf_table_index=*(lp+2);
223 4 lp+=2;
224 4 while (hf_table_index!=0xff)
225 4 {
226 5 huftab1=(long)hf_table_index>>4; //huftab1=0,1
227 5 huftab2=(long)hf_table_index&0x0f; //huftab2=0,1
228 5 huftabindex=huftab1*2+huftab2;
229 5 lptemp=lp+1;
230 5 colorount=0;
231 5 for (i=0; i<16; i++)
232 5 {
233 6 code_len_table[huftabindex][i]=(long)(*(lptemp++));
234 6 colorount+=code_len_table[huftabindex][i];
235 6 }
236 5 colorount+=17;
237 5 j=0;
238 5 for (i=0; i<16; i++)
239 5 {
240 6 if(code_len_table[huftabindex][i]!=0)
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 5
241 6 {
242 7 k=0;
243 7 while(k<code_len_table[huftabindex][i])
244 7 {
245 8 code_value_table[huftabindex][k+j]=(long)(*(lptemp++));
246 8 k++;
247 8 }
248 7 j+=k;
249 7 }
250 6 }
251 5 i=0;
252 5 while (code_len_table[huftabindex][i]==0)i++;
253 5 for (j=0;j<i;j++)
254 5 {
255 6 huf_min_value[huftabindex][j]=0;
256 6 huf_max_value[huftabindex][j]=0;
257 6 }
258 5 huf_min_value[huftabindex][i]=0;
259 5 huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;
260 5 for (j=i+1;j<16;j++)
261 5 {
262 6 huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;
263 6 huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;
264 6 }
265 5 code_pos_table[huftabindex][0]=0;
266 5 for (j=1;j<16;j++)
267 5 code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];
268 5 lp+=colorount;
269 5 hf_table_index=*lp;
270 5 } //while
271 4 } //else
272 3 break;
273 3 case M_DRI:
274 3 llength=MAKEWORD(*(lp+1),*lp);
275 3 restart=MAKEWORD(*(lp+3),*(lp+2));
276 3 lp+=llength;
277 3 break;
278 3 case M_SOS:
279 3 llength=MAKEWORD(*(lp+1),*lp);
280 3 comnum=*(lp+2);
281 3 if(comnum!=comp_num)
282 3 return FUNC_FORMAT_ERROR;
283 3 lptemp=lp+3;
284 3 for (i=0;i<comp_num;i++)//每组件的信息
285 3 {
286 4 if(*lptemp==comp_index[0])
287 4 {
288 5 YDcIndex=(*(lptemp+1))>>4; //Y 使用的 Huffman 表
289 5 YAcIndex=((*(lptemp+1))&0x0f)+2;
290 5 }
291 4 else
292 4 {
293 5 UVDcIndex=(*(lptemp+1))>>4; //U,V
294 5 UVAcIndex=((*(lptemp+1))&0x0f)+2;
295 5 }
296 4 lptemp+=2;
297 4 }
298 3 lp+=llength;
299 3 finish=TRUE;
300 3 break;
301 3 case M_EOI://图片结束
302 3 return FUNC_FORMAT_ERROR;
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 6
303 3 break;
304 3 default:
305 3 if ((id&0xf0)!=0xd0)
306 3 {
307 4 llength=MAKEWORD(*(lp+1),*lp);
308 4 lp+=llength;
309 4 }
310 3 else lp+=2;
311 3 break;
312 3 } //switch
313 2 } //while
314 1 return FUNC_OK;
315 1 }
316 //初始化量化表,全部清零
317 void InitTable()
318 {
319 1 long xdata i,j;
320 1 sizei=sizej=0;
321 1 ImgWidth=ImgHeight=0;
322 1 rrun=vvalue=0;
323 1 BitPos=0;
324 1 CurByte=0;
325 1 longervalFlag=FALSE;
326 1 restart=0;
327 1 for(i=0;i<3;i++) //量化表
328 1 for(j=0;j<64;j++)
329 1 qt_table[i][j]=0;
330 1 comp_num=0;
331 1 HufTabIndex=0;
332 1 for(i=0;i<3;i++)
333 1 comp_index[i]=0;
334 1 for(i=0;i<4;i++)
335 1 for(j=0;j<16;j++){
336 2 code_len_table[i][j]=0;
337 2 code_pos_table[i][j]=0;
338 2 huf_max_value[i][j]=0;
339 2 huf_min_value[i][j]=0;
340 2 }
341 1 for(i=0;i<4;i++)
342 1 for(j=0;j<256;j++)
343 1 code_value_table[i][j]=0;
344 1
345 1 for(i=0;i<10*64;i++){
346 2 MCUBuffer[i]=0;
347 2 QtZzMCUBuffer[i]=0;
348 2 }
349 1 for(i=0;i<64;i++){
350 2 Y[i]=0;
351 2 U[i]=0;
352 2 V[i]=0;
353 2 BlockBuffer[i]=0;
354 2 }
355 1 ycoef=ucoef=vcoef=0;
356 1 }
357 //调用顺序: Initialize_Fast_IDCT() :初始化
358 // DecodeMCUBlock() Huffman Decode
359 // IQtIZzMCUComponent() 反量化、反DCT
360 // GetYUV() Get Y U V
361 // StoreBuffer() YUV to RGB
362 long Decode()
363 {
364 1 long xdata funcret;
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 7
365 1
366 1 Y_in_MCU=SampRate_Y_H*SampRate_Y_V;//YDU YDU YDU YDU
367 1 U_in_MCU=SampRate_U_H*SampRate_U_V;//cRDU
368 1 V_in_MCU=SampRate_V_H*SampRate_V_V;//cBDU
369 1 H_YtoU=SampRate_Y_H/SampRate_U_H;
370 1 V_YtoU=SampRate_Y_V/SampRate_U_V;
371 1 H_YtoV=SampRate_Y_H/SampRate_V_H;
372 1 V_YtoV=SampRate_Y_V/SampRate_V_V;
373 1 Initialize_Fast_IDCT();
374 1 while((funcret=DecodeMCUBlock())==FUNC_OK) //After Call DecodeMCUBUBlock()
375 1 {
376 2 longerval++; //The Digital has been Huffman Decoded and
377 2 if((restart)&&(longerval % restart==0))//be stored in MCUBuffer(YDU,YDU,YDU,YDU
378 2 longervalFlag=TRUE; // UDU,VDU) Every DU := 8*8
379 2 else
380 2 longervalFlag=FALSE;
381 2 IQtIZzMCUComponent(0); //反量化 and IDCT The Data in QtZzMCUBuffer
382 2 IQtIZzMCUComponent(1);
383 2 IQtIZzMCUComponent(2);
384 2 GetYUV(0); //得到Y cR cB
385 2 GetYUV(1);
386 2 GetYUV(2);
387 2 StoreBuffer(); //To RGB
388 2 sizej+=SampRate_Y_H*8;
389 2 if(sizej>=ImgWidth)
390 2 {
391 3 sizej=0;
392 3 sizei+=SampRate_Y_V*8;
393 3 }
394 2 if ((sizej==0)&&(sizei>=ImgHeight))break;
395 2 }
396 1 return funcret;
397 1 }
398 // 入口 QtZzMCUBuffer 出口 Y[] U[] V[]
399 //得到YUV色彩空间
400 void GetYUV(long flag)
401 {
402 1 long xdata H,VV;
403 1 long xdata i,j,k,h;
404 1 long *buf;
405 1 long *pQtZzMCU;
406 1
407 1 switch(flag)
408 1 {
409 2 case 0://亮度分量
410 2 H=SampRate_Y_H;
411 2 VV=SampRate_Y_V;
412 2 buf=Y;
413 2 pQtZzMCU=QtZzMCUBuffer;
414 2 break;
415 2 case 1://红色分量
416 2 H=SampRate_U_H;
417 2 VV=SampRate_U_V;
418 2 buf=U;
419 2 pQtZzMCU=QtZzMCUBuffer+Y_in_MCU*64;
420 2 break;
421 2 case 2://蓝色分量
422 2 H=SampRate_V_H;
423 2 VV=SampRate_V_V;
424 2 buf=V;
425 2 pQtZzMCU=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;
426 2 break;
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 8
427 2 }
428 1 for (i=0;i<VV;i++)
429 1 for(j=0;j<H;j++)
430 1 for(k=0;k<8;k++)
431 1 for(h=0;h<8;h++)
432 1 buf[(i*8+k)*SampRate_Y_H*8+j*8+h]=*pQtZzMCU++;
433 1 }
434
435
436 //将解出的字按RGB形式存储 lpbmp (BGR),(BGR) ......入口Y[] U[] V[] 出口lpPtr
437 void StoreBuffer()
438 {
439 1 long xdata i,j;
440 1 unsigned int color;
441 1 unsigned char xdata R,G,B;
442 1 long xdata y,u,v,rr,gg,bb;
443 1 int data counter=0;
444 1 for(i=0;i<SampRate_Y_V*8;i++)
445 1 {
446 2 if((sizei+i)<ImgHeight)// sizei表示行 sizej 表示列
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -