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

📄 jpeg.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			}
		}
		if (i==20)
			jpeg_file_without_eoi=KAL_TRUE;
		else
			jpeg_file_without_eoi=KAL_FALSE;
	}
	else
	{
		for (i=1;i<20;i++)
		{
			jpg_byte2=jpg_file_ptr[thumbnail_size+jpg_file_offset-i];
			if (jpg_byte2==0xD9)
			{
				jpg_byte1=jpg_file_ptr[thumbnail_size+jpg_file_offset-i-1];
				if (jpg_byte1==0xFF)
					break;
			}
		}
		if (i==20)
			jpeg_file_without_eoi=KAL_TRUE;
		else
			jpeg_file_without_eoi=KAL_FALSE;
	}

	if ((huffman_q_table_size>=0x800)||(parse_end_flag!=0x07))
	{
		return -1;
	}
#if (defined(MT6219)||defined(MT6217))	/* hardware issue */
	if ((restart_marker_flag==1) && (jpeg_thumb_para.y_h_sample_factor==1)&&
		 (jpeg_thumb_para.y_v_sample_factor==1)&&(jpeg_thumb_para.u_h_sample_factor==0)&&
		 (jpeg_thumb_para.u_v_sample_factor==0)&&(jpeg_thumb_para.v_h_sample_factor==0)&&
		 (jpeg_thumb_para.v_v_sample_factor==0))
		return -1;
#endif

	if (jpeg_thumb_para.y_h_sample_factor>jpeg_thumb_para.u_h_sample_factor)
	{
		if (jpeg_thumb_para.y_h_sample_factor > jpeg_thumb_para.v_h_sample_factor)
			jpeg_thumb_para.max_h_sample_factor=jpeg_thumb_para.y_h_sample_factor;
		else
			jpeg_thumb_para.max_h_sample_factor=jpeg_thumb_para.v_h_sample_factor;
	}
	else
	{
		if (jpeg_thumb_para.u_h_sample_factor > jpeg_thumb_para.v_h_sample_factor)
			jpeg_thumb_para.max_h_sample_factor=jpeg_thumb_para.u_h_sample_factor;
		else
			jpeg_thumb_para.max_h_sample_factor=jpeg_thumb_para.v_h_sample_factor;
	}

	if (jpeg_thumb_para.y_v_sample_factor>jpeg_thumb_para.u_v_sample_factor)
	{
		if (jpeg_thumb_para.y_v_sample_factor > jpeg_thumb_para.v_v_sample_factor)
			jpeg_thumb_para.max_v_sample_factor=jpeg_thumb_para.y_v_sample_factor;
		else
			jpeg_thumb_para.max_v_sample_factor=jpeg_thumb_para.v_v_sample_factor;
	}
	else
	{
		if (jpeg_thumb_para.u_v_sample_factor > jpeg_thumb_para.v_v_sample_factor)
			jpeg_thumb_para.max_v_sample_factor=jpeg_thumb_para.u_v_sample_factor;
		else
			jpeg_thumb_para.max_v_sample_factor=jpeg_thumb_para.v_v_sample_factor;
	}

	if (jpeg_thumb_para.y_h_sample_factor==1)
	{
		if (jpeg_thumb_para.jpg_width & 0x07)
			jpeg_thumb_para.jpg_decode_width=((jpeg_thumb_para.jpg_width+8)>>3)<<3;
		else
			jpeg_thumb_para.jpg_decode_width=jpeg_thumb_para.jpg_width;
	}
	else if (jpeg_thumb_para.y_h_sample_factor==2)
	{
		if (jpeg_thumb_para.jpg_width & 0x0F)
			jpeg_thumb_para.jpg_decode_width=((jpeg_thumb_para.jpg_width+16)>>4)<<4;
		else
			jpeg_thumb_para.jpg_decode_width=jpeg_thumb_para.jpg_width;
	}
	else if (jpeg_thumb_para.y_h_sample_factor==4)
	{
		if (jpeg_thumb_para.jpg_width & 0x1F)
			jpeg_thumb_para.jpg_decode_width=((jpeg_thumb_para.jpg_width+32)>>5)<<5;
		else
			jpeg_thumb_para.jpg_decode_width=jpeg_thumb_para.jpg_width;
	}

	if (jpeg_thumb_para.y_v_sample_factor==1)
	{
		if (jpeg_thumb_para.jpg_height & 0x07)
			jpeg_thumb_para.jpg_decode_height=((jpeg_thumb_para.jpg_height+8)>>3)<<3;
		else
			jpeg_thumb_para.jpg_decode_height=jpeg_thumb_para.jpg_height;
	}
	else if (jpeg_thumb_para.y_v_sample_factor==2)
	{
		if (jpeg_thumb_para.jpg_height & 0x0F)
			jpeg_thumb_para.jpg_decode_height=((jpeg_thumb_para.jpg_height+16)>>4)<<4;
		else
			jpeg_thumb_para.jpg_decode_height=jpeg_thumb_para.jpg_height;
	}
	else if (jpeg_thumb_para.y_v_sample_factor==4)
	{
		if (jpeg_thumb_para.jpg_height & 0x1F)
			jpeg_thumb_para.jpg_decode_height=((jpeg_thumb_para.jpg_height+32)>>5)<<5;
		else
			jpeg_thumb_para.jpg_decode_height=jpeg_thumb_para.jpg_height;
	}

	return 0;
}	/* parse_jpeg_thumbnail() */

