📄 exifhdr.c
字号:
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP0
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For EXIF
UCHAR EXIFHDR_Parsing_APP0(ULONG DramAddr,BIT ShowThumb) USING_0
{
UCHAR sts = TRUE;
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,10);
sts = EXIFHDR_Parsing_APP0_Sub(DramAddr,ShowThumb,(USHORT)(HeaderLength & 0x00000001));
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP0_Sub
//-----------------------------------------------------------------------------
UCHAR EXIFHDR_Parsing_APP0_Sub(ULONG DramAddr,BIT ShowThumb,USHORT EvenOddOffset) USING_0
{
UCHAR sts = TRUE;
if (Jpeg_Exif_Format == 0)
{
//Check "JFIF"
if ((G_ucStorData[4 + EvenOddOffset] == 0x4a) && (G_ucStorData[5 + EvenOddOffset] == 0x46) && (G_ucStorData[6 + EvenOddOffset] == 0x49) && (G_ucStorData[7 + EvenOddOffset] == 0x46))
{
Jpeg_Exif_Format = K_JFIF_IMAGE_FORMAT; //JFIF file
//printf("This file is JFIF format!\n");
if (ShowThumb)
{
Extract_Finished = 1;
sts = FALSE;
}
else
{
APP0Length = ((((USHORT)G_ucStorData[2 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[3 + EvenOddOffset]));
HeaderLength += (2 + (ULONG)APP0Length);
ExifTmpDramAddr = DramAddr + (HeaderLength >> 1);
}
}
else
{
Extract_Finished = 1;
sts = FALSE;
//printf("This is not an JPEG file!\n");
}
}
else//if EXIF header contains APP0
{
ThumbAPPnLength = ((((USHORT)G_ucStorData[2 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[3 + EvenOddOffset]));
TotalThumbAPPnLength += (2 + ThumbAPPnLength);
HeaderLength += (2 + (ULONG)ThumbAPPnLength);
}
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP1
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For EXIF
UCHAR EXIFHDR_Parsing_APP1(ULONG DramAddr,BIT ShowThumb,UCHAR *DateTime) USING_0
{
UCHAR sts = TRUE;
//patch4.5.1@ada@Fix EXIF bugs begin
sts = EXIFHDR_Parsing_APP1_Sub1(DramAddr,ShowThumb,DateTime,(UCHAR)(HeaderLength & 0x00000001));
//sts = EXIFHDR_Passing_APP1_Sub1(DramAddr,ShowThumb,DateTime,(USHORT)(HeaderLength & 0x00000001));
//patch4.5.1@ada@Fix EXIF bugs end
if (sts)
{
//patch4.5.2@ada@Fix EXIF bug begin
if (Jpeg_Exif_Format == K_EXIF_IMAGE_FORMAT)
{
HeaderLength = IFD_ThumbnaiFrameOffset + ByteOrderOffset;
}
//patch4.5.2@ada@Fix EXIF bug end
}
else
{
Jpeg_Exif_Format = 0;
Extract_Finished = 1;
}
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP1_Sub1
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For EXIF
UCHAR EXIFHDR_Parsing_APP1_Sub1(ULONG DramAddr,BIT ShowThumb,UCHAR *DateTime,UCHAR EvenOddOffset) USING_0
{
UCHAR sts = TRUE;
USHORT i;
if (Jpeg_Exif_Format == 0)
{
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,22);
for (i = (4 + EvenOddOffset); i < (9 + EvenOddOffset); i++) //Check "Exif"
{
if (G_ucStorData[i] != Text_Exif[i - (4 + EvenOddOffset)])
{
Extract_Finished = 1;
sts = FALSE;
//printf("This is not an EXIF file");
break;
}
}//End for loop
if ((sts == FALSE) || (G_ucStorData[9 + EvenOddOffset] != 0x00))
{
sts = FALSE;
}
if (sts)
{
APP1Length = ((((USHORT)G_ucStorData[2 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[3 + EvenOddOffset]));
if ((ShowThumb) && (NeedReadMoreHeader == 0) && ((2 + APP1Length + 2) >= (G_DOS_FileSize >> 4)))
{
NeedReadMoreHeader = 1;
sts = FALSE;
}
else
{
ByteOrder = ((((USHORT)G_ucStorData[10 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[11 + EvenOddOffset])); //0x4949 or 0x4d4d
ByteOrderOffset = HeaderLength + (ULONG)10;
if (ByteOrder == K_LITTLE_ENDIAN)
{
//printf("It's little-endian file!\n");
sts = TRUE;
}
else
{
if (ByteOrder == K_BIG_ENDIAN)
{
//printf("It's big-endian file!\n");
sts = TRUE;
}
else
{
//printf("Not either little-endian or big-endian file\n");
sts = FALSE;
}
}
if (sts)
{
//Check Tiff_ID
Tiff_ID = EXIFHDR_NeedSwitchUSHORTOrder(ByteOrder,((((USHORT)G_ucStorData[12 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[13 + EvenOddOffset])));
if (Tiff_ID == 0x002a)
{
//Check Tiff_IFDOffset
Tiff_IFDOffset = EXIFHDR_NeedSwitchULONGOrder(ByteOrder,((((ULONG)G_ucStorData[14 + EvenOddOffset]) << 24) | (((ULONG)G_ucStorData[15 + EvenOddOffset]) << 16) | (((ULONG)G_ucStorData[16 + EvenOddOffset]) << 8) | ((ULONG)G_ucStorData[17 + EvenOddOffset])));
if (Tiff_IFDOffset == 0x00000008)
{
Jpeg_Exif_Format = K_EXIF_IMAGE_FORMAT; //EXIF file
Extract_Thumbnail = 1;
//printf("This file is EXIF format!\n");
//Extract IFD0
IFD_Number = EXIFHDR_NeedSwitchUSHORTOrder(ByteOrder,((((USHORT)G_ucStorData[18 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[19 + EvenOddOffset])));
HeaderLength += (ULONG)20;
//Still even size
ExifTmpDramAddr = DramAddr + (HeaderLength >> 1);
//Find IFD0_DateTimeTag if need
for (i = 0; i < IFD_Number; i++)
{
EXIFHDR_Parsing_APP1_Sub2(DramAddr,DateTime,(USHORT)(HeaderLength & 0x00000001));
}//End for loop
sts = EXIFHDR_Parsing_APP1_Sub3(DramAddr,(USHORT)(HeaderLength & 0x00000001));
}
else//Tiff_IFDOffset != 0x00000008
{
sts = FALSE;
//printf("Tiff_IFDOffset is not found!\n");
}//End check Tiff_IFDOffset
}
else//Tiff_IFD != 0x002a
{
sts = FALSE;
//printf("Tiff_IFD is not found!\n");
}//End check Tiff_IFD
}//End check "Exif"
}
}
}
else//if JFIF header contains APP1
{
APPnLength = ((((USHORT)G_ucStorData[2 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[3 + EvenOddOffset]));
//printf("APPn length = %x\n",APPnLength);
TotalAPPnLength += (2 + APPnLength);
HeaderLength += (2 + (ULONG)APPnLength);
}
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP1_Sub2
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For EXIF
UCHAR EXIFHDR_Parsing_APP1_Sub2(ULONG DramAddr,UCHAR *DateTime,USHORT EvenOddOffset) USING_0
{
UCHAR sts = FALSE;
UCHAR j;
//Find IFD0_DateTimeTag if need
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,(USHORT)(K_IFD_SIZE + 2));
if (EXIFHDR_NeedSwitchUSHORTOrder(ByteOrder,((((USHORT)G_ucStorData[0 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[1 + EvenOddOffset]))) == 0x0132)
{
IFD_DateTime_Offset = EXIFHDR_NeedSwitchULONGOrder(ByteOrder,((((ULONG)G_ucStorData[8 + EvenOddOffset]) << 24) | (((ULONG)G_ucStorData[9 + EvenOddOffset]) << 16) | (((ULONG)G_ucStorData[10 + EvenOddOffset]) << 8) | ((ULONG)G_ucStorData[11 + EvenOddOffset]))) + ByteOrderOffset;
//*IFD_DateTime_Found = 1;
ExifTmpDramAddr = DramAddr + (IFD_DateTime_Offset >> 1);
if (IFD_DateTime_Offset & 0x00000001)
{
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,22);
for (j = 0; j < 20; j++)
{
DateTime[j] = G_ucStorData[j + 1];
}
//printf("DateTime = %s\n",DateTime);
}
else//even offset
{
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,20);
for (j = 0; j < 20; j++)
{
DateTime[j] = G_ucStorData[j];
}
//printf("DateTime = %s\n",DateTime);
}
sts = TRUE;
}
HeaderLength += (ULONG)K_IFD_SIZE;
ExifTmpDramAddr = DramAddr + (HeaderLength >> 1);
return sts;
}
//-----------------------------------------------------------------------------
//EXIFHDR_Parsing_APP1_Sub3
//-----------------------------------------------------------------------------
//patch3.2@ada@0401 For EXIF
UCHAR EXIFHDR_Parsing_APP1_Sub3(ULONG DramAddr,USHORT EvenOddOffset) USING_0
{
UCHAR sts = TRUE;
USHORT i;
UCHAR search = 1;
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,6);
NextIFDOffset = EXIFHDR_NeedSwitchULONGOrder(ByteOrder,((((ULONG)G_ucStorData[0 + EvenOddOffset]) << 24) | (((ULONG)G_ucStorData[1 + EvenOddOffset]) << 16) | (((ULONG)G_ucStorData[2 + EvenOddOffset]) << 8) | ((ULONG)G_ucStorData[3 + EvenOddOffset]))) + ByteOrderOffset;
if (NextIFDOffset > 0)
{
ExifTmpDramAddr = DramAddr + (NextIFDOffset >> 1);
if (NextIFDOffset & 0x00000001)
{
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,4);
IFD_Number = EXIFHDR_NeedSwitchUSHORTOrder(ByteOrder,((((USHORT)G_ucStorData[1 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[2 + EvenOddOffset])));
}
else
{
SDRAM_Dram2Sram(ExifTmpDramAddr,G_ucDataBuffer,2);
IFD_Number = EXIFHDR_NeedSwitchUSHORTOrder(ByteOrder,((((USHORT)G_ucStorData[0 + EvenOddOffset]) << 8) | ((USHORT)G_ucStorData[1 + EvenOddOffset])));
}
ExifTmpDramAddr += 1;
//patch4.3@richie@0610
for (i = 0; ((i < IFD_Number) && (search > 0)); i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -