📄 jpegencoder.c
字号:
{
mcu_data[pos].R = RGB_buffer[location].R;
mcu_data[pos].G = RGB_buffer[location].G;
mcu_data[pos].B = RGB_buffer[location].B;
location++;
pos++;
}
location += du_X;
}
}
static void load_data_units_from_RGB_buffer(WORD xpos, WORD ypos)
{
BYTE i;
load_mcu_data_from_fifo(xpos, ypos);
for (i = 0; i < 64; i++)
{
YDU[i] = Y(mcu_data[i].R, mcu_data[i].G, mcu_data[i].B);
CbDU[i] = Cb(mcu_data[i].R, mcu_data[i].G, mcu_data[i].B);
CrDU[i] = Cr(mcu_data[i].R, mcu_data[i].G, mcu_data[i].B);
}
}
void main_encoder(void)
{
SWORD DCY = 0, DCCb = 0, DCCr = 0; //DC coefficients used for differential encoding
WORD xpos, ypos;
for (ypos = 0; ypos < Yimage; ypos += 8)
{
for (xpos = 0; xpos < Ximage; xpos += 8)
{
load_data_units_from_RGB_buffer(xpos, ypos);
process_DU(YDU, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(CbDU, fdtbl_Cb, &DCCb, dc_chrominance_ht, ac_chrominance_ht);
process_DU(CrDU, fdtbl_Cb, &DCCr, dc_chrominance_ht, ac_chrominance_ht);
}
}
}
#endif
#ifdef Y_HXV_2X2_DEBUG
/*
function:
read a mcu unit from FIFO
input:
xpos: position of current RGB in width
ypos: position of current RGB in height
output:
None
*/
static void load_mcu_data_from_fifo(WORD xpos, WORD ypos)
{
BYTE x, y;
BYTE pos = 0, pos1 = 64, pos2 = 2*64, pos3 = 3*64;
DWORD location, location1, location2, location3;
location = ypos * Ximage + xpos;
location1 = location + 8;
location2 = location + 8 * Ximage;
location3 = location2 + 8;
for (y = 0; y < 8; y++)
{
for (x = 0; x < 8; x++)
{
//first 8x8
mcu_data[pos].R = RGB_buffer[location].R;
mcu_data[pos].G = RGB_buffer[location].G;
mcu_data[pos].B = RGB_buffer[location].B;
//second 8x8
mcu_data[pos1].R = RGB_buffer[location1].R;
mcu_data[pos1].G = RGB_buffer[location1].G;
mcu_data[pos1].B = RGB_buffer[location1].B;
//third 8x8
mcu_data[pos2].R = RGB_buffer[location2].R;
mcu_data[pos2].G = RGB_buffer[location2].G;
mcu_data[pos2].B = RGB_buffer[location2].B;
//fourth 8x8
mcu_data[pos3].R = RGB_buffer[location3].R;
mcu_data[pos3].G = RGB_buffer[location3].G;
mcu_data[pos3].B = RGB_buffer[location3].B;
location++;
location1++;
location2++;
location3++;
pos++;
pos1++;
pos2++;
pos3++;
}
//location += Ximage - 8;
//location1 += Ximage - 8;
//location2 += Ximage - 8;
//location3 += Ximage - 8;
location += du_X;
location1 += du_X;
location2 += du_X;
location3 += du_X;
}
}
static void load_data_units_from_RGB_buffer(WORD xpos, WORD ypos)
{
BYTE i, x, y;
BYTE pos = 0, pos1 = 32;
DWORD location, location1, location2, location3, location4;
load_mcu_data_from_fifo(xpos, ypos);
location = 0;
location1 = 64;
location2 = 2*64;
location3 = 3*64;
for (i = 0; i < 64; i++)
{
YDU[i] = Y(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
YDU1[i] = Y(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
YDU2[i] = Y(mcu_data[location2].R, mcu_data[location2].G, mcu_data[location2].B);
YDU3[i] = Y(mcu_data[location3].R, mcu_data[location3].G, mcu_data[location3].B);
location++;
location1++;
location2++;
location3++;
}
location = 0 * 64;
location1 = 1*64;
location2 = 2*64;
location3 = 3*64;
//from MCU2, MCU3
for (y = 0; y < 4; y++)
{
for (x = 0; x < 4; x++)
{
CbDU[pos] = Cb(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
CrDU[pos] = Cr(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
pos++; location += 2;
CbDU[pos1] = Cb(mcu_data[location2].R, mcu_data[location2].G, mcu_data[location2].B);
CrDU[pos1] = Cr(mcu_data[location2].R, mcu_data[location2].G, mcu_data[location2].B);
pos1++; location2 += 2;
}
for (x = 0; x < 4; x++)
{
CbDU[pos] = Cb(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
CrDU[pos] = Cr(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
pos++; location1 += 2;
CbDU[pos1] = Cb(mcu_data[location3].R, mcu_data[location3].G, mcu_data[location3].B);
CrDU[pos1] = Cr(mcu_data[location3].R, mcu_data[location3].G, mcu_data[location3].B);
pos1++; location3 += 2;
}
location += 8;
location1 += 8;
location2 += 8;
location3 += 8;
}
}
void main_encoder(void)
{
SWORD DCY = 0, DCCb = 0, DCCr = 0; //DC coefficients used for differential encoding
WORD xpos, ypos;
for (ypos = 0; ypos < Yimage; ypos += 16)
{
for (xpos = 0; xpos < Ximage; xpos += 16)
{
load_data_units_from_RGB_buffer(xpos, ypos);
process_DU(YDU, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(YDU1, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(YDU2, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(YDU3, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(CbDU, fdtbl_Cb, &DCCb, dc_chrominance_ht, ac_chrominance_ht);
process_DU(CrDU, fdtbl_Cb, &DCCr, dc_chrominance_ht, ac_chrominance_ht);
}
}
}
#endif
#ifdef Y_HXV_2X1_DEBUG
static void load_mcu_data_from_fifo(WORD xpos, WORD ypos)
{
BYTE x, y;
BYTE pos = 0, pos1 = 64;
DWORD location, location1;
location = ypos * Ximage + xpos;
location1 = location + 8;
for (y = 0; y < 8; y++)
{
for (x = 0; x < 8; x++)
{
//first 8x8
mcu_data[pos].R = RGB_buffer[location].R;
mcu_data[pos].G = RGB_buffer[location].G;
mcu_data[pos].B = RGB_buffer[location].B;
//second 8x8
mcu_data[pos1].R = RGB_buffer[location1].R;
mcu_data[pos1].G = RGB_buffer[location1].G;
mcu_data[pos1].B = RGB_buffer[location1].B;
location++;
location1++;
pos++;
pos1++;
}
location += du_X;
location1 += du_X;
}
}
static void load_data_units_from_RGB_buffer(WORD xpos, WORD ypos)
{
BYTE i, x, y;
BYTE pos = 0;
DWORD location = 0, location1 = 64;
load_mcu_data_from_fifo(xpos, ypos);
for (i = 0; i < 64; i++)
{
YDU[i] = Y(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
YDU1[i] = Y(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
location++; location1++;
}
location = 0; location1 = 64;
//from MCU0, MCU1
for (y = 0; y < 8; y++)
{
for (x = 0; x < 4; x++)
{
CbDU[pos] = Cb(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
CrDU[pos] = Cr(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
pos++; location += 2;
}
for (x = 0; x < 4; x++)
{
CbDU[pos] = Cb(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
CrDU[pos] = Cr(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
pos++; location1 += 2;
}
}
}
void main_encoder(void)
{
SWORD DCY = 0, DCCb = 0, DCCr = 0; //DC coefficients used for differential encoding
WORD xpos, ypos;
for (ypos = 0; ypos < Yimage; ypos += 8)
{
for (xpos = 0; xpos < Ximage; xpos += 16)
{
load_data_units_from_RGB_buffer(xpos, ypos);
process_DU(YDU, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(YDU1, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(CbDU, fdtbl_Cb, &DCCb, dc_chrominance_ht, ac_chrominance_ht);
process_DU(CrDU, fdtbl_Cb, &DCCr, dc_chrominance_ht, ac_chrominance_ht);
}
}
}
#endif
#ifdef Y_HXV_1X2_DEBUG
static void load_mcu_data_from_fifo(WORD xpos, WORD ypos)
{
BYTE x, y;
BYTE pos = 0, pos1 = 64;
DWORD location, location1;
location = ypos * Ximage + xpos;
location1 = location + 8 * Ximage;
for (y = 0; y < 8; y++)
{
for (x = 0; x < 8; x++)
{
//first 8x8
mcu_data[pos].R = RGB_buffer[location].R;
mcu_data[pos].G = RGB_buffer[location].G;
mcu_data[pos].B = RGB_buffer[location].B;
//second 8x8
mcu_data[pos1].R = RGB_buffer[location1].R;
mcu_data[pos1].G = RGB_buffer[location1].G;
mcu_data[pos1].B = RGB_buffer[location1].B;
location++;
location1++;
pos++;
pos1++;
}
//location += Ximage - 8;
//location1 += Ximage - 8;
location += du_X;
location1 += du_X;
}
}
static void load_data_units_from_RGB_buffer(WORD xpos, WORD ypos)
{
BYTE i, x, y;
BYTE pos = 0;
DWORD location = 0, location1 = 64;
load_mcu_data_from_fifo(xpos, ypos);
for (i = 0; i < 64; i++)
{
YDU[i] = Y(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
YDU1[i] = Y(mcu_data[location1].R, mcu_data[location1].G, mcu_data[location1].B);
location++;
location1++;
}
location = 0;
//from MCU0
for (y = 0; y < 4; y++)
{
for (x = 0; x < 8; x++)
{
CbDU[pos] = Cb(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
CrDU[pos] = Cr(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
pos++; location++;
}
location += 8;
}
location = 64;
//from MCU1
for (y = 0; y < 4; y++)
{
for (x = 0; x < 8; x++)
{
CbDU[pos] = Cb(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
CrDU[pos] = Cr(mcu_data[location].R, mcu_data[location].G, mcu_data[location].B);
pos++; location++;
}
location += 8;
}
}
void main_encoder(void)
{
SWORD DCY = 0, DCCb = 0, DCCr = 0; //DC coefficients used for differential encoding
//当Y分量不止一个时,使用同一个DCY效果好
WORD xpos, ypos;
for (ypos = 0; ypos < Yimage; ypos += 16)
{
for (xpos = 0; xpos < Ximage; xpos += 8)
{
load_data_units_from_RGB_buffer(xpos, ypos);
process_DU(YDU, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(YDU1, fdtbl_Y, &DCY, dc_luminance_ht, ac_luminance_ht);
process_DU(CbDU, fdtbl_Cb, &DCCb, dc_chrominance_ht, ac_chrominance_ht);
process_DU(CrDU, fdtbl_Cb, &DCCr, dc_chrominance_ht, ac_chrominance_ht);
}
}
}
#endif
#if inverse_image //将bmp中逆序排列的图像重排后编码,编码后将为正常图像
void load_bitmap(char *bitmap_name, WORD *Ximage_original, WORD *Yimage_original)
{
WORD Xdiv8, Ydiv8;
BYTE nr_fillingbytes; //The number of the filling bytes in the BMP file
//(the dimension in bytes of a BMP line on the disk is divisible by 4)
colorRGB lastcolor;
WORD column;
BYTE TMPBUF[256];
WORD nrline_up,nrline_dn,nrline;
WORD dimline;
colorRGB *tmpline;
FILE *fp_bitmap = fopen(bitmap_name, "rb");
if (fp_bitmap == NULL)
exitmessage("----------Cannot open bitmap file.File not found ----------");
//get 54 bytes from image
if (fread(TMPBUF, 1, 54, fp_bitmap) != 54)
exitmessage("Need a truecolor BMP to encode.");
//judge if it is true bmp file
if ((TMPBUF[0] != 'B') || (TMPBUF[1] != 'M') || (TMPBUF[28] != 24))
exitmessage("Need a truecolor BMP to encode.");
//get image width, height(此处改移位运算时,效率会更好)
Ximage = (WORD)TMPBUF[19] * 256 + TMPBUF[18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -