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