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

📄 exifhdr.c

📁 台湾凌阳方案300万数码相机源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
     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 + -