📄 jpeg.c
字号:
}
}
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 + -