134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Include file for jhead program.
334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//
4a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen// This include file only defines stuff that goes across modules.
5a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen// I like to keep the definitions for macros and structures as close to
6a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen// where they get used as possible, so include files only get stuff that
734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// gets used in more than one file.
834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define _CRT_SECURE_NO_DEPRECATE 1
1034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
1134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <stdio.h>
1234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <stdlib.h>
1334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <string.h>
1434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <time.h>
1534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <errno.h>
1634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#include <ctype.h>
17661f9634b51c200603b32224541327d50808ba65Wu-cheng Li#include <stdint.h>
1834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
1934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
2034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
2134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#ifdef _WIN32
2234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <sys/utime.h>
2334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#else
2434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <utime.h>
2534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <sys/types.h>
2634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <unistd.h>
2734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <errno.h>
2834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #include <limits.h>
2934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#endif
3034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
3134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
3234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef unsigned char uchar;
3334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
3434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#ifndef TRUE
3534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #define TRUE 1
3634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #define FALSE 0
3734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#endif
3834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
39d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define MAX_COMMENT_SIZE 2000
40434623a0e87c8e145dbb46917b4ab9777475d9ebRay Chen#define GPS_PROCESSING_METHOD_LEN 100
4134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
4234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#ifdef _WIN32
4334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    #define PATH_MAX _MAX_PATH
44d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang    #define SLASH '\\'
45d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#else
46d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang    #define SLASH '/'
4734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#endif
4834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
49d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang
5034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
5134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// This structure is used to store jpeg file sections in memory.
5234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef struct {
5334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    uchar *  Data;
5434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int      Type;
5531b17e69a87e4caa50f9c6b1a47c84ef75f79d83Jeff Sharkey    unsigned Offset;
5634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned Size;
5734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project}Section_t;
5834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
5934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern int ExifSectionIndex;
6034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
6134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern int DumpExifMap;
6234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
6334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define MAX_DATE_COPIES 10
6434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
652bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun// Buffer size must large enough to hold maximum location string
662bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun// containing six signed integers plus delimeters and terminator,
672bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun// i.e.: 11 * 6 + 3(‘/’) + 2(’,’) + 1(\0) = 72
682bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun#define MAX_BUF_SIZE    72
692bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun
7076aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He// Sub second tag string length (including null termination character), with
7176aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He// nano-second precision. e.g. 0.123456789s is represented as a null terminated
7276aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He// string "123456789". Although it can be any length, it is limited to 9 digits
7376aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He// here as we limit the precision to nano-second.
7476aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He#define SUB_SEC_SIZE    10
7576aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He
76574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Litypedef struct {
77574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Li    uint32_t num;
78574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Li    uint32_t denom;
79574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Li} rat_t;
80574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Li
8134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
8234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// This structure stores Exif header image elements in a simple manner
8334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Used to store camera data as extracted from the various ways that it can be
8434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// stored in an exif header
8534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef struct {
8634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char  FileName     [PATH_MAX+1];
8734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    time_t FileDateTime;
8834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned FileSize;
8934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char  CameraMake   [32];
9034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char  CameraModel  [40];
9134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char  DateTime     [20];
9276aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    char  DigitizedTime[20];
9376aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    // Fractions of seconds for DateTime tag, with milisecond precision.
9476aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    char  SubSecTime[SUB_SEC_SIZE];
9576aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    // Fractions of seconds for DateTimeOriginal tag, with milisecond precision.
9676aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    char  SubSecTimeOrig[SUB_SEC_SIZE];
9776aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    // Fractions of seconds for DateTimeDigitized tag, with milisecond precision.
9876aba45cce69de1b3a7ba29bbacc5339512de13cZhijun He    char  SubSecTimeDig[SUB_SEC_SIZE];
9934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   Height, Width;
10034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   Orientation;
10134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   IsColor;
10234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   Process;
10334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   FlashUsed;
104574d52d26f44b600cdab3d3361eaa5f6dd9d7a4dWu-cheng Li    rat_t FocalLength;
10534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float ExposureTime;
10634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float ApertureFNumber;
10734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float Distance;
10834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float CCDWidth;
10934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float ExposureBias;
11034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    float DigitalZoomRatio;
11134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   FocalLength35mmEquiv; // Exif 2.2 tag - usually not present.
11234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   Whitebalance;
11334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   MeteringMode;
11434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   ExposureProgram;
11534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   ExposureMode;
11634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   ISOequivalent;
11734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   LightSource;
118d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang    int   DistanceRange;
119d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang
120d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang    char  Comments[MAX_COMMENT_SIZE];
121d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang    int   CommentWidchars; // If nonzer, widechar comment, indicates number of chars.
12234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
12334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned ThumbnailOffset;          // Exif offset to thumbnail
12434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned ThumbnailSize;            // Size of thumbnail.
12534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned LargestExifOffset;        // Last exif data referenced (to check if thumbnail is at end)
12634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
12734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char  ThumbnailAtEnd;              // Exif header ends with the thumbnail
12834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project                                       // (we can only modify the thumbnail if its at the end)
12934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int   ThumbnailSizeOffset;
13034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
13134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int  DateTimeOffsets[MAX_DATE_COPIES];
13234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int  numDateTimeTags;
13334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
13434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int GpsInfoPresent;
13534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char GpsLat[31];
1362bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun    char GpsLatRaw[MAX_BUF_SIZE];
13734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char GpsLatRef[2];
13834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char GpsLong[31];
1392bfc190bd3be7e1b91fe3d7ca49412ebf0f5ceeeWang Kun    char GpsLongRaw[MAX_BUF_SIZE];
14034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char GpsLongRef[2];
14134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char GpsAlt[20];
1421ed8197f0cefb2541f630830993e109c59ba822cWu-cheng Li    rat_t GpsAltRaw;
1431ed8197f0cefb2541f630830993e109c59ba822cWu-cheng Li    char GpsAltRef;
144a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen    // gps-datestamp is 11 bytes ascii in EXIF 2.2
145a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen    char GpsDateStamp[11];
146a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen    char GpsTimeStamp[11];
147434623a0e87c8e145dbb46917b4ab9777475d9ebRay Chen    char GpsProcessingMethod[GPS_PROCESSING_METHOD_LEN + 1];
14834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project}ImageInfo_t;
14934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
15034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
15134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
15234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define EXIT_FAILURE  1
15334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define EXIT_SUCCESS  0
15434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
15534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// jpgfile.c functions
15634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef enum {
15734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    READ_METADATA = 1,
15834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    READ_IMAGE = 2,
15934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    READ_ALL = 3
16034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project}ReadMode_t;
16134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
16234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
16334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef struct {
16434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned short Tag;     // tag value, i.e. TAG_MODEL
16534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int Format;             // format of data
16634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char* Value;            // value of data in string format
16734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int DataLength;         // length of string when format says Value is a string
16834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int GpsTag;             // bool - the tag is related to GPS info
16934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project} ExifElement_t;
17034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
17134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
17234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projecttypedef struct {
17334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    unsigned short Tag;
17434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    char * Desc;
17534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int Format;
17634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project    int DataLength;         // Number of elements in Format. -1 means any length.
17734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project} TagTable_t;
17834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
17934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
18034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// prototypes for jhead.c functions
18134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid ErrFatal(char * msg);
18234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid ErrNonfatal(char * msg, int a1, int a2);
18334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid FileTimeAsString(char * TimeStr);
18434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
18534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Prototypes for exif.c functions.
18634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint Exif2tm(struct tm * timeptr, char * ExifTime);
18734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid process_EXIF (unsigned char * CharBuf, unsigned int length);
18834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint RemoveThumbnail(unsigned char * ExifSection);
18934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid ShowImageInfo(int ShowFileInfo);
19034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid ShowConciseImageInfo(void);
19134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectconst char * ClearOrientation(void);
19234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid PrintFormatNumber(void * ValuePtr, int Format, int ByteCount);
19334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectdouble ConvertAnyFormat(void * ValuePtr, int Format);
19434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint Get16u(void * Short);
19534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectunsigned Get32u(void * Long);
19634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint Get32s(void * Long);
19734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid Put32u(void * Value, unsigned PutValue);
198482486a3d21c4d4c933f3081ff14122292314bc7Angus Kongvoid create_EXIF(ExifElement_t* elements, int exifTagCount, int gpsTagCount, int hasDateTimeTag);
19934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint TagNameToValue(const char* tagName);
200482486a3d21c4d4c933f3081ff14122292314bc7Angus Kongint IsDateTimeTag(unsigned short tag);
20134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
20234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
20334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Exif format descriptor stuff
20434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern const int BytesPerFormat[];
20534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define NUM_FORMATS 12
20634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
207a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen#define FMT_BYTE       1
20834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_STRING     2
20934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_USHORT     3
21034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_ULONG      4
21134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_URATIONAL  5
21234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_SBYTE      6
21334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_UNDEFINED  7
21434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_SSHORT     8
21534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_SLONG      9
21634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_SRATIONAL 10
21734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_SINGLE    11
21834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define FMT_DOUBLE    12
21934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
22034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
22134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// makernote.c prototypes
22234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern void ProcessMakerNote(unsigned char * DirStart, int ByteCount,
22334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project                 unsigned char * OffsetBase, unsigned ExifLength);
22434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
22534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// gpsinfo.c prototypes
226a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chenvoid ProcessGpsInfo(unsigned char * ValuePtr, int ByteCount,
22734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project                unsigned char * OffsetBase, unsigned ExifLength);
22834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint IsGpsTag(const char* tag);
22934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint GpsTagToFormatType(unsigned short tag);
23034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint GpsTagNameToValue(const char* tagName);
23134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source ProjectTagTable_t* GpsTagToTagTableEntry(unsigned short tag);
232bd90094d709a579d8d74c326269e492627be9daaTyler Luustatic const char ExifAsciiPrefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
23334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
23434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// iptc.c prototpyes
235d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changvoid show_IPTC (unsigned char * CharBuf, unsigned int length);
236d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changvoid ShowXmp(Section_t XmpSection);
23734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
23834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Prototypes for myglob.c module
239d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#ifdef _WIN32
240d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changvoid MyGlob(const char * Pattern , void (*FileFuncParm)(const char * FileName));
241d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changvoid SlashToNative(char * Path);
242d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#endif
243d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang
244d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang// Prototypes for paths.c module
245d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changint EnsurePathExists(const char * FileName);
246d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Changvoid CatPath(char * BasePath, const char * FilePath);
24734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
24834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Prototypes from jpgfile.c
24934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint ReadJpegSections (FILE * infile, ReadMode_t ReadMode);
25034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid DiscardData(void);
25134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid DiscardAllButExif(void);
25234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint ReadJpegFile(const char * FileName, ReadMode_t ReadMode);
25334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint ReplaceThumbnail(const char * ThumbFileName);
25413714f28c615c0cf1be4907aa6fe86f0cb5b28b8Tyler Luuint ReplaceThumbnailFromBuffer(const char* Thumb, int ThumbLen);
25534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint SaveThumbnail(char * ThumbFileName);
25634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint RemoveSectionType(int SectionType);
25734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint RemoveUnknownSections(void);
25834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectint WriteJpegFile(const char * FileName);
25934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source ProjectSection_t * FindSection(int SectionType);
26034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source ProjectSection_t * CreateSection(int SectionType, unsigned char * Data, int size);
26134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectvoid ResetJpgfile(void);
26224757b4e0fdd25e118ca322a1243c1dbe060955dTyler Luuint ReadJpegSectionsFromBuffer (unsigned char* buffer, unsigned int buffer_size, ReadMode_t ReadMode);
26324757b4e0fdd25e118ca322a1243c1dbe060955dTyler Luuint WriteJpegToBuffer(unsigned char* buffer, unsigned int buffer_size);
26434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
26534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// Variables from jhead.c used by exif.c
26634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern ImageInfo_t ImageInfo;
26734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern int ShowTags;
26834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Projectextern char* formatStr(int format);
26934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
27034a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
27134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// JPEG markers consist of one or more 0xFF bytes, followed by a marker
27234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// code byte (which is not an FF).  Here are the marker codes of interest
27334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project// in this program.  (See jdmarker.c for a more complete list.)
27434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project//--------------------------------------------------------------------------
27534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project
276d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOF0  0xC0          // Start Of Frame N
277d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOF1  0xC1          // N indicates which compression process
278d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOF2  0xC2          // Only SOF0-SOF2 are now in common use
27934a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF3  0xC3
280d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOF5  0xC5          // NB: codes C4 and CC are NOT SOF markers
28134a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF6  0xC6
28234a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF7  0xC7
28334a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF9  0xC9
28434a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF10 0xCA
28534a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF11 0xCB
28634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF13 0xCD
28734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF14 0xCE
28834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_SOF15 0xCF
289d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOI   0xD8          // Start Of Image (beginning of datastream)
290d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_EOI   0xD9          // End Of Image (end of datastream)
291d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_SOS   0xDA          // Start Of Scan (begins compressed data)
292d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_JFIF  0xE0          // Jfif marker
293d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_EXIF  0xE1          // Exif marker.  Also used for XMP data!
294d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_XMP   0x10E1        // Not a real tag (same value in file as Exif!)
295a39920ca4b96a456511fa32ba90c77f119a274c3Ray Chen#define M_COM   0xFE          // COMment
29634a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_DQT   0xDB
29734a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_DHT   0xC4
29834a2564d3268a5ca1472c5076675782fbaf724d6The Android Open Source Project#define M_DRI   0xDD
299d6a02c32e6fa83fad5794b0e19b1d28563e5a99bChih-Chung Chang#define M_IPTC  0xED          // IPTC marker
300