1//--------------------------------------------------------------------------
2// Include file for jhead program.
3//
4// This include file only defines stuff that goes across modules.
5// I like to keep the definitions for macros and structures as close to
6// where they get used as possible, so include files only get stuff that
7// gets used in more than one file.
8//--------------------------------------------------------------------------
9#define _CRT_SECURE_NO_DEPRECATE 1
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <time.h>
15#include <errno.h>
16#include <ctype.h>
17#include <stdint.h>
18
19//--------------------------------------------------------------------------
20
21#ifdef _WIN32
22    #include <sys/utime.h>
23#else
24    #include <utime.h>
25    #include <sys/types.h>
26    #include <unistd.h>
27    #include <errno.h>
28    #include <limits.h>
29#endif
30
31
32typedef unsigned char uchar;
33
34#ifndef TRUE
35    #define TRUE 1
36    #define FALSE 0
37#endif
38
39#define MAX_COMMENT_SIZE 2000
40#define GPS_PROCESSING_METHOD_LEN 100
41
42#ifdef _WIN32
43    #define PATH_MAX _MAX_PATH
44    #define SLASH '\\'
45#else
46    #define SLASH '/'
47#endif
48
49
50//--------------------------------------------------------------------------
51// This structure is used to store jpeg file sections in memory.
52typedef struct {
53    uchar *  Data;
54    int      Type;
55    unsigned Size;
56}Section_t;
57
58extern int ExifSectionIndex;
59
60extern int DumpExifMap;
61
62#define MAX_DATE_COPIES 10
63
64// Buffer size must large enough to hold maximum location string
65// containing six signed integers plus delimeters and terminator,
66// i.e.: 11 * 6 + 3(â/â) + 2(â,â) + 1(\0) = 72
67#define MAX_BUF_SIZE    72
68
69typedef struct {
70    uint32_t num;
71    uint32_t denom;
72} rat_t;
73
74//--------------------------------------------------------------------------
75// This structure stores Exif header image elements in a simple manner
76// Used to store camera data as extracted from the various ways that it can be
77// stored in an exif header
78typedef struct {
79    char  FileName     [PATH_MAX+1];
80    time_t FileDateTime;
81    unsigned FileSize;
82    char  CameraMake   [32];
83    char  CameraModel  [40];
84    char  DateTime     [20];
85    int   Height, Width;
86    int   Orientation;
87    int   IsColor;
88    int   Process;
89    int   FlashUsed;
90    rat_t FocalLength;
91    float ExposureTime;
92    float ApertureFNumber;
93    float Distance;
94    float CCDWidth;
95    float ExposureBias;
96    float DigitalZoomRatio;
97    int   FocalLength35mmEquiv; // Exif 2.2 tag - usually not present.
98    int   Whitebalance;
99    int   MeteringMode;
100    int   ExposureProgram;
101    int   ExposureMode;
102    int   ISOequivalent;
103    int   LightSource;
104    int   DistanceRange;
105
106    char  Comments[MAX_COMMENT_SIZE];
107    int   CommentWidchars; // If nonzer, widechar comment, indicates number of chars.
108
109    unsigned ThumbnailOffset;          // Exif offset to thumbnail
110    unsigned ThumbnailSize;            // Size of thumbnail.
111    unsigned LargestExifOffset;        // Last exif data referenced (to check if thumbnail is at end)
112
113    char  ThumbnailAtEnd;              // Exif header ends with the thumbnail
114                                       // (we can only modify the thumbnail if its at the end)
115    int   ThumbnailSizeOffset;
116
117    int  DateTimeOffsets[MAX_DATE_COPIES];
118    int  numDateTimeTags;
119
120    int GpsInfoPresent;
121    char GpsLat[31];
122    char GpsLatRaw[MAX_BUF_SIZE];
123    char GpsLatRef[2];
124    char GpsLong[31];
125    char GpsLongRaw[MAX_BUF_SIZE];
126    char GpsLongRef[2];
127    char GpsAlt[20];
128    rat_t GpsAltRaw;
129    char GpsAltRef;
130    // gps-datestamp is 11 bytes ascii in EXIF 2.2
131    char GpsDateStamp[11];
132    char GpsTimeStamp[11];
133    char GpsProcessingMethod[GPS_PROCESSING_METHOD_LEN + 1];
134}ImageInfo_t;
135
136
137
138#define EXIT_FAILURE  1
139#define EXIT_SUCCESS  0
140
141// jpgfile.c functions
142typedef enum {
143    READ_METADATA = 1,
144    READ_IMAGE = 2,
145    READ_ALL = 3
146}ReadMode_t;
147
148
149typedef struct {
150    unsigned short Tag;     // tag value, i.e. TAG_MODEL
151    int Format;             // format of data
152    char* Value;            // value of data in string format
153    int DataLength;         // length of string when format says Value is a string
154    int GpsTag;             // bool - the tag is related to GPS info
155} ExifElement_t;
156
157
158typedef struct {
159    unsigned short Tag;
160    char * Desc;
161    int Format;
162    int DataLength;         // Number of elements in Format. -1 means any length.
163} TagTable_t;
164
165
166// prototypes for jhead.c functions
167void ErrFatal(char * msg);
168void ErrNonfatal(char * msg, int a1, int a2);
169void FileTimeAsString(char * TimeStr);
170
171// Prototypes for exif.c functions.
172int Exif2tm(struct tm * timeptr, char * ExifTime);
173void process_EXIF (unsigned char * CharBuf, unsigned int length);
174int RemoveThumbnail(unsigned char * ExifSection);
175void ShowImageInfo(int ShowFileInfo);
176void ShowConciseImageInfo(void);
177const char * ClearOrientation(void);
178void PrintFormatNumber(void * ValuePtr, int Format, int ByteCount);
179double ConvertAnyFormat(void * ValuePtr, int Format);
180int Get16u(void * Short);
181unsigned Get32u(void * Long);
182int Get32s(void * Long);
183void Put32u(void * Value, unsigned PutValue);
184void create_EXIF(ExifElement_t* elements, int exifTagCount, int gpsTagCount, int hasDateTimeTag);
185int TagNameToValue(const char* tagName);
186int IsDateTimeTag(unsigned short tag);
187
188//--------------------------------------------------------------------------
189// Exif format descriptor stuff
190extern const int BytesPerFormat[];
191#define NUM_FORMATS 12
192
193#define FMT_BYTE       1
194#define FMT_STRING     2
195#define FMT_USHORT     3
196#define FMT_ULONG      4
197#define FMT_URATIONAL  5
198#define FMT_SBYTE      6
199#define FMT_UNDEFINED  7
200#define FMT_SSHORT     8
201#define FMT_SLONG      9
202#define FMT_SRATIONAL 10
203#define FMT_SINGLE    11
204#define FMT_DOUBLE    12
205
206
207// makernote.c prototypes
208extern void ProcessMakerNote(unsigned char * DirStart, int ByteCount,
209                 unsigned char * OffsetBase, unsigned ExifLength);
210
211// gpsinfo.c prototypes
212void ProcessGpsInfo(unsigned char * ValuePtr, int ByteCount,
213                unsigned char * OffsetBase, unsigned ExifLength);
214int IsGpsTag(const char* tag);
215int GpsTagToFormatType(unsigned short tag);
216int GpsTagNameToValue(const char* tagName);
217TagTable_t* GpsTagToTagTableEntry(unsigned short tag);
218static const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
219
220// iptc.c prototpyes
221void show_IPTC (unsigned char * CharBuf, unsigned int length);
222void ShowXmp(Section_t XmpSection);
223
224// Prototypes for myglob.c module
225#ifdef _WIN32
226void MyGlob(const char * Pattern , void (*FileFuncParm)(const char * FileName));
227void SlashToNative(char * Path);
228#endif
229
230// Prototypes for paths.c module
231int EnsurePathExists(const char * FileName);
232void CatPath(char * BasePath, const char * FilePath);
233
234// Prototypes from jpgfile.c
235int ReadJpegSections (FILE * infile, ReadMode_t ReadMode);
236void DiscardData(void);
237void DiscardAllButExif(void);
238int ReadJpegFile(const char * FileName, ReadMode_t ReadMode);
239int ReplaceThumbnail(const char * ThumbFileName);
240int ReplaceThumbnailFromBuffer(const char* Thumb, int ThumbLen);
241int SaveThumbnail(char * ThumbFileName);
242int RemoveSectionType(int SectionType);
243int RemoveUnknownSections(void);
244int WriteJpegFile(const char * FileName);
245Section_t * FindSection(int SectionType);
246Section_t * CreateSection(int SectionType, unsigned char * Data, int size);
247void ResetJpgfile(void);
248int ReadJpegSectionsFromBuffer (unsigned char* buffer, unsigned int buffer_size, ReadMode_t ReadMode);
249int WriteJpegToBuffer(unsigned char* buffer, unsigned int buffer_size);
250
251// Variables from jhead.c used by exif.c
252extern ImageInfo_t ImageInfo;
253extern int ShowTags;
254extern char* formatStr(int format);
255
256//--------------------------------------------------------------------------
257// JPEG markers consist of one or more 0xFF bytes, followed by a marker
258// code byte (which is not an FF).  Here are the marker codes of interest
259// in this program.  (See jdmarker.c for a more complete list.)
260//--------------------------------------------------------------------------
261
262#define M_SOF0  0xC0          // Start Of Frame N
263#define M_SOF1  0xC1          // N indicates which compression process
264#define M_SOF2  0xC2          // Only SOF0-SOF2 are now in common use
265#define M_SOF3  0xC3
266#define M_SOF5  0xC5          // NB: codes C4 and CC are NOT SOF markers
267#define M_SOF6  0xC6
268#define M_SOF7  0xC7
269#define M_SOF9  0xC9
270#define M_SOF10 0xCA
271#define M_SOF11 0xCB
272#define M_SOF13 0xCD
273#define M_SOF14 0xCE
274#define M_SOF15 0xCF
275#define M_SOI   0xD8          // Start Of Image (beginning of datastream)
276#define M_EOI   0xD9          // End Of Image (end of datastream)
277#define M_SOS   0xDA          // Start Of Scan (begins compressed data)
278#define M_JFIF  0xE0          // Jfif marker
279#define M_EXIF  0xE1          // Exif marker.  Also used for XMP data!
280#define M_XMP   0x10E1        // Not a real tag (same value in file as Exif!)
281#define M_COM   0xFE          // COMment
282#define M_DQT   0xDB
283#define M_DHT   0xC4
284#define M_DRI   0xDD
285#define M_IPTC  0xED          // IPTC marker
286