summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk6
-rw-r--r--exif.c27
-rw-r--r--jhead.h13
-rw-r--r--main.c17
4 files changed, 59 insertions, 4 deletions
diff --git a/Android.mk b/Android.mk
index ac3e2d5..99a1766 100644
--- a/Android.mk
+++ b/Android.mk
@@ -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)
diff --git a/exif.c b/exif.c
index 30cd66d..472c45e 100644
--- a/exif.c
+++ b/exif.c
@@ -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
diff --git a/jhead.h b/jhead.h
index a3825e8..0c4ccbb 100644
--- a/jhead.h
+++ b/jhead.h
@@ -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;
diff --git a/main.c b/main.c
index ace5bdd..c36683b 100644
--- a/main.c
+++ b/main.c
@@ -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;