📄 jpeg.c
字号:
#include <CsAgb.h>
#include <jpeg.h>
#include <rb_mem.h>
#include <rb_stdio.h>
#define J_RGB *(u16 *)0x06012C00
u8* jpgdata;
u16 JRGB(s16 y0,s16 cb0,s16 cr0);
s16 JPGReceiveBits (u16 cat);
u8 *JPGZig1;
/* [64] = {
0,0,1,2,1,0,0,1,2,3,4,3,2,1,0,0,1,2,3,4,5,6,5,4,3,2,1,0,0,1,2,3,
4,5,6,7,7,6,5,4,3,2,1,2,3,4,5,6,7,7,6,5,4,3,4,5,6,7,7,6,5,6,7,7
};*/
u8 *JPGZig2;
/*[64] = {
0,1,0,0,1,2,3,2,1,0,0,1,2,3,4,5,4,3,2,1,0,0,1,2,3,4,5,6,7,6,5,4,
3,2,1,0,1,2,3,4,5,6,7,7,6,5,4,3,2,3,4,5,6,7,7,6,5,4,5,6,7,7,6,7
};*/
u16 *aanscales;
//[64] = {
/* precomputed values scaled up by 14 bits */
/* 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
};*/
#define FIX_1_082392200 277 /* FIX(1.082392200) */
#define FIX_1_414213562 362 /* FIX(1.414213562) */
#define FIX_1_847759065 473 /* FIX(1.847759065) */
#define FIX_2_613125930 669 /* FIX(2.613125930) */
struct JpegType { // some type definitions (for coherence)
u16 Rows; // image height
u16 Cols; // image width
u16 SamplesY; // sampling ratios
u16 SamplesCbCr;
u16 QuantTableY; // quantization table numbers
u16 QuantTableCbCr;
u16 HuffDCTableY; // huffman table numbers
u16 HuffDCTableCbCr;
u16 HuffACTableY;
u16 HuffACTableCbCr;
u16 NumComp; // number of components
};
struct JPGHuffmanEntry { // a type for huffman tables
u16 Index;
s16 Code;
u16 Length;
}__attribute__ ((packed));
u32 findex;
u16 DCTables;
u16 ACTables;
u16 QTables;
u8 curByte;
u8 curBits;
u8 EOI;
struct JPGHuffmanEntry *HuffmanDC0;
struct JPGHuffmanEntry *HuffmanDC1;
struct JPGHuffmanEntry *HuffmanAC0;
struct JPGHuffmanEntry *HuffmanAC1;
//u16 ZigIndex;
u16 QuantTable[2][8][8]; // 2 quantization tables (Y, CbCr)
struct JpegType Image;
//u16 flen;
//s16 i;
/*u32 JPGpower2 (u16 pwr)
{
u8 i;
u16 total = 1;
for (i=0; i<pwr; i++)
total <<= 1;
return (total);
return ((u16)0x1)<<pwr;
}*/
#define JPGpower2(pwr) (((u32)0x1)<<pwr)
/*u8 JPGGetByte (void)
{
return (jpgdata[findex++]);
}
*/
u32 gfxJpeg4 (u8 x0, u8 y0, u16 *vram)
{
u8 exit = 1;
s16 y;
u16 Restart = 0;
u16 XPos; u16 YPos;
s16 dcY; s16 dcCb; s16 dcCr;
int xindex,yindex;
u16 mcu;
s16 YVector1[8][8]; // 4 vectors for Y attribute
s16 YVector2[8][8]; // (not all may be needed)
s16 YVector3[8][8];
s16 YVector4[8][8];
s16 CbVector[8][8]; // 1 vector for Cb attribute
s16 CrVector[8][8]; // 1 vector for Cr attribute
int i,j;
int i2,j2;
s16 cb; s16 cr;
s16 r; s16 g; s16 b;
int loc;
int xstep,ystep;
QTables = 0;
ACTables = 0;
DCTables = 0;
findex = 0;
if (jpgdata[findex++] == 0xff)
{
if (jpgdata[findex++] == 0xd8) exit = 0;
}
if (exit) return(0);
while (!exit)
{
if (jpgdata[findex++] == 0xff)
{
switch (jpgdata[findex++])
{
case 0x00: //not important
break;
case 0xc0: //SOF0
JPGGetImageAttr();
break;
case 0xc1: //SOF1
JPGGetImageAttr();
break;
case 0xc4: //DHT
if ((ACTables < 2) || (DCTables < 2)) JPGGetHuffTables();
break;
case 0xc9: //SOF9
break;
case 0xd9: //EOI
exit = 1;
break;
case 0xda: //SOS
JPGGetSOS();
if (((DCTables == 2)&&(ACTables == 2)&&(QTables == 2))||(Image.NumComp == 1))
{
EOI = 0;
exit = 1; // Go on to secondary control loop
}
break;
case 0xdb: //DQT
if (QTables < 2) JPGGetQuantTables();
break;
case 0xdd: //DRI
Restart = JPGGetWord();
break;
case 0xe0: //APP0
JPGGetWord(); // Length of segment
findex += 5;
/*JPGGetByte(); // Major revision
JPGGetByte(); // Minor revision
JPGGetByte(); // Density definition
JPGGetByte(); // X density
JPGGetByte(); // Y density
JPGGetByte(); // Thumbnail width
JPGGetByte(); // Thumbnail height*/
findex+=7;
break;
case 0xfe: //COM
break;
}
}
}
XPos = 0;
YPos = 0; // Initialize active variables
dcY = 0; dcCb = 0; dcCr = 0;
xindex = 0; yindex = 0; mcu = 0;
r = 0; g = 0; b = 0;
curBits = 128; // Start with the seventh bit
curByte = jpgdata[findex++]; // Of the first byte
if (x0==255)
{
x0=(240-Image.Cols)/2;
y0=(160-Image.Rows)/2;
}
switch (Image.NumComp) // How many components does the image have?
{
case 3: // 3 components (Y-Cb-Cr)
{
switch (Image.SamplesY) // What's the sampling ratio of Y to CbCr?
{
case 4: // 4 pixels to 1
do // Process 16x16 blocks of pixels
{
JPGGetBlock (YVector1, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (YVector2, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (YVector3, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (YVector4, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (CbVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCb);
JPGGetBlock (CrVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCr);
loc=(y0+yindex)*240+(xindex+x0);//计算地址
for (i=0; i<8; i++) // Draw top left 8x8 pixels
{
for (j=0; j<8; j++)
{
y = YVector1[i][j];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
//if (xindex+j>=Image.Cols) break;
vram[loc+j]=JRGB(y,cb,cr);
}
loc+=240;
}
loc=(y0+yindex)*240+(xindex+x0);//计算地址
for (i=0; i<8; i++) // Draw top right 8x8 pixels
{
if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
else xstep=16;
for (j=8; j<xstep; j++)
{//if (xindex+j>=Image.Cols) break;
y = YVector2[i][j - 8];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
vram[loc+j]=JRGB(y,cb,cr);
}
loc+=240;
}
loc=(y0+yindex+8)*240+(xindex+x0);//计算地址
if (yindex+16>=Image.Rows) ystep=Image.Rows-yindex;
else ystep=16;
for (i=8; i<ystep; i++) // Draw bottom left 8x8 pixels
{
for (j=0; j<8; j++)
{
//if (xindex+j>=Image.Cols) break;
y = YVector3[i - 8][j];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
vram[loc+j]=JRGB(y,cb,cr);
}
loc+=240;
}
loc=(y0+yindex+8)*240+(xindex+x0);//计算地址
if (yindex+16>=Image.Rows) ystep=Image.Rows-yindex;
else ystep=16;
for (i=8; i<16; i++) // Draw bottom right 8x8 pixels
{
if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
else xstep=16;
for (j=8; j<xstep; j++)
{
y = YVector4[i - 8][j - 8];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
vram[loc+j]=JRGB(y,cb,cr);//优化之一:直接计算RGB值
}
loc+=240;//优化之二:将乘法转换为加法,大大提升了速度
}
xindex += 16;
if (xindex >= Image.Cols)
{
xindex = 0; yindex += 16; mcu = 1;
}
if ((mcu == 1) && (Restart != 0)) //Execute the restart interval
{
curByte = jpgdata[findex++]; curByte = jpgdata[findex++]; curByte = jpgdata[findex++];
curBits = 128;
dcY = 0; dcCb = 0; dcCr = 0; mcu = 0; //Reset the DC value
}
}
// while ((findex < flen) && (yindex < Image.Rows));
while (yindex < Image.Rows);
break;
case 2: // 2 pixels to 1
do
{
JPGGetBlock (YVector1, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (YVector2, Image.HuffDCTableY, Image.HuffACTableY, Image.QuantTableY, &dcY);
JPGGetBlock (CbVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCb);
JPGGetBlock (CrVector, Image.HuffDCTableCbCr, Image.HuffACTableCbCr, Image.QuantTableCbCr, &dcCr);
// YCbCr vectors have been obtained
loc=(y0+yindex)*240+(xindex+x0);//计算地址
if (yindex+8>=Image.Rows) ystep=Image.Rows-yindex;
else ystep=8;
for (i=0; i<ystep; i++) // Draw left 8x8 pixels
{
for (j=0; j<8; j++)
{//if (xindex+j>=Image.Cols) break;
y = YVector1[i][j];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
vram[loc+j]=JRGB(y,cb,cr);
}
loc+=240;
}
loc=(y0+yindex)*240+(xindex+x0);//计算地址
if (yindex+8>=Image.Rows) ystep=Image.Rows-yindex;
else ystep=8;
for (i=0; i<ystep; i++) // Draw right 8x8 pixels
{
if (xindex+16>=Image.Cols) xstep=Image.Cols-xindex;
else xstep=16;
for (j=8; j<xstep; j++)
{
y = YVector2[i][j - 8];
i2 = i >> 1;
j2 = j >> 1;
cb = CbVector[i2][j2];
cr = CrVector[i2][j2];
vram[loc+j]=JRGB(y,cb,cr);
}
loc+=240;
}
xindex += 16;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -