diff options
-rw-r--r-- | Android.mk | 6 | ||||
-rw-r--r-- | exif.c | 27 | ||||
-rw-r--r-- | jhead.h | 13 | ||||
-rw-r--r-- | main.c | 17 |
4 files changed, 59 insertions, 4 deletions
@@ -28,7 +28,7 @@ LOCAL_SRC_FILES:= \ jpgfile.c \ makernote.c -LOCAL_MODULE := libexif +LOCAL_MODULE := libjhead LOCAL_SHARED_LIBRARIES := \ libcutils \ @@ -50,14 +50,14 @@ LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:= \ main.c -LOCAL_MODULE := libexif_jni +LOCAL_MODULE := libjhead_jni LOCAL_SHARED_LIBRARIES := \ libnativehelper \ libcutils \ libutils \ liblog \ - libexif + libjhead include $(BUILD_SHARED_LIBRARY) @@ -711,12 +711,37 @@ static void ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, strncpy(ImageInfo.CameraModel, (char *)ValuePtr, ByteCount < 39 ? ByteCount : 39); break; + case TAG_SUBSEC_TIME: + strlcpy(ImageInfo.SubSecTime, (char *)ValuePtr, sizeof(ImageInfo.SubSecTime)); + break; + + case TAG_SUBSEC_TIME_ORIG: + strlcpy(ImageInfo.SubSecTimeOrig, (char *)ValuePtr, + sizeof(ImageInfo.SubSecTimeOrig)); + break; + + case TAG_SUBSEC_TIME_DIG: + strlcpy(ImageInfo.SubSecTimeDig, (char *)ValuePtr, + sizeof(ImageInfo.SubSecTimeDig)); + break; + + case TAG_DATETIME_DIGITIZED: + strlcpy(ImageInfo.DigitizedTime, (char *)ValuePtr, + sizeof(ImageInfo.DigitizedTime)); + + if (ImageInfo.numDateTimeTags >= MAX_DATE_COPIES){ + ErrNonfatal("More than %d date fields! This is nuts", MAX_DATE_COPIES, 0); + break; + } + ImageInfo.DateTimeOffsets[ImageInfo.numDateTimeTags++] = + (char *)ValuePtr - (char *)OffsetBase; + break; + case TAG_DATETIME_ORIGINAL: // If we get a DATETIME_ORIGINAL, we use that one. strncpy(ImageInfo.DateTime, (char *)ValuePtr, 19); // Fallthru... - case TAG_DATETIME_DIGITIZED: case TAG_DATETIME: if (!isdigit(ImageInfo.DateTime[0])){ // If we don't already have a DATETIME_ORIGINAL, use whatever @@ -67,6 +67,12 @@ extern int DumpExifMap; // i.e.: 11 * 6 + 3(‘/’) + 2(’,’) + 1(\0) = 72 #define MAX_BUF_SIZE 72 +// Sub second tag string length (including null termination character), with +// nano-second precision. e.g. 0.123456789s is represented as a null terminated +// string "123456789". Although it can be any length, it is limited to 9 digits +// here as we limit the precision to nano-second. +#define SUB_SEC_SIZE 10 + typedef struct { uint32_t num; uint32_t denom; @@ -83,6 +89,13 @@ typedef struct { char CameraMake [32]; char CameraModel [40]; char DateTime [20]; + char DigitizedTime[20]; + // Fractions of seconds for DateTime tag, with milisecond precision. + char SubSecTime[SUB_SEC_SIZE]; + // Fractions of seconds for DateTimeOriginal tag, with milisecond precision. + char SubSecTimeOrig[SUB_SEC_SIZE]; + // Fractions of seconds for DateTimeDigitized tag, with milisecond precision. + char SubSecTimeDig[SUB_SEC_SIZE]; int Height, Width; int Orientation; int IsColor; @@ -602,6 +602,23 @@ static jstring getAttributes(JNIEnv *env, jobject jobj, jstring jfilename) bufLen = addKeyValueString(&buf, bufLen, "DateTime", ImageInfo.DateTime); if (bufLen == 0) return NULL; } + if (ImageInfo.DigitizedTime[0]) { + bufLen = addKeyValueString(&buf, bufLen, "DateTimeDigitized", ImageInfo.DigitizedTime); + if (bufLen == 0) return NULL; + } + if (ImageInfo.SubSecTime[0]) { + bufLen = addKeyValueString(&buf, bufLen, "SubSecTime", ImageInfo.SubSecTime); + if (bufLen == 0) return NULL; + } + if (ImageInfo.SubSecTimeOrig[0]) { + bufLen = addKeyValueString(&buf, bufLen, "SubSecTimeOriginal", ImageInfo.SubSecTimeOrig); + if (bufLen == 0) return NULL; + } + if (ImageInfo.SubSecTimeDig[0]) { + bufLen = addKeyValueString(&buf, bufLen, "SubSecTimeDigitized", ImageInfo.SubSecTimeDig); + if (bufLen == 0) return NULL; + } + bufLen = addKeyValueInt(&buf, bufLen, "ImageWidth", ImageInfo.Width); if (bufLen == 0) return NULL; |