summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInsun Kang <insun@google.com>2016-05-09 01:31:15 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-05-09 01:31:15 +0000
commite7dac1df82813884eeacb48953638c7e9a438977 (patch)
tree7befb937ba84dafd00fa498d623f6ab9cc682b3a
parentc2702fcd385410b17a0448cbf047ae6d2b75e892 (diff)
parent8385cc7c72694079c13f0135b0deee97ab5ee66d (diff)
downloadjhead-nougat-mr1-wear-release.tar.gz
-rw-r--r--exif.c54
-rw-r--r--jhead.h1
2 files changed, 50 insertions, 5 deletions
diff --git a/exif.c b/exif.c
index 8dfdaf1..f6d3536 100644
--- a/exif.c
+++ b/exif.c
@@ -383,6 +383,51 @@ unsigned Get32u(void * Long)
}
//--------------------------------------------------------------------------
+// Convert a 64 bit signed value from file's native byte order
+//--------------------------------------------------------------------------
+long long Get64s(void * LLong)
+{
+ uchar * ValuePtr = (uchar *)LLong;
+ if (MotorolaOrder){
+ return (((long long)ValuePtr[0]) << 56) | (((ullong)ValuePtr[1]) << 48)
+ | ((( ullong)ValuePtr[2]) << 40) | (((ullong)ValuePtr[3]) << 32)
+ | ((( ullong)ValuePtr[4]) << 24) | (((ullong)ValuePtr[5]) << 16)
+ | ((( ullong)ValuePtr[6]) << 8 ) | (((ullong)ValuePtr[7]) << 0 );
+ }else{
+ return (((long long)ValuePtr[7]) << 56) | (((ullong)ValuePtr[6]) << 48)
+ | ((( ullong)ValuePtr[5]) << 40) | (((ullong)ValuePtr[4]) << 32)
+ | ((( ullong)ValuePtr[3]) << 24) | (((ullong)ValuePtr[2]) << 16)
+ | ((( ullong)ValuePtr[1]) << 8 ) | (((ullong)ValuePtr[0]) << 0 );
+ }
+}
+
+//--------------------------------------------------------------------------
+// Convert a 64 bit double value from signed long long value
+//--------------------------------------------------------------------------
+double Get64d(void * Double)
+{
+ union {
+ double ret;
+ long long var;
+ }data;
+ data.var = Get64s(Double);
+ return data.ret;
+}
+
+//--------------------------------------------------------------------------
+// Convert a 32 bit float value from signed int value
+//--------------------------------------------------------------------------
+float Get32f(void * Float)
+{
+ union {
+ float ret;
+ int var;
+ }data;
+ data.var = Get32s(Float);
+ return data.ret;
+}
+
+//--------------------------------------------------------------------------
// Display a number as one of its many formats
//--------------------------------------------------------------------------
void PrintFormatNumber(void * ValuePtr, int Format, int ByteCount)
@@ -403,8 +448,8 @@ void PrintFormatNumber(void * ValuePtr, int Format, int ByteCount)
s = 8;
break;
- case FMT_SINGLE: printf("%f",(double)*(float *)ValuePtr); s=8; break;
- case FMT_DOUBLE: printf("%f",*(double *)ValuePtr); s=8; break;
+ case FMT_SINGLE: printf("%f",Get32f(ValuePtr)); s=4; break;
+ case FMT_DOUBLE: printf("%f",Get64d(ValuePtr)); s=8; break;
default:
printf("Unknown format %d:", Format);
return;
@@ -451,9 +496,8 @@ double ConvertAnyFormat(void * ValuePtr, int Format)
case FMT_SSHORT: Value = (signed short)Get16u(ValuePtr); break;
case FMT_SLONG: Value = Get32s(ValuePtr); break;
- // Not sure if this is correct (never seen float used in Exif format)
- case FMT_SINGLE: Value = (double)*(float *)ValuePtr; break;
- case FMT_DOUBLE: Value = *(double *)ValuePtr; break;
+ case FMT_SINGLE: Value = Get32f(ValuePtr); break;
+ case FMT_DOUBLE: Value = Get64d(ValuePtr); break;
default:
ErrNonfatal("Illegal format code %d",Format,0);
diff --git a/jhead.h b/jhead.h
index 0c4ccbb..0ba1592 100644
--- a/jhead.h
+++ b/jhead.h
@@ -30,6 +30,7 @@
typedef unsigned char uchar;
+typedef unsigned long long ullong;
#ifndef TRUE
#define TRUE 1