/*************************************************************************
* FUNCTION
*	   parse_jpeg_file
*
* DESCRIPTION
*	   This function parse the JPEG file parameters of a JPEG file.
*
* PARAMETERS
*     jpeg_file_handle  the file handler of the parsed jpeg file
*     jpg_file_ptr    	the start address pointer of the parsed jpeg file or
*								the buffer pointer for temporary JPEG data buffer
*     jpeg_file_buffer_size    the size of the parsed jpeg file or JPEG data buffer
*
* RETURNS
*		None
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_int32 parse_jpeg_file(kal_uint32 jpeg_file_handle, kal_uint8 *jpg_file_ptr,
							kal_uint32 jpeg_file_buffer_size)
{
	kal_uint8 byte,jpg_byte1,jpg_byte2;
	kal_uint32 index,index_offset,index_temp;
	kal_uint16 thumbnail_size, exif_size,exif_offset;
	kal_uint16 marker_length;
	kal_uint32 jpeg_file_index=0;
	kal_uint32 jpeg_file_size;
	kal_uint32 fs_read_size;
	kal_uint8 i;
	kal_uint8 parse_end_flag=0;
	kal_uint32 huffman_q_table_size=0;
	kal_uint8 restart_marker_flag=0;

	/* Used to check SOS marker*/
	kal_uint8 sos_num_of_comp=0;

	index=0;
	if (jpeg_file_handle!=0)
	{
		DRM_file_size((FS_HANDLE) jpeg_file_handle, &jpeg_file_size);
		jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, 0, FS_FILE_BEGIN);
		jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
		jpeg_file_index+=2;
	}

	jpeg_file_para.jpg_height=0xFFFF;
	jpeg_file_para.jpg_width=0xFFFF;
	jpeg_file_para.thumbnail_offset=0xffffffff;
	jpeg_file_para.jfif_mode=NO_THUMBNAIL_MODE;
	jpeg_file_para.jpg_progressive=KAL_FALSE;

	jpeg_thumb_para.jfif_mode=NO_THUMBNAIL_MODE;

	jpg_byte1=jpg_file_ptr[index++];
	jpg_byte2=jpg_file_ptr[index++];

	if (jpeg_file_handle!=0)
	{
		if ((jpg_byte1!=0xFF) || (jpg_byte2!=0xD8))
			return 0;
	}
	else
		index-=2;
