📄 jpeg.lst
字号:
447 2 {
448 3 for(j=0;j<SampRate_Y_H*8;j++)
449 3 {
450 4 if((sizej+j)<ImgWidth)
451 4 {
452 5 y=Y[i*8*SampRate_Y_H+j];
453 5 u=U[(i/V_YtoU)*8*SampRate_Y_H+j/H_YtoU];
454 5 v=V[(i/V_YtoV)*8*SampRate_Y_H+j/H_YtoV];
455 5 rr=((y<<8)+18*u+367*v)>>8;
456 5 gg=((y<<8)-159*u-220*v)>>8;
457 5 bb=((y<<8)+411*u-29*v)>>8;
458 5 R=(unsigned char)rr;
459 5 G=(unsigned char)gg;
460 5 B=(unsigned char)bb;
461 5 if (rr&0xffffff00) if (rr>255) R=255; else if (rr<0) R=0;
462 5 if (gg&0xffffff00) if (gg>255) G=255; else if (gg<0) G=0;
463 5 if (bb&0xffffff00) if (bb>255) B=255; else if (bb<0) B=0;
464 5 color=R>>3;
465 5 color=color<<6;
466 5 color |=(G>>2);
467 5 color=color<<5;
468 5 color |=(B>>3);
469 5 //UART_Put_Inf("X:",/*sizej+j*/CurX);
470 5 //UART_Put_Inf("Y:",/*sizei+i*/CurY);
471 5 //UART_Send_Enter();
472 5 TFT_Draw_Point(sizej+j,sizei+i,color);
473 5 //在这里送给LCD显示
474 5 //POlong_COLOR=color;
475 5 //TFT_DrawPolong(sizej+j+CurX,sizej+j+CurX);//显示图片
476 5 //pDC->SetPixel(sizej+j+CurX,sizei+i+CurY,B*65536+G*256+R);
477 5 //if((sizej+j+CurX)==0 && (sizei+i+CurY)==0)
478 5
479 5 //UART_Put_Inf("counter:",counter++);
480 5 //UART_Put_Inf("color:",color);
481 5 //UART_Put_Inf("R:",R);
482 5 //UART_Put_Inf("G:",G);
483 5 //UART_Put_Inf("B:",B);
484 5 //UART_Send_Enter();
485 5
486 5 //colorH|=(R>>3);colorH<<=3;
487 5 //colorH|=(G>>5);
488 5 //colorL|=(G<<3);
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 9
489 5 //colorL|=B>>3;
490 5 //TFT_Write_Dat(colorH);
491 5 //TFT_Write_Dat(colorL);
492 5 {
493 6 //P1=~R;
494 6 //CString temp;
495 6 //temp.Format("%d,%d,%d",R,G,B);
496 6 //AfxMessageBox(temp);
497 6 }
498 5 }
499 4 else break;
500 4 }
501 3 }
502 2 else break;
503 2 }
504 1 }
505 //Huffman Decode MCU 出口 MCUBuffer 入口Blockbuffer[ ]
506 long DecodeMCUBlock()
507 {
508 1 long *lpMCUBuffer;
509 1 long xdata i,j;
510 1 long xdata funcret;
511 1
512 1 if (longervalFlag)//差值复位
513 1 {
514 2 lp+=2;
515 2 ycoef=ucoef=vcoef=0;
516 2 BitPos=0;
517 2 CurByte=0;
518 2 }
519 1 switch(comp_num)
520 1 {
521 2 case 3: //comp_num 指图的类型(彩色图、灰度图)
522 2 lpMCUBuffer=MCUBuffer;
523 2 for (i=0;i<SampRate_Y_H*SampRate_Y_V;i++) //Y
524 2 {
525 3 funcret=HufBlock(YDcIndex,YAcIndex);//解码4 * (8*8)
526 3 if (funcret!=FUNC_OK)
527 3 return funcret;
528 3 BlockBuffer[0]=BlockBuffer[0]+ycoef;//直流分量是差值,所以要累加。
529 3 ycoef=BlockBuffer[0];
530 3 for (j=0;j<64;j++)
531 3 *lpMCUBuffer++=BlockBuffer[j];
532 3 }
533 2 for (i=0;i<SampRate_U_H*SampRate_U_V;i++) //U
534 2 {
535 3 funcret=HufBlock(UVDcIndex,UVAcIndex);
536 3 if (funcret!=FUNC_OK)
537 3 return funcret;
538 3 BlockBuffer[0]=BlockBuffer[0]+ucoef;
539 3 ucoef=BlockBuffer[0];
540 3 for (j=0;j<64;j++)
541 3 *lpMCUBuffer++=BlockBuffer[j];
542 3 }
543 2 for (i=0;i<SampRate_V_H*SampRate_V_V;i++) //V
544 2 {
545 3 funcret=HufBlock(UVDcIndex,UVAcIndex);
546 3 if (funcret!=FUNC_OK)
547 3 return funcret;
548 3 BlockBuffer[0]=BlockBuffer[0]+vcoef;
549 3 vcoef=BlockBuffer[0];
550 3 for (j=0;j<64;j++)
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 10
551 3 *lpMCUBuffer++=BlockBuffer[j];
552 3 }
553 2 break;
554 2 case 1: //Gray Picture
555 2 lpMCUBuffer=MCUBuffer;
556 2 funcret=HufBlock(YDcIndex,YAcIndex);
557 2 if (funcret!=FUNC_OK)
558 2 return funcret;
559 2 BlockBuffer[0]=BlockBuffer[0]+ycoef;
560 2 ycoef=BlockBuffer[0];
561 2 for (j=0;j<64;j++)
562 2 *lpMCUBuffer++=BlockBuffer[j];
563 2 for (i=0;i<128;i++)
564 2 *lpMCUBuffer++=0;
565 2 break;
566 2 default:
567 2 return FUNC_FORMAT_ERROR;
568 2 }
569 1 return FUNC_OK;
570 1 }
571
572 long HufBlock(unsigned char dchufindex,unsigned char achufindex)
573 {
574 1 long xdata count=0;
575 1 long xdata i;
576 1 long xdata funcret;
577 1
578 1 //dc
579 1 HufTabIndex=dchufindex;
580 1 funcret=DecodeElement();
581 1 if(funcret!=FUNC_OK)
582 1 return funcret;
583 1
584 1 BlockBuffer[count++]=vvalue;//解出的直流系数
585 1 //ac
586 1 HufTabIndex=achufindex;
587 1 while (count<64)
588 1 {
589 2 funcret=DecodeElement();
590 2 if(funcret!=FUNC_OK)
591 2 return funcret;
592 2 if ((rrun==0)&&(vvalue==0))
593 2 {
594 3 for (i=count;i<64;i++)
595 3 BlockBuffer[i]=0;
596 3 count=64;
597 3 }
598 2 else
599 2 {
600 3 for (i=0;i<rrun;i++) //前面的零
601 3 BlockBuffer[count++]=0;
602 3 BlockBuffer[count++]=vvalue;//解出的值
603 3 }
604 2 }
605 1 return FUNC_OK;
606 1 }
607 //Huffman 解码 每个元素 出口 vvalue 入口 读文件ReadByte
608 long DecodeElement()
609 {
610 1 long xdata thiscode,tempcode;
611 1 unsigned long xdata temp,valueex;
612 1 long xdata codelen;
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 11
613 1 unsigned char xdata hufexbyte,runsize,tempsize,sign;
614 1 unsigned char xdata newbyte,lastbyte;
615 1
616 1 if(BitPos>=1) //BitPos指示当前比特位置
617 1 {
618 2 BitPos--;
619 2 thiscode=(unsigned char)CurByte>>BitPos;//取一个比特
620 2 CurByte=CurByte&And[BitPos]; //清除取走的比特位
621 2 }
622 1 else //取出的一个字节已用完
623 1 { //新取
624 2 lastbyte=ReadByte(); //读出一个字节
625 2 BitPos--; //and[]:=0x0,0x1,0x3,0x7,0xf,0x1f,0x2f,0x3f,0x4f
626 2 newbyte=CurByte&And[BitPos];
627 2 thiscode=lastbyte>>7;
628 2 CurByte=newbyte;
629 2 }
630 1 codelen=1;
631 1 //与Huffman表中的码字匹配,直自找到为止
632 1 while ((thiscode<huf_min_value[HufTabIndex][codelen-1])||
633 1 (code_len_table[HufTabIndex][codelen-1]==0)||
634 1 (thiscode>huf_max_value[HufTabIndex][codelen-1]))
635 1 {
636 2 if(BitPos>=1)//取出的一个字节还有
637 2 {
638 3 BitPos--;
639 3 tempcode=(unsigned char)CurByte>>BitPos;
640 3 CurByte=CurByte&And[BitPos];
641 3 }
642 2 else
643 2 {
644 3 lastbyte=ReadByte();
645 3 BitPos--;
646 3 newbyte=CurByte&And[BitPos];
647 3 tempcode=(unsigned char)lastbyte>>7;
648 3 CurByte=newbyte;
649 3 }
650 2 thiscode=(thiscode<<1)+tempcode;
651 2 codelen++;
652 2 if(codelen>16)return FUNC_FORMAT_ERROR;
653 2 } //while
654 1 temp=thiscode-huf_min_value[HufTabIndex][codelen-1]+code_pos_table[HufTabIndex][codelen-1];
655 1 hufexbyte=(unsigned char)code_value_table[HufTabIndex][temp];
656 1 rrun=(long)(hufexbyte>>4); //一个字节中,高四位是其前面的零的个数。
657 1 runsize=hufexbyte&0x0f; //后四位为后面字的尺寸
658 1 if(runsize==0)
659 1 {
660 2 vvalue=0;
661 2 return FUNC_OK;
662 2 }
663 1 tempsize=runsize;
664 1 if(BitPos>=runsize)
665 1 {
666 2 BitPos-=runsize;
667 2 valueex=(unsigned char)CurByte>>BitPos;
668 2 CurByte=CurByte&And[BitPos];
669 2 }
670 1 else
671 1 {
672 2 valueex=CurByte;
673 2 tempsize-=BitPos;
674 2 while(tempsize>8)
C51 COMPILER V8.05a JPEG 03/14/2009 18:41:29 PAGE 12
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -