1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
/** \file
*
* EXIF file format support library. This API allows to parse, read and
* modify EXIF data structures. It provides a low-level API which allows
* to manipulate EXIF tags in a generic way, and a higher-level API which
* provides more advanced functions such as comment editing, thumbnail
* extraction, etc.
*
* In the future, vendor-proprietary exif extensions might be supported.
*/
#ifndef _gphoto_exif_
#define _gphoto_exif_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Tag data type information.
*/
typedef enum {
EXIF_NOTYPE = 0, /* placeholder */
EXIF_BYTE = 1, /* 8-bit unsigned integer */
EXIF_ASCII = 2, /* 8-bit bytes w/ last byte null */
EXIF_SHORT = 3, /* 16-bit unsigned integer */
EXIF_LONG = 4, /* 32-bit unsigned integer */
EXIF_RATIONAL = 5, /* 64-bit unsigned fraction */
EXIF_SBYTE = 6, /* !8-bit signed integer */
EXIF_UNDEFINED = 7, /* !8-bit untyped data */
EXIF_SSHORT = 8, /* !16-bit signed integer */
EXIF_SLONG = 9, /* !32-bit signed integer */
EXIF_SRATIONAL = 10, /* !64-bit signed fraction */
EXIF_FLOAT = 11, /* !32-bit IEEE floating point */
EXIF_DOUBLE = 12 /* !64-bit IEEE floating point */
} EXIFDataType;
typedef struct exif_parser {
unsigned char *header,*data,*ifds[10];
int ifdtags[10]; /* How many tags in each ifd */
int ifdcnt; /* Number of IFD's, assumed to be < 10 */
unsigned int exiflen;
int preparsed,endian;
} exifparser;
typedef struct {
int tag; /* Tag ID, see exif_tags.h */
EXIFDataType type; /* Tag data type, see exif_tags.h */
int size; /* Length of the data, in bytes. */
unsigned char *data; /* The data itself, not an offset */
int num; /* When type is (s)rational, we */
int den; /* store the value here... */
int intval;
} ExifData;
/*
* The same as gpi_exif_get_thumbnail but returns
* also the thumbnail size
*/
unsigned char *gpi_exif_get_thumbnail_and_size(exifparser *exifdat, long *size);
/*
* COMMENT ME
*/
int gpi_exif_stat(exifparser *exifdata);
/*
* Now, all the 'defines'
*/
#define EXIF_InteroperabilityIndex 0x1
#define EXIF_InteroperabilityVersion 0x2
#define EXIF_RelatedImageFileFormat 0x1000
#define EXIF_RelatedImageWidth 0x1001
#define EXIF_RelatedImageLength 0x1002
#define EXIF_NewSubFileType 0xFE
#define EXIF_ImageWidth 0x100
#define EXIF_ImageLength 0x101
#define EXIF_BitsPerSample 0x102
#define EXIF_Compression 0x103
#define EXIF_PhotometricInterpretation 0x106
#define EXIF_FillOrder 0x10A
#define EXIF_DocumentName 0x10D
#define EXIF_ImageDescription 0x10E
#define EXIF_Make 0x10F
#define EXIF_Model 0x110
#define EXIF_StripOffsets 0x111
#define EXIF_Orientation 0x112
#define EXIF_SamplesPerPixel 0x115
#define EXIF_RowsPerStrip 0x116
#define EXIF_StripByteCounts 0x117
#define EXIF_XResolution 0x11A
#define EXIF_YResolution 0x11B
#define EXIF_PlanarConfiguration 0x11C
#define EXIF_ResolutionUnit 0x128
#define EXIF_TransferFunction 0x12D
#define EXIF_Software 0x131
#define EXIF_DateTime 0x132
#define EXIF_Artist 0x13B
#define EXIF_WhitePoint 0x13E
#define EXIF_PrimaryChromaticities 0x13F
#define EXIF_TransferRange 0x156
#define EXIF_JPEGProc 0x200
#define EXIF_JPEGInterchangeFormat 0x201
#define EXIF_JPEGInterchangeFormatLength 0x202
#define EXIF_YCbCrCoefficients 0x211
#define EXIF_YCbCrSubSampling 0x212
#define EXIF_YCbCrPositioning 0x213
#define EXIF_ReferenceBlackWhite 0x214
#define EXIF_CFARepeatPatternDim 0x828D
#define EXIF_CFAPattern 0x828E
#define EXIF_BatteryLevel 0x828F
#define EXIF_Copyright 0x8298
#define EXIF_ExposureTime 0x829A
#define EXIF_FNumber 0x829D
/* Be careful: the next tag's official name is IPTC/NAA but
we can't do a define with a "/" */
#define EXIF_IPTC_NAA 0x83BB
#define EXIF_ExifOffset 0x8769
#define EXIF_InterColorProfile 0x8773
#define EXIF_ExposureProgram 0x8822
#define EXIF_SpectralSensitivity 0x8824
#define EXIF_GPSInfo 0x8825
#define EXIF_ISOSpeedRatings 0x8827
#define EXIF_OECF 0x8828
#define EXIF_ExifVersion 0x9000
#define EXIF_DateTimeOriginal 0x9003
#define EXIF_DateTimeDigitized 0x9004
#define EXIF_ComponentsConfiguration 0x9101
#define EXIF_CompressedBitsPerPixel 0x9102
#define EXIF_ShutterSpeedValue 0x9201
#define EXIF_ApertureValue 0x9202
#define EXIF_BrightnessValue 0x9203
#define EXIF_ExposureBiasValue 0x9204
#define EXIF_MaxApertureValue 0x9205
#define EXIF_SubjectDistance 0x9206
#define EXIF_MeteringMode 0x9207
#define EXIF_LightSource 0x9208
#define EXIF_Flash 0x9209
#define EXIF_FocalLength 0x920A
#define EXIF_MakerNote 0x927C
#define EXIF_UserComment 0x9286
#define EXIF_SubSecTime 0x9290
#define EXIF_SubSecTimeOriginal 0x9291
#define EXIF_SubSecTimeDigitized 0x9292
#define EXIF_FlashPixVersion 0xA000
#define EXIF_ColorSpace 0xA001
#define EXIF_ExifImageWidth 0xA002
#define EXIF_ExifImageLength 0xA003
#define EXIF_InteroperabilityOffset 0xA005
#define EXIF_FlashEnergy 0xA20B /* 0x920B in TIFF/EP */
#define EXIF_SpatialFrequencyResponse 0xA20C /* 0x920C - - */
#define EXIF_FocalPlaneXResolution 0xA20E /* 0x920E - - */
#define EXIF_FocalPlaneYResolution 0xA20F /* 0x920F - - */
#define EXIF_FocalPlaneResolutionUnit 0xA210 /* 0x9210 - - */
#define EXIF_SubjectLocation 0xA214 /* 0x9214 - - */
#define EXIF_ExposureIndex 0xA215 /* 0x9215 - - */
#define EXIF_SensingMethod 0xA217 /* 0x9217 - - */
#define EXIF_FileSource 0xA300
#define EXIF_SceneType 0xA301
#endif /* _gphoto_exif_ */
|