//	if ((jpg_byte1==0xFF) && (jpg_byte2==0xD8))
	{
		do
		{
			if (jpeg_file_handle!=0)
			{
				if (jpeg_file_index>=jpeg_file_size)
		      break;
		   }
		   else
		   {
		   	if (index>=jpeg_file_buffer_size)
		   		break;
		   }

			do
			{
				byte=jpg_file_ptr[index++];
				if (jpeg_file_handle!=0)
				{
					jpeg_file_index++;
					if (jpeg_file_index>=jpeg_file_size)
			      break;
					if (index>=(fs_read_size-30))
					{
						index=0;
						jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);						
						jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
					}
				}
			} while (byte!=0xFF);
			if (byte!=0xFF)
				break;
			jpg_byte1=0xFF;
			do
			{
				jpg_byte2=jpg_file_ptr[index++];
	
				if (jpeg_file_handle!=0)
				{
					jpeg_file_index++;
					if (jpeg_file_index>=jpeg_file_size)
			      break;
					if (index>=(fs_read_size-30))
					{
						index=0;
						jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);						
						jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
					}
				}
			} while (jpg_byte2==0xFF);
			if (jpg_byte2==0xFF)
				break;
			switch (jpg_byte2)
			{
				case JPEG_MARKER_SOF0:
				case JPEG_MARKER_SOF2:
					if (jpg_byte2==JPEG_MARKER_SOF2)
					{
						jpeg_file_para.jpg_progressive=KAL_TRUE;
					}
					if (jpeg_file_handle!=0)
					{
//						index=0;
//						jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);
//						jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
					}

					marker_length=(jpg_file_ptr[index++]<<8);
					marker_length += (int) (jpg_file_ptr[index++]-2);
					jpeg_file_para.jpg_precision=jpg_file_ptr[index++];
					jpeg_file_para.jpg_height=(jpg_file_ptr[index++]<<8);
					jpeg_file_para.jpg_height|=jpg_file_ptr[index++];
					jpeg_file_para.jpg_width=(jpg_file_ptr[index++]<<8);
					jpeg_file_para.jpg_width|=jpg_file_ptr[index++];
					jpeg_file_para.number_of_component=jpg_file_ptr[index++];
					jpeg_file_para.component_id1=jpg_file_ptr[index++];
					jpeg_file_para.y_h_sample_factor=(jpg_file_ptr[index]&0xF0)>>4;
					jpeg_file_para.y_v_sample_factor=jpg_file_ptr[index++]&0x0F;
			      jpeg_file_para.q_table_id1=jpg_file_ptr[index++];
					jpeg_file_index+=11;

					if (jpeg_file_para.number_of_component>=2)
					{
					   jpeg_file_para.component_id2=jpg_file_ptr[index++];
					   jpeg_file_para.u_h_sample_factor=(jpg_file_ptr[index]&0xF0)>>4;
					   jpeg_file_para.u_v_sample_factor=jpg_file_ptr[index++]&0x0F;
					   jpeg_file_para.q_table_id2=jpg_file_ptr[index++];
   					jpeg_file_index+=3;

						if (jpeg_file_para.number_of_component>=3)
						{
					      jpeg_file_para.component_id3=jpg_file_ptr[index++];
					      jpeg_file_para.v_h_sample_factor=(jpg_file_ptr[index]&0xF0)>>4;
					      jpeg_file_para.v_v_sample_factor=jpg_file_ptr[index++]&0x0F;
					      jpeg_file_para.q_table_id3=jpg_file_ptr[index++];
					      jpeg_file_index+=3;
					   }
					   else
					   {
    					   jpeg_file_para.component_id3=0;
	    				   jpeg_file_para.v_h_sample_factor=0;
		    			   jpeg_file_para.v_v_sample_factor=0;
			    		   jpeg_file_para.q_table_id3=0;
                  }
               }
               else
               {
					   jpeg_file_para.component_id2=0;
					   jpeg_file_para.u_h_sample_factor=0;
					   jpeg_file_para.u_v_sample_factor=0;
					   jpeg_file_para.q_table_id2=0;
  					   jpeg_file_para.component_id3=0;
   				   jpeg_file_para.v_h_sample_factor=0;
	    			   jpeg_file_para.v_v_sample_factor=0;
		    		   jpeg_file_para.q_table_id3=0;
               }
               parse_end_flag|=0x01;
               
				break;
				case JPEG_MARKER_SOS:
				sos_num_of_comp=jpg_file_ptr[index+2];
				
              	jpg_byte2=0xD9;
				break;
				case 0xC8:
				case 0x00:
				break;
				case JPEG_MARKER_DRI:
					if (jpeg_file_para.thumbnail_offset==0)
						jpeg_file_para.thumbnail_offset=jpeg_file_index-2;
					if (jpg_byte2==JPEG_MARKER_DRI)
						restart_marker_flag=1;
				break;
				case JPEG_MARKER_DQT:
				case JPEG_MARKER_DHT:
					if (jpeg_file_para.thumbnail_offset==0xffffffff)
					{
					 if(jpeg_file_handle!=0)
						jpeg_file_para.thumbnail_offset=jpeg_file_index-2;
					 else
					  jpeg_file_para.thumbnail_offset=index-2;	  
					}

					index_offset=(jpg_file_ptr[index++]<<8);
					index_offset += (int) (jpg_file_ptr[index++]-2);
					huffman_q_table_size+=index_offset;
					index+=index_offset;
					if (jpeg_file_handle!=0)
					{
						jpeg_file_index+=(index_offset+2);
						index=0;
						jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);
						jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
					}
					if (jpg_byte2==JPEG_MARKER_DQT)
						parse_end_flag|=0x02;
					else
						parse_end_flag|=0x04;
					/* make sure DQT,DHT and SOF are read or table size overflow*/
					if (huffman_q_table_size>=0x800)
						jpg_byte2=0xD9;
				break;
				case JPEG_MARKER_APP0:
					if (jpeg_thumbnail_mode==KAL_TRUE && jpeg_thumb_para.jfif_mode== NO_THUMBNAIL_MODE)
					{
						if (jpeg_file_handle!=0)
						{
							thumbnail_size=(jpg_file_ptr[index++]<<8);
							thumbnail_size += (int) (jpg_file_ptr[index++]-2);

							/* check JFIF ID */
							if ((jpg_file_ptr[index]=='J') && (jpg_file_ptr[index+1]=='F') &&
								 (jpg_file_ptr[index+2]=='I') && (jpg_file_ptr[index+3]=='F') &&
								 (jpg_file_ptr[index+4]==0))
							{	/* JFIF format */
							#if (defined(JPEG_DRV_V2)||defined(JPEG_DRV_V3))
								index+=12;
								jpeg_thumb_para.jpg_width=jpg_file_ptr[index++];
								jpeg_thumb_para.jpg_height=jpg_file_ptr[index++];
								if ((jpeg_thumb_para.jpg_width!=0)&&(jpeg_thumb_para.jpg_height!=0))
								{
									jpeg_thumb_para.thumbnail_offset=jpeg_file_index+16;
									jpeg_thumb_para.thumbnail_size=jpeg_thumb_para.jpg_width * jpeg_thumb_para.jpg_height*3;
									//jpeg_file_index+=16;
									jpeg_thumb_para.jfif_mode= JFIF_MODE_RGB;
									//return ;
								}
							#endif
							}
							else if ((jpg_file_ptr[index]=='J') && (jpg_file_ptr[index+1]=='F') &&
								 		(jpg_file_ptr[index+2]=='X') && (jpg_file_ptr[index+3]=='X') &&
								 		(jpg_file_ptr[index+4]==0))
							{	/* JFIF extension */
								index+=5;
								if (jpg_file_ptr[index]==0x13)
								{
								#if (defined(JPEG_DRV_V2)||defined(JPEG_DRV_V3))
									index++;
									jpeg_thumb_para.jpg_width=jpg_file_ptr[index++];
									jpeg_thumb_para.jpg_height=jpg_file_ptr[index++];
									if ((jpeg_thumb_para.jpg_width!=0)&&(jpeg_thumb_para.jpg_height!=0))
									{
										//jpeg_file_index+=10;
										jpeg_thumb_para.jfif_mode= JFIF_EXTENSION_MODE_RGB;
										jpeg_thumb_para.thumbnail_offset=jpeg_file_index+10;
										jpeg_thumb_para.thumbnail_size=jpeg_thumb_para.jpg_width * jpeg_thumb_para.jpg_height*3;
										//return;
									}
								#endif
								}
								else if (jpg_file_ptr[index]==0x10)
								{
									index++;
									//jpeg_file_index+=8;
									if (parse_jpeg_thumbnail(jpeg_file_handle,jpg_file_ptr, jpeg_file_buffer_size,
																	 jpeg_file_index+8,(thumbnail_size-6))==0)
									{
										jpeg_thumb_para.jfif_mode= JFIF_EXTENSION_MODE_JPEG;
										jpeg_thumb_para.thumbnail_size=thumbnail_size-6;
										jpeg_thumb_para.thumbnail_offset+=(jpeg_file_index+8);

										//return ;
									}
									else
									{
										//jpeg_file_index-=8;
										jpeg_thumb_para.jfif_mode= NO_THUMBNAIL_MODE;
									}
								}
							}
						}
					}
					//if (jpeg_thumbnail_mode==KAL_TRUE)
					//{
						if (jpeg_file_handle!=0)
						{
							index=0;
							jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);
							jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
						}
					//}

					index_offset=(jpg_file_ptr[index++]<<8);
					index_offset += (int) (jpg_file_ptr[index++]-2);
					index+=index_offset;

					if (jpeg_file_handle!=0)
					{
						jpeg_file_index+=(index_offset+2);
						if (index>=(fs_read_size-30))
						{
							index=0;
							jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);
							jpeg_DRM_read_file((FS_HANDLE) jpeg_file_handle, jpg_file_ptr, 512, &fs_read_size);
						}
					}
				break;
				case JPEG_MARKER_APP1:	/* Exif format */
					index_temp=index;
					if (jpeg_thumbnail_mode==KAL_TRUE && jpeg_thumb_para.jfif_mode== NO_THUMBNAIL_MODE)
					{
						exif_size=(jpg_file_ptr[index_temp++]<<8);
						exif_size += (int) (jpg_file_ptr[index_temp++]-2);

						/* check JFIF ID */
						if ((jpg_file_ptr[index_temp++]=='E') && (jpg_file_ptr[index_temp++]=='x') &&
							 (jpg_file_ptr[index_temp++]=='i') && (jpg_file_ptr[index_temp++]=='f') &&
							 (jpg_file_ptr[index_temp++]==0) && (jpg_file_ptr[index_temp++]==0))
						{	/* Exif format */
							//jpeg_file_index+=8;
							if (parse_exif(jpeg_file_handle,jpg_file_ptr,jpeg_file_buffer_size,
												jpeg_file_index+8,exif_size,&exif_offset)==0)
							{
								//jpeg_file_index+=exif_offset;
								if (jpeg_thumb_para.jfif_mode==EXIF_MODE_JPEG)
								{
									if (parse_jpeg_thumbnail(jpeg_file_handle,jpg_file_ptr, jpeg_file_buffer_size,
																	 jpeg_file_index+exif_offset+8,(exif_size-exif_offset))==0)
									{
										jpeg_thumb_para.thumbnail_size=exif_size-jpeg_thumb_para.thumbnail_offset-exif_offset-6;
										jpeg_thumb_para.thumbnail_offset+=(jpeg_file_index+exif_offset+8);

										//return ;
									}
								}
								else if (jpeg_thumb_para.jfif_mode==EXIF_MODE_RGB)
								{
									jpeg_thumb_para.thumbnail_offset=jpeg_file_index+exif_offset+8;
									jpeg_thumb_para.thumbnail_size=jpeg_thumb_para.jpg_width * jpeg_thumb_para.jpg_height*3;
									//return ;
								}
								else
								 jpeg_thumb_para.jfif_mode= NO_THUMBNAIL_MODE;
									//jpeg_file_index-=(8+exif_offset);
							}
							else
							 jpeg_thumb_para.jfif_mode= NO_THUMBNAIL_MODE;
								//jpeg_file_index-=8;
						}
					}

					//if (jpeg_thumbnail_mode==KAL_TRUE)
					//{
						if (jpeg_file_handle!=0)
						{
							index=0;
							jpeg_DRM_seek_file((FS_HANDLE) jpeg_file_handle, jpeg_file_index, FS_FILE_BEGIN);
							jpeg_DRM_read

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -