⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegencoder.c

📁 这是一个JPEG程序
💻 C
📖 第 1 页 / 共 5 页
字号:
	 	{
	 		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 + -