/* $Id$ */
-/* ToDos
+/* ToDos
*
* JIS encoding for comments
* See if example images from http://www.exif.org have illegal
/* Fragments of the code in this module were borrowed from the public domain
* jhead.c package with the author's consent.
*
- * The original header from the jhead.c file was:
+ * The original header from the jhead.c file was:
*
* --------------------------------------------------------------------------
* Program to pull the information out of various types of EFIF digital
*/
zend_module_entry exif_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
- STANDARD_MODULE_HEADER,
+ STANDARD_MODULE_HEADER,
#endif
"exif",
exif_functions,
- ZEND_MODULE_STARTUP_N(exif), NULL,
+ ZEND_MODULE_STARTUP_N(exif), NULL,
NULL, NULL,
PHP_MINFO(exif),
EXIF_VERSION,
static const char * EXIF_ERROR_EALLOC = "Cannot allocate memory for all data";
static const char * EXIF_ERROR_FILEEOF = "Unexpected end of file reached";
static const char * EXIF_ERROR_CORRUPT = "File structure corrupted";
-static const char * EXIF_ERROR_THUMBEOF = "Thumbnail goes IFD boundary or end of file reached";
+static const char * EXIF_ERROR_THUMBEOF = "Thumbnail goes IFD boundary or end of file reached";
static const char * EXIF_ERROR_FSREALLOC = "Illegal reallocating of undefined file section";
#define EXIF_ERRLOG_EALLOC php_error(E_ERROR,EXIF_ERROR_EALLOC);
#define TAG_TRESHHOLDING 0x0107
#define TAG_CELL_WIDTH 0x0108
#define TAG_CELL_HEIGHT 0x0109
-#define TAG_STRIP_OFFSETS 0x0111
+#define TAG_STRIP_OFFSETS 0x0111
#define TAG_FILL_ORDER 0x010A
#define TAG_DOCUMENT_NAME 0x010D
#define TAG_IMAGE_DESCRIPTION 0x010E
#define TAG_LIGHT_SOURCE 0x9208
#define TAG_FLASH 0x9209
#define TAG_FOCALLENGTH 0x920A
-#define TAG_MARKER_NOTE 0x927C
+#define TAG_MARKER_NOTE 0x927C
#define TAG_USERCOMMENT 0x9286
#define TAG_FLASH_PIX_VERSION 0xA000
#define TAG_COLOR_SPACE 0xA001
#define TAG_COMPUTED_VALUE -2
/* Values for TAG_PHOTOMETRIC_INTERPRETATION */
-#define PMI_BLACK_IS_ZERO 0
-#define PMI_WHITE_IS_ZERO 1
+#define PMI_BLACK_IS_ZERO 0
+#define PMI_WHITE_IS_ZERO 1
#define PMI_RGB 2
-#define PMI_PALETTE_COLOR 3
+#define PMI_PALETTE_COLOR 3
#define PMI_TRANSPARENCY_MASK 4
#define PMI_SEPARATED 5
#define PMI_YCBCR 6
} TagTable[] = {
{ 0x00FE, "NewSubFile"},
{ 0x00FF, "SubFile"},
- { 0x0100, "ImageWidth"},
- { 0x0101, "ImageLength"},
- { 0x0102, "BitsPerSample"},
- { 0x0103, "Compression"},
- { 0x0106, "PhotometricInterpretation"},
- { 0x010A, "FillOrder"},
- { 0x010D, "DocumentName"},
- { 0x010E, "ImageDescription"},
- { 0x010F, "Make"},
- { 0x0110, "Model"},
- { 0x0111, "StripOffsets"},
- { 0x0112, "Orientation"},
- { 0x0115, "SamplesPerPixel"},
- { 0x0116, "RowsPerStrip"},
- { 0x0117, "StripByteCounts"},
- { 0x0118, "MinSampleValue"},
- { 0x0119, "MaxSampleValue"},
- { 0x011A, "XResolution"},
- { 0x011B, "YResolution"},
- { 0x011C, "PlanarConfiguration"},
- { 0x011D, "PageName"},
- { 0x011E, "XPosition"},
- { 0x011F, "YPosition"},
- { 0x0120, "FreeOffsets"},
- { 0x0121, "FreeByteCounts"},
- { 0x0122, "GrayResponseUnit"},
- { 0x0123, "GrayResponseCurve"},
- { 0x0124, "T4Options"},
- { 0x0125, "T6Options"},
- { 0x0128, "ResolutionUnit"},
- { 0x0129, "PageNumber"},
- { 0x012D, "TransferFunction"},
- { 0x0131, "Software"},
- { 0x0132, "DateTime"},
- { 0x013B, "Artist"},
- { 0x013C, "HostComputer"},
- { 0x013D, "Predictor"},
- { 0x013E, "WhitePoint"},
- { 0x013F, "PrimaryChromaticities"},
- { 0x0140, "ColorMap"},
- { 0x0141, "HalfToneHints"},
- { 0x0142, "TileWidth"},
- { 0x0143, "TileLength"},
- { 0x0144, "TileOffsets"},
- { 0x0145, "TileByteCounts"},
- { 0x014C, "InkSet"},
- { 0x014D, "InkNames"},
- { 0x014E, "NumberOfInks"},
- { 0x0150, "DotRange"},
- { 0x0151, "TargetPrinter"},
- { 0x0152, "ExtraSample"},
- { 0x0153, "SampleFormat"},
- { 0x0154, "SMinSampleValue"},
- { 0x0155, "SMaxSampleValue"},
- { 0x0156, "TransferRange"},
- { 0x0200, "JPEGProc"},
- { 0x0201, "JPEGInterchangeFormat"},
- { 0x0202, "JPEGInterchangeFormatLength"},
- { 0x0203, "JPEGRestartInterval"},
- { 0x0205, "JPEGLosslessPredictors"},
- { 0x0206, "JPEGPointTransforms"},
- { 0x0207, "JPEGQTables"},
- { 0x0208, "JPEGDCTables"},
- { 0x0209, "JPEGACTables"},
- { 0x0211, "YCbCrCoefficients"},
- { 0x0212, "YCbCrSubSampling"},
- { 0x0213, "YCbCrPositioning"},
- { 0x0214, "ReferenceBlackWhite"},
+ { 0x0100, "ImageWidth"},
+ { 0x0101, "ImageLength"},
+ { 0x0102, "BitsPerSample"},
+ { 0x0103, "Compression"},
+ { 0x0106, "PhotometricInterpretation"},
+ { 0x010A, "FillOrder"},
+ { 0x010D, "DocumentName"},
+ { 0x010E, "ImageDescription"},
+ { 0x010F, "Make"},
+ { 0x0110, "Model"},
+ { 0x0111, "StripOffsets"},
+ { 0x0112, "Orientation"},
+ { 0x0115, "SamplesPerPixel"},
+ { 0x0116, "RowsPerStrip"},
+ { 0x0117, "StripByteCounts"},
+ { 0x0118, "MinSampleValue"},
+ { 0x0119, "MaxSampleValue"},
+ { 0x011A, "XResolution"},
+ { 0x011B, "YResolution"},
+ { 0x011C, "PlanarConfiguration"},
+ { 0x011D, "PageName"},
+ { 0x011E, "XPosition"},
+ { 0x011F, "YPosition"},
+ { 0x0120, "FreeOffsets"},
+ { 0x0121, "FreeByteCounts"},
+ { 0x0122, "GrayResponseUnit"},
+ { 0x0123, "GrayResponseCurve"},
+ { 0x0124, "T4Options"},
+ { 0x0125, "T6Options"},
+ { 0x0128, "ResolutionUnit"},
+ { 0x0129, "PageNumber"},
+ { 0x012D, "TransferFunction"},
+ { 0x0131, "Software"},
+ { 0x0132, "DateTime"},
+ { 0x013B, "Artist"},
+ { 0x013C, "HostComputer"},
+ { 0x013D, "Predictor"},
+ { 0x013E, "WhitePoint"},
+ { 0x013F, "PrimaryChromaticities"},
+ { 0x0140, "ColorMap"},
+ { 0x0141, "HalfToneHints"},
+ { 0x0142, "TileWidth"},
+ { 0x0143, "TileLength"},
+ { 0x0144, "TileOffsets"},
+ { 0x0145, "TileByteCounts"},
+ { 0x014C, "InkSet"},
+ { 0x014D, "InkNames"},
+ { 0x014E, "NumberOfInks"},
+ { 0x0150, "DotRange"},
+ { 0x0151, "TargetPrinter"},
+ { 0x0152, "ExtraSample"},
+ { 0x0153, "SampleFormat"},
+ { 0x0154, "SMinSampleValue"},
+ { 0x0155, "SMaxSampleValue"},
+ { 0x0156, "TransferRange"},
+ { 0x0200, "JPEGProc"},
+ { 0x0201, "JPEGInterchangeFormat"},
+ { 0x0202, "JPEGInterchangeFormatLength"},
+ { 0x0203, "JPEGRestartInterval"},
+ { 0x0205, "JPEGLosslessPredictors"},
+ { 0x0206, "JPEGPointTransforms"},
+ { 0x0207, "JPEGQTables"},
+ { 0x0208, "JPEGDCTables"},
+ { 0x0209, "JPEGACTables"},
+ { 0x0211, "YCbCrCoefficients"},
+ { 0x0212, "YCbCrSubSampling"},
+ { 0x0213, "YCbCrPositioning"},
+ { 0x0214, "ReferenceBlackWhite"},
{ 0x1000, "RelatedImageFileFormat"},
- { 0x828D, "CFARepeatPatternDim"},
- { 0x828E, "CFAPattern"},
- { 0x828F, "BatteryLevel"},
- { 0x8298, "Copyright"},
- { 0x829A, "ExposureTime"},
- { 0x829D, "FNumber"},
- { 0x83BB, "IPTC/NAA"},
- { 0x8769, "Exif_IFD_Pointer"},
- { 0x8773, "InterColorProfile"},
- { 0x8822, "ExposureProgram"},
- { 0x8824, "SpectralSensitivity"},
- { 0x8825, "GPS_IFD_Pointer"},
- { 0x8827, "ISOSpeedRatings"},
- { 0x8828, "OECF"},
- { 0x9000, "ExifVersion"},
- { 0x9003, "DateTimeOriginal"},
- { 0x9004, "DateTimeDigitized"},
- { 0x9101, "ComponentsConfiguration"},
- { 0x9102, "CompressedBitsPerPixel"},
- { 0x9201, "ShutterSpeedValue"},
- { 0x9202, "ApertureValue"},
- { 0x9203, "BrightnessValue"},
- { 0x9204, "ExposureBiasValue"},
- { 0x9205, "MaxApertureValue"},
- { 0x9206, "SubjectDistance"},
- { 0x9207, "MeteringMode"},
- { 0x9208, "LightSource"},
- { 0x9209, "Flash"},
- { 0x920A, "FocalLength"},
- { 0x920B, "FlashEnergy"}, /* 0xA20B in JPEG */
- { 0x920C, "SpatialFrequencyResponse"}, /* 0xA20C - - */
- { 0x920E, "FocalPlaneXResolution"}, /* 0xA20E - - */
- { 0x920F, "FocalPlaneYResolution"}, /* 0xA20F - - */
- { 0x9210, "FocalPlaneResolutionUnit"}, /* 0xA210 - - */
- { 0x9214, "SubjectLocation"}, /* 0xA214 - - */
- { 0x9215, "ExposureIndex"}, /* 0xA215 - - */
- { 0x9217, "SensingMethod"}, /* 0xA217 - - */
- { 0x927C, "MakerNote"},
- { 0x9286, "UserComment"},
- { 0x9290, "SubSecTime"},
- { 0x9291, "SubSecTimeOriginal"},
- { 0x9292, "SubSecTimeDigitized"},
- { 0xA000, "FlashPixVersion"},
- { 0xA001, "ColorSpace"},
- { 0xA002, "ExifImageWidth"},
- { 0xA003, "ExifImageLength"},
- { 0xA005, "InteroperabilityOffset"},
- { 0xA20B, "FlashEnergy"}, /* 0x920B in TIFF/EP */
- { 0xA20C, "SpatialFrequencyResponse"}, /* 0x920C - - */
- { 0xA20E, "FocalPlaneXResolution"}, /* 0x920E - - */
- { 0xA20F, "FocalPlaneYResolution"}, /* 0x920F - - */
- { 0xA210, "FocalPlaneResolutionUnit"}, /* 0x9210 - - */
- { 0xA214, "SubjectLocation"}, /* 0x9214 - - */
- { 0xA215, "ExposureIndex"}, /* 0x9215 - - */
- { 0xA217, "SensingMethod"}, /* 0x9217 - - */
- { 0xA300, "FileSource"},
- { 0xA301, "SceneType"},
+ { 0x828D, "CFARepeatPatternDim"},
+ { 0x828E, "CFAPattern"},
+ { 0x828F, "BatteryLevel"},
+ { 0x8298, "Copyright"},
+ { 0x829A, "ExposureTime"},
+ { 0x829D, "FNumber"},
+ { 0x83BB, "IPTC/NAA"},
+ { 0x8769, "Exif_IFD_Pointer"},
+ { 0x8773, "InterColorProfile"},
+ { 0x8822, "ExposureProgram"},
+ { 0x8824, "SpectralSensitivity"},
+ { 0x8825, "GPS_IFD_Pointer"},
+ { 0x8827, "ISOSpeedRatings"},
+ { 0x8828, "OECF"},
+ { 0x9000, "ExifVersion"},
+ { 0x9003, "DateTimeOriginal"},
+ { 0x9004, "DateTimeDigitized"},
+ { 0x9101, "ComponentsConfiguration"},
+ { 0x9102, "CompressedBitsPerPixel"},
+ { 0x9201, "ShutterSpeedValue"},
+ { 0x9202, "ApertureValue"},
+ { 0x9203, "BrightnessValue"},
+ { 0x9204, "ExposureBiasValue"},
+ { 0x9205, "MaxApertureValue"},
+ { 0x9206, "SubjectDistance"},
+ { 0x9207, "MeteringMode"},
+ { 0x9208, "LightSource"},
+ { 0x9209, "Flash"},
+ { 0x920A, "FocalLength"},
+ { 0x920B, "FlashEnergy"}, /* 0xA20B in JPEG */
+ { 0x920C, "SpatialFrequencyResponse"}, /* 0xA20C - - */
+ { 0x920E, "FocalPlaneXResolution"}, /* 0xA20E - - */
+ { 0x920F, "FocalPlaneYResolution"}, /* 0xA20F - - */
+ { 0x9210, "FocalPlaneResolutionUnit"}, /* 0xA210 - - */
+ { 0x9214, "SubjectLocation"}, /* 0xA214 - - */
+ { 0x9215, "ExposureIndex"}, /* 0xA215 - - */
+ { 0x9217, "SensingMethod"}, /* 0xA217 - - */
+ { 0x927C, "MakerNote"},
+ { 0x9286, "UserComment"},
+ { 0x9290, "SubSecTime"},
+ { 0x9291, "SubSecTimeOriginal"},
+ { 0x9292, "SubSecTimeDigitized"},
+ { 0xA000, "FlashPixVersion"},
+ { 0xA001, "ColorSpace"},
+ { 0xA002, "ExifImageWidth"},
+ { 0xA003, "ExifImageLength"},
+ { 0xA005, "InteroperabilityOffset"},
+ { 0xA20B, "FlashEnergy"}, /* 0x920B in TIFF/EP */
+ { 0xA20C, "SpatialFrequencyResponse"}, /* 0x920C - - */
+ { 0xA20E, "FocalPlaneXResolution"}, /* 0x920E - - */
+ { 0xA20F, "FocalPlaneYResolution"}, /* 0x920F - - */
+ { 0xA210, "FocalPlaneResolutionUnit"}, /* 0x9210 - - */
+ { 0xA214, "SubjectLocation"}, /* 0x9214 - - */
+ { 0xA215, "ExposureIndex"}, /* 0x9215 - - */
+ { 0xA217, "SensingMethod"}, /* 0x9217 - - */
+ { 0xA300, "FileSource"},
+ { 0xA301, "SceneType"},
{TAG_NONE, "no tag value"},
{TAG_COMPUTED_VALUE, "computed value"},
{ 0, ""} /* Important for exif_get_tagname() IF value != "" functionresult is != false */
/* }}} */
/* {{{ exif_get_tagname
- Get headername for tag_num or NULL if not defined */
+ Get headername for tag_num or NULL if not defined */
static char * exif_get_tagname(int tag_num, char *ret, int len)
{
int i,t;
{
if (motorola_intel) {
return ((( char *)value)[0] << 24)
- | (((uchar *)value)[1] << 16)
+ | (((uchar *)value)[1] << 16)
| (((uchar *)value)[2] << 8 )
| (((uchar *)value)[3] );
} else {
return ((( char *)value)[3] << 24)
- | (((uchar *)value)[2] << 16)
+ | (((uchar *)value)[2] << 16)
| (((uchar *)value)[1] << 8 )
| (((uchar *)value)[0] );
}
#endif
typedef struct {
- int num;
- int den;
+ int num;
+ int den;
} signed_rational;
typedef struct {
- unsigned int num;
- unsigned int den;
+ unsigned int num;
+ unsigned int den;
} unsigned_rational;
typedef union _image_info_value {
char *s;
- unsigned u;
+ unsigned u;
int i;
- float f;
- double d;
+ float f;
+ double d;
signed_rational sr;
unsigned_rational ur;
union _image_info_value *list;
} image_info_value;
typedef struct {
- WORD tag;
- WORD format;
- DWORD length;
- DWORD dummy; /* value ptr of tiff directory entry */
+ WORD tag;
+ WORD format;
+ DWORD length;
+ DWORD dummy; /* value ptr of tiff directory entry */
char *name;
- image_info_value value;
+ image_info_value value;
} image_info_data;
typedef struct {
- int count;
+ int count;
image_info_data *list;
} image_info_list;
/* }}} */
*/
void exif_iif_add_value( image_info_type *image_info, int section_index, char *name, int tag, int format, int length, void* value, int motorola_intel)
{
- int index;
+ int index;
image_info_value *info_value;
image_info_data *info_data;
image_info_data *list;
* Add image_info to associative array value. */
void add_assoc_image_info( pval *value, int sub_array, image_info_type *image_info, int section_index)
{
- char buffer[64], *val, *name, uname[64];
- int i, ap, l, b, idx=0, done, unknown=0;
+ char buffer[64], *val, *name, uname[64];
+ int i, ap, l, b, idx=0, done, unknown=0;
image_info_value *info_value;
image_info_data *info_data;
pval *tmpi, *array;
*/
#define M_TEM 0x01 /* temp for arithmetic coding */
-#define M_RES 0x02 /* reserved */
+#define M_RES 0x02 /* reserved */
#define M_SOF0 0xC0 /* Start Of Frame N */
#define M_SOF1 0xC1 /* N indicates which compression process */
#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */
/* Markers xF0 - xF7 ISO/IEC 10918-3 */
/* Markers xF7 - xF8 ISO/IEC 14495-1 */
/* XY=Main/Tile-header:(R:required, N:not_allowed, O:optional, L:last_marker) */
-#define JC_SOC 0x4F /* NN, Start of codestream */
-#define JC_SIZ 0x51 /* RN, Image and tile size */
-#define JC_COD 0x52 /* RO, Codeing style defaulte */
-#define JC_COC 0x53 /* OO, Coding style component */
-#define JC_TLM 0x55 /* ON, Tile part length main header */
-#define JC_PLM 0x57 /* ON, Packet length main header */
-#define JC_PLT 0x58 /* NO, Packet length tile part header */
-#define JC_QCD 0x5C /* RO, Quantization default */
-#define JC_QCC 0x5D /* OO, Quantization component */
-#define JC_RGN 0x5E /* OO, Region of interest */
-#define JC_POD 0x5F /* OO, Progression order default */
-#define JC_PPM 0x60 /* ON, Packed packet headers main header */
-#define JC_PPT 0x61 /* NO, Packet packet headers tile part header */
-#define JC_CME 0x64 /* OO, Comment: "LL E <text>" E=0:binary, E=1:ascii */
+#define JC_SOC 0x4F /* NN, Start of codestream */
+#define JC_SIZ 0x51 /* RN, Image and tile size */
+#define JC_COD 0x52 /* RO, Codeing style defaulte */
+#define JC_COC 0x53 /* OO, Coding style component */
+#define JC_TLM 0x55 /* ON, Tile part length main header */
+#define JC_PLM 0x57 /* ON, Packet length main header */
+#define JC_PLT 0x58 /* NO, Packet length tile part header */
+#define JC_QCD 0x5C /* RO, Quantization default */
+#define JC_QCC 0x5D /* OO, Quantization component */
+#define JC_RGN 0x5E /* OO, Region of interest */
+#define JC_POD 0x5F /* OO, Progression order default */
+#define JC_PPM 0x60 /* ON, Packed packet headers main header */
+#define JC_PPT 0x61 /* NO, Packet packet headers tile part header */
+#define JC_CME 0x64 /* OO, Comment: "LL E <text>" E=0:binary, E=1:ascii */
#define JC_SOT 0x90 /* NR, Start of tile */
-#define JC_SOP 0x91 /* NO, Start of packeter default */
-#define JC_EPH 0x92 /* NO, End of packet header */
+#define JC_SOP 0x91 /* NO, Start of packeter default */
+#define JC_EPH 0x92 /* NO, End of packet header */
#define JC_SOD 0x93 /* NL, Start of data */
#define JC_EOC 0xD9 /* NN, End of codestream */
/* }}} */
static int exif_process_IFD_in_JPEG(image_info_type *ImageInfo, char *DirStart, char *OffsetBase, unsigned IFDlength, int sub_section_index);
/* {{{ exif_get_markername
- Get name of marker */
+ Get name of marker */
//#ifdef EXIF_DEBUG
char * exif_get_markername(int marker)
{
/* }}} */
/* {{{ proto string|false exif_tagname(index)
- Get headername for index or false if not defined */
+ Get headername for index or false if not defined */
PHP_FUNCTION(exif_tagname)
{
pval **p_num;
/* {{{ exif_ifd_make_value
* Create a value for an ifd from an info_data pointer */
static void* exif_ifd_make_value( image_info_data *info_data,int motorola_intel) {
- size_t byte_count;
+ size_t byte_count;
char *value_ptr, *data_ptr;
- int i;
+ int i;
image_info_value *info_value;
case TAG_STRIP_OFFSETS:
case TAG_JPEG_INTERCHANGE_FORMAT:
- /* accept both formats */
+ /* accept both formats */
ImageInfo->Thumbnail.offset = exif_convert_any_to_int(value_ptr, format, ImageInfo->motorola_intel);
break;
} else {
switch(tag) {
case TAG_COPYRIGHT:
- /* check for "<photographer> NUL <editor> NUL" */
+ /* check for "<photographer> NUL <editor> NUL" */
if (byte_count>1 && (l=php_strnlen(value_ptr,byte_count)) > 0) {
if ( l<byte_count-1) {
/* When there are any characters after the first NUL */
/* format = TAG_FMT_UNDEFINED; this musn't be ASCII */
/* but we are not supposed to change this */
/* keep in mind that image_info does not store editor value */
- } else {
+ } else {
ImageInfo->Copyright = estrdup(value_ptr);
- }
+ }
}
break;
static int exif_scan_JPEG_header(image_info_type *ImageInfo)
{
int section, sn;
- int itemlen;
int marker = 0, last_marker = M_PSEUDO, comment_correction;
- int ll, lh, got;
+ int ll, lh;
uchar *Data;
- size_t fpos, size;
- jpeg_sof_info sof_info;
+ size_t fpos, size, got, itemlen;
+ jpeg_sof_info sof_info;
TSRMLS_FETCH();
for(section=0;;section++)
#endif
php_stream_seek(ImageInfo->infile,dir_offset,SEEK_SET); /* we do not know the order of sections */
php_stream_read(ImageInfo->infile, ImageInfo->file.list[sn].data, 2);
- num_entries = php_ifd_get16u(ImageInfo->file.list[sn].data, ImageInfo->motorola_intel);
+ num_entries = php_ifd_get16u(ImageInfo->file.list[sn].data, ImageInfo->motorola_intel);
dir_size = 2/*num dir entries*/ +12/*length of entry*/*num_entries +4/* offset to next ifd (points to thumbnail or NULL)*/;
if ( ImageInfo->FileSize >= dir_offset+dir_size) {
#ifdef EXIF_DEBUG
entry_type = php_ifd_get16u(dir_entry+2, ImageInfo->motorola_intel);
/*entry_length = php_ifd_get32u(dir_entry+4, ImageInfo->motorola_intel);*/
if (entry_tag == TAG_EXIF_IFD_POINTER ||
- entry_tag == TAG_INTEROP_IFD_POINTER ||
- entry_tag == TAG_GPS_IFD_POINTER
+ entry_tag == TAG_INTEROP_IFD_POINTER ||
+ entry_tag == TAG_GPS_IFD_POINTER
)
{
switch(entry_tag) {
* Parse the marker stream until SOS or EOI is seen; */
static int exif_scan_FILE_header (image_info_type *ImageInfo)
{
- unsigned char file_header[8];
- int ret = FALSE;
+ unsigned char file_header[8];
+ int ret = FALSE;
TSRMLS_FETCH();
- ImageInfo->FileType = IMAGE_FILETYPE_UNKNOWN;
+ ImageInfo->FileType = IMAGE_FILETYPE_UNKNOWN;
- if ( ImageInfo->FileSize >= 2) {
+ if ( ImageInfo->FileSize >= 2) {
php_stream_seek(ImageInfo->infile, 0, SEEK_SET);
php_stream_read(ImageInfo->infile, file_header, 2);
if ( (file_header[0]==0xff) && (file_header[1]==M_SOI)) {
- ImageInfo->FileType = IMAGE_FILETYPE_JPEG;
- if (exif_scan_JPEG_header(ImageInfo)) {
- ret = TRUE;
- } else {
+ ImageInfo->FileType = IMAGE_FILETYPE_JPEG;
+ if (exif_scan_JPEG_header(ImageInfo)) {
+ ret = TRUE;
+ } else {
php_error(E_WARNING, "Invalid JPEG file: '%s'", ImageInfo->FileName);
- }
+ }
} else if ( ImageInfo->FileSize >= 8) {
php_stream_read(ImageInfo->infile, file_header+2, 6);
- if ( !memcmp(file_header,"II\x2A\x00", 4))
- {
- ImageInfo->FileType = IMAGE_FILETYPE_TIFF_II;
- ImageInfo->motorola_intel = 0;
- #ifdef EXIF_DEBUG
- php_error(E_NOTICE,"File(%s) has TIFF/II format", ImageInfo->FileName);
- #endif
+ if ( !memcmp(file_header,"II\x2A\x00", 4))
+ {
+ ImageInfo->FileType = IMAGE_FILETYPE_TIFF_II;
+ ImageInfo->motorola_intel = 0;
+ #ifdef EXIF_DEBUG
+ php_error(E_NOTICE,"File(%s) has TIFF/II format", ImageInfo->FileName);
+ #endif
ImageInfo->sections_found |= FOUND_IFD0;
- if (exif_process_IFD_in_TIFF(ImageInfo,php_ifd_get32u(file_header+4,ImageInfo->motorola_intel),SECTION_IFD0)) {
- ret = TRUE;
- } else {
+ if (exif_process_IFD_in_TIFF(ImageInfo,php_ifd_get32u(file_header+4,ImageInfo->motorola_intel),SECTION_IFD0)) {
+ ret = TRUE;
+ } else {
php_error(E_WARNING, "Invalid TIFF file: '%s'", ImageInfo->FileName);
- }
- }
- else
- if ( !memcmp(file_header,"MM\x00\x2a", 4))
- {
- ImageInfo->FileType = IMAGE_FILETYPE_TIFF_MM;
- ImageInfo->motorola_intel = 1;
- #ifdef EXIF_DEBUG
- php_error(E_NOTICE,"File(%s) has TIFF/MM format", ImageInfo->FileName);
- #endif
+ }
+ }
+ else
+ if ( !memcmp(file_header,"MM\x00\x2a", 4))
+ {
+ ImageInfo->FileType = IMAGE_FILETYPE_TIFF_MM;
+ ImageInfo->motorola_intel = 1;
+ #ifdef EXIF_DEBUG
+ php_error(E_NOTICE,"File(%s) has TIFF/MM format", ImageInfo->FileName);
+ #endif
ImageInfo->sections_found |= FOUND_IFD0;
- if (exif_process_IFD_in_TIFF(ImageInfo,php_ifd_get32u(file_header+4,ImageInfo->motorola_intel),SECTION_IFD0)) {
- ret = TRUE;
- } else {
+ if (exif_process_IFD_in_TIFF(ImageInfo,php_ifd_get32u(file_header+4,ImageInfo->motorola_intel),SECTION_IFD0)) {
+ ret = TRUE;
+ } else {
php_error(E_WARNING, "Invalid TIFF file: '%s'", ImageInfo->FileName);
- }
- } else {
+ }
+ } else {
php_error(E_WARNING,"File(%s) not supported", ImageInfo->FileName);
return FALSE;
- }
+ }
}
} else {
php_error(E_WARNING,"File(%s) to small (%d)", ImageInfo->FileName, ImageInfo->FileSize);
/* Store file date/time. */
ImageInfo->FileDateTime = st.st_mtime;
ImageInfo->FileSize = st.st_size;
- php_error(E_NOTICE,"open stream is file: %d", ImageInfo->FileSize);
+ /*php_error(E_NOTICE,"open stream is file: %d", ImageInfo->FileSize);*/
}
} else {
if ( !ImageInfo->FileSize) {
sections_needed |= 1<<i;
}
}
- if ( sections_str) efree(sections_str);
- /* now see what we need */
- #ifdef EXIF_DEBUG
- sections_str = exif_get_sectionlist(sections_needed);
- if ( !sections_str) {
- RETURN_FALSE;
- }
- php_error(E_NOTICE,"Sections needed: %s", sections_str[0] ? sections_str : "None");
- if ( sections_str) efree(sections_str);
+ if ( sections_str) efree(sections_str);
+ /* now see what we need */
+ #ifdef EXIF_DEBUG
+ sections_str = exif_get_sectionlist(sections_needed);
+ if ( !sections_str) {
+ RETURN_FALSE;
+ }
+ php_error(E_NOTICE,"Sections needed: %s", sections_str[0] ? sections_str : "None");
+ if ( sections_str) efree(sections_str);
#endif
}
if(ac >= 3) {
stream = php_stream_open_wrapper(Z_STRVAL_PP(arg1), "rb", IGNORE_PATH|ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL);
- if (stream == NULL) {
+ if (stream == NULL) {
RETURN_FALSE;
}