#1073 test/tiff-test.sh rewritten to no longer require external utility exifprobe
This commit is contained in:
parent
fd80993ab0
commit
ee1ca29d09
@ -367,7 +367,7 @@ namespace Exiv2 {
|
||||
|
||||
while (rc < 0 && again--) {
|
||||
if ( buffer ) delete[] buffer;
|
||||
need *= 2 ;
|
||||
need *= 2 ;
|
||||
buffer = new char[need];
|
||||
if ( buffer ) {
|
||||
va_list args; // variable arg list
|
||||
@ -390,9 +390,12 @@ namespace Exiv2 {
|
||||
size += start;
|
||||
|
||||
while (start < size) {
|
||||
int c = (int) buff[start++] ;
|
||||
if (c < ' ' || c > 127) c = '.' ;
|
||||
result += (char) c ;
|
||||
int c = (int) buff[start++] ;
|
||||
bool bTrailingNull = c == 0 && start == size;
|
||||
if ( !bTrailingNull ) {
|
||||
if (c < ' ' || c > 127) c = '.' ;
|
||||
result += (char) c ;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -303,15 +303,15 @@ namespace Exiv2 {
|
||||
}
|
||||
|
||||
bool isBigEndian()
|
||||
{
|
||||
union {
|
||||
uint32_t i;
|
||||
char c[4];
|
||||
} e = { 0x01000000 };
|
||||
{
|
||||
union {
|
||||
uint32_t i;
|
||||
char c[4];
|
||||
} e = { 0x01000000 };
|
||||
|
||||
return e.c[0]?true:false;
|
||||
}
|
||||
bool isLittleEndian() { return !isBigEndian(); }
|
||||
return e.c[0]?true:false;
|
||||
}
|
||||
bool isLittleEndian() { return !isBigEndian(); }
|
||||
|
||||
|
||||
// http://en.wikipedia.org/wiki/Endianness
|
||||
@ -504,7 +504,7 @@ namespace Exiv2 {
|
||||
: 1
|
||||
;
|
||||
|
||||
DataBuf buf(MIN(size*kount + pad,48)); // allocate a buffer
|
||||
DataBuf buf(MIN(size*kount + pad,48)); // allocate a buffer
|
||||
if ( isStringType(type) || count*size > 4 ) { // data is in the directory => read into buffer
|
||||
size_t restore = io_->tell(); // save
|
||||
io_->seek(offset,BasicIo::beg); // position
|
||||
|
||||
Binary file not shown.
@ -1,46 +1,43 @@
|
||||
[30mFile Name = mini9.tif
|
||||
File Type = TIFF:II
|
||||
File Size = 526
|
||||
@000000000=0 : TIFF(II=0x4949) magic=0x002a='*\0' ifd offset = 0xfc/252
|
||||
@0x00000fc=252 : <IFD 0> 17 entries starting at file offset 0xfe=254
|
||||
@0x00000fe=254 : <0x00fe= 254> NewSubFileType [4 =LONG 1] = 0 = 'primary'
|
||||
@0x000010a=266 : <0x0100= 256> ImageWidth [3 =SHORT 1] = 9
|
||||
@0x0000116=278 : <0x0101= 257> ImageLength [3 =SHORT 1] = 9
|
||||
@0x0000122=290 : <0x0102= 258> BitsPerSample [3 =SHORT 3] = @0x1ce=462
|
||||
@0x000012e=302 : <0x0103= 259> Compression [3 =SHORT 1] = 1 = 'uncompressed'
|
||||
@0x000013a=314 : <0x0106= 262> PhotometricInterpretation [3 =SHORT 1] = 2 = 'RGB'
|
||||
@0x0000146=326 : <0x010d= 269> DocumentName [2 =ASCII 24] = @0x1d4=468
|
||||
@0x0000152=338 : <0x010e= 270> ImageDescription [2 =ASCII 18] = @0x1ec=492
|
||||
@0x000015e=350 : <0x0111= 273> StripOffsets [4 =LONG 1] = @8
|
||||
@0x000016a=362 : <0x0112= 274> Orientation [3 =SHORT 1] = 1 = '0,0 is top left'
|
||||
@0x0000176=374 : <0x0115= 277> SamplesPerPixel [3 =SHORT 1] = 3
|
||||
@0x0000182=386 : <0x0116= 278> RowsPerStrip [3 =SHORT 1] = 64
|
||||
@0x000018e=398 : <0x0117= 279> StripByteCounts [4 =LONG 1] = 243
|
||||
@0x000019a=410 : <0x011a= 282> XResolution [5 =RATIONAL 1] = @0x1fe=510
|
||||
@0x00001a6=422 : <0x011b= 283> YResolution [5 =RATIONAL 1] = @0x206=518
|
||||
@0x00001b2=434 : <0x011c= 284> PlanarConfiguration [3 =SHORT 1] = 1 = 'chunky/contig'
|
||||
@0x00001be=446 : <0x0128= 296> ResolutionUnit [3 =SHORT 1] = 2 = 'pixels per inch'
|
||||
@0x00001ca=458 : **** next IFD offset 0
|
||||
@0x00001ce=462 : ============= VALUES, IFD 0 ============
|
||||
@0x00001ce=462 : BitsPerSample = 8,8,8
|
||||
@0x00001d4=468 : DocumentName = '/home/ahuggel/mini9.tif\0'
|
||||
@0x00001ec=492 : ImageDescription = 'Created with GIMP\0'
|
||||
@0x00001fe=510 : XResolution = 72
|
||||
@0x0000206=518 : YResolution = 72
|
||||
@0x000020d=525 : </IFD 0>
|
||||
@0x0000008=8 : <=-=-=> Start of TIFF RGB uncompressed image data for IFD 0, data length 243
|
||||
0x0000008=8 : ff 00 00 ff 00 00 ff 00 00 ff 00 00 00 ff 00 00 |................|
|
||||
0x0000018=24 : 00 ff ff 00 00 ff 00 00 ff 00 00 00 ff 00 00 ff |................|
|
||||
0x0000028=40 : 00 00 ff 00 3f 7f bf 3f 7f bf 3f 7f bf 00 ff 00 |....?..?..?.....|
|
||||
0x0000038=56 : 00 ff 00 00 ff 00 00 00 ff 00 00 ff 3f 7f bf ff |............?...| etc...
|
||||
@0x00000fa=250 : </=-=-=> End of image data
|
||||
-0x000020d=525 : END OF FILE
|
||||
[90m@0x0000008=8 : Start of TIFF RGB uncompressed primary image [9x9] length 243 (IFD 0)
|
||||
-0x00000fa=250 : End of TIFF primary image data
|
||||
[0m[30mNumber of images = 1
|
||||
File Format = TIFFEP
|
||||
exiv2 -pa output
|
||||
NewSubfileType Long 1 "Primary image"
|
||||
ImageWidth Short 1 "9"
|
||||
ImageLength Short 1 "9"
|
||||
BitsPerSample Short 3 "8 8 8"
|
||||
Compression Short 1 "Uncompressed"
|
||||
PhotometricInterpretation Short 1 "RGB"
|
||||
DocumentName Ascii 24 "/home/ahuggel/mini9.tif"
|
||||
ImageDescription Ascii 18 "Created with GIMP"
|
||||
StripOffsets Long 1 "8"
|
||||
Orientation Short 1 "top, left"
|
||||
SamplesPerPixel Short 1 "3"
|
||||
RowsPerStrip Short 1 "64"
|
||||
StripByteCounts Long 1 "243"
|
||||
XResolution Rational 1 "72"
|
||||
YResolution Rational 1 "72"
|
||||
PlanarConfiguration Short 1 "1"
|
||||
ResolutionUnit Short 1 "inch"
|
||||
|
||||
exiv2 -pS output
|
||||
NewSubfileType LONG 1 "0"
|
||||
ImageWidth SHORT 1 "9"
|
||||
ImageLength SHORT 1 "9"
|
||||
BitsPerSample SHORT 3 "8 8 8"
|
||||
Compression SHORT 1 "1"
|
||||
PhotometricInterpretation SHORT 1 "2"
|
||||
DocumentName ASCII 24 "/home/ahuggel/mini9.tif"
|
||||
ImageDescription ASCII 18 "Created with GIMP"
|
||||
StripOffsets LONG 1 "8"
|
||||
Orientation SHORT 1 "1"
|
||||
SamplesPerPixel SHORT 1 "3"
|
||||
RowsPerStrip SHORT 1 "64"
|
||||
StripByteCounts LONG 1 "243"
|
||||
XResolution RATIONAL 1 "510/0"
|
||||
YResolution RATIONAL 1 "518/0"
|
||||
PlanarConfiguration SHORT 1 "1"
|
||||
ResolutionUnit SHORT 1 "2"
|
||||
|
||||
Analysis
|
||||
count = 17 COUNT = 17
|
||||
Test 1: Writing empty Exif data without original binary data: ok.
|
||||
Test 2: Writing empty Exif data with original binary data: ok.
|
||||
Test 3: Wrote non-empty Exif data without original binary data:
|
||||
@ -86,53 +83,50 @@ Exif.Image.YResolution 0x011b Rational 1 1207959552/16
|
||||
Exif.Image.PlanarConfiguration 0x011c Short 1 1
|
||||
Exif.Image.ResolutionUnit 0x0128 Short 1 2
|
||||
Exif.Photo.DateTimeOriginal 0x9003 Ascii 18 Yesterday at noon
|
||||
[30mFile Name = mini9.tif
|
||||
File Type = TIFF:II
|
||||
File Size = 574
|
||||
@000000000=0 : TIFF(II=0x4949) magic=0x002a='*\0' ifd offset = 0x8/8
|
||||
@0x0000008=8 : <IFD 0> 18 entries starting at file offset 0xa=10
|
||||
@0x000000a=10 : <0x00fe= 254> NewSubFileType [4 =LONG 1] = 0 = 'primary'
|
||||
@0x0000016=22 : <0x0100= 256> ImageWidth [3 =SHORT 1] = 9
|
||||
@0x0000022=34 : <0x0101= 257> ImageLength [3 =SHORT 1] = 9
|
||||
@0x000002e=46 : <0x0102= 258> BitsPerSample [3 =SHORT 3] = @0xe6=230
|
||||
@0x000003a=58 : <0x0103= 259> Compression [3 =SHORT 1] = 1 = 'uncompressed'
|
||||
@0x0000046=70 : <0x0106= 262> PhotometricInterpretation [3 =SHORT 1] = 2 = 'RGB'
|
||||
@0x0000052=82 : <0x010d= 269> DocumentName [2 =ASCII 24] = @0xec=236
|
||||
@0x000005e=94 : <0x010e= 270> ImageDescription [2 =ASCII 18] = @0x104=260
|
||||
@0x000006a=106 : <0x0111= 273> StripOffsets [4 =LONG 1] = @330
|
||||
@0x0000076=118 : <0x0112= 274> Orientation [3 =SHORT 1] = 1 = '0,0 is top left'
|
||||
@0x0000082=130 : <0x0115= 277> SamplesPerPixel [3 =SHORT 1] = 3
|
||||
@0x000008e=142 : <0x0116= 278> RowsPerStrip [3 =SHORT 1] = 64
|
||||
@0x000009a=154 : <0x0117= 279> StripByteCounts [4 =LONG 1] = 243
|
||||
@0x00000a6=166 : <0x011a= 282> XResolution [5 =RATIONAL 1] = @0x116=278
|
||||
@0x00000b2=178 : <0x011b= 283> YResolution [5 =RATIONAL 1] = @0x11e=286
|
||||
@0x00000be=190 : <0x011c= 284> PlanarConfiguration [3 =SHORT 1] = 1 = 'chunky/contig'
|
||||
@0x00000ca=202 : <0x0128= 296> ResolutionUnit [3 =SHORT 1] = 2 = 'pixels per inch'
|
||||
@0x00000d6=214 : <0x8769=34665> ExifIFDPointer [4 =LONG 1] = @0x126=294
|
||||
@0x00000e2=226 : **** next IFD offset 0
|
||||
@0x00000e6=230 : ============= VALUES, IFD 0 ============
|
||||
@0x00000e6=230 : BitsPerSample = 8,8,8
|
||||
@0x00000ec=236 : DocumentName = '/home/ahuggel/mini9.tif\0'
|
||||
@0x0000104=260 : ImageDescription = 'Created with GIMP\0'
|
||||
@0x0000116=278 : XResolution = 72
|
||||
@0x000011e=286 : YResolution = 72
|
||||
[35m@0x0000126=294 : <EXIF IFD> (in IFD 0) 1 entries starting at file offset 0x128=296
|
||||
@0x0000128=296 : <0x9003=36867> DateTimeOriginal [2 =ASCII 18] = @0x138=312
|
||||
@0x0000134=308 : **** next IFD offset 0
|
||||
@0x0000138=312 : ============= VALUES, EXIF IFD ============
|
||||
@0x0000138=312 : DateTimeOriginal = 'Yesterday at noon\0'
|
||||
-0x0000149=329 : </EXIF IFD>
|
||||
[0m[30m@0x0000149=329 : </IFD 0>
|
||||
@0x000014a=330 : <=-=-=> Start of TIFF RGB uncompressed image data for IFD 0, data length 243
|
||||
0x000014a=330 : ff 00 00 ff 00 00 ff 00 00 ff 00 00 00 ff 00 00 |................|
|
||||
0x000015a=346 : 00 ff ff 00 00 ff 00 00 ff 00 00 00 ff 00 00 ff |................|
|
||||
0x000016a=362 : 00 00 ff 00 3f 7f bf 3f 7f bf 3f 7f bf 00 ff 00 |....?..?..?.....|
|
||||
0x000017a=378 : 00 ff 00 00 ff 00 00 00 ff 00 00 ff 3f 7f bf ff |............?...| etc...
|
||||
@0x000023c=572 : </=-=-=> End of image data
|
||||
-0x000023d=573 : END OF FILE
|
||||
[90m@0x000014a=330 : Start of TIFF RGB uncompressed primary image [9x9] length 243 (IFD 0)
|
||||
-0x000023c=572 : End of TIFF primary image data
|
||||
[0m[30mNumber of images = 1
|
||||
File Format = TIFFEP/EXIF
|
||||
exiv2 -pa output
|
||||
NewSubfileType Long 1 "Primary image"
|
||||
ImageWidth Short 1 "9"
|
||||
ImageLength Short 1 "9"
|
||||
BitsPerSample Short 3 "8 8 8"
|
||||
Compression Short 1 "Uncompressed"
|
||||
PhotometricInterpretation Short 1 "RGB"
|
||||
DocumentName Ascii 24 "/home/ahuggel/mini9.tif"
|
||||
ImageDescription Ascii 18 "Created with GIMP"
|
||||
StripOffsets Long 1 "330"
|
||||
Orientation Short 1 "top, left"
|
||||
SamplesPerPixel Short 1 "3"
|
||||
RowsPerStrip Short 1 "64"
|
||||
StripByteCounts Long 1 "243"
|
||||
XResolution Rational 1 "72"
|
||||
YResolution Rational 1 "72"
|
||||
PlanarConfiguration Short 1 "1"
|
||||
ResolutionUnit Short 1 "inch"
|
||||
ExifTag Long 1 "294"
|
||||
DateTimeOriginal Ascii 18 "Yesterday at noon"
|
||||
|
||||
exiv2 -pS output
|
||||
NewSubfileType LONG 1 "0"
|
||||
ImageWidth SHORT 1 "9"
|
||||
ImageLength SHORT 1 "9"
|
||||
BitsPerSample SHORT 3 "8 8 8"
|
||||
Compression SHORT 1 "1"
|
||||
PhotometricInterpretation SHORT 1 "2"
|
||||
DocumentName ASCII 24 "/home/ahuggel/mini9.tif"
|
||||
ImageDescription ASCII 18 "Created with GIMP"
|
||||
StripOffsets LONG 1 "330"
|
||||
Orientation SHORT 1 "1"
|
||||
SamplesPerPixel SHORT 1 "3"
|
||||
RowsPerStrip SHORT 1 "64"
|
||||
StripByteCounts LONG 1 "243"
|
||||
XResolution RATIONAL 1 "278/0"
|
||||
YResolution RATIONAL 1 "286/0"
|
||||
PlanarConfiguration SHORT 1 "1"
|
||||
ResolutionUnit SHORT 1 "2"
|
||||
ExifTag LONG 1 "294"
|
||||
|
||||
Analysis
|
||||
count = 19 COUNT = 18
|
||||
TAG DateTimeOriginal mismatch
|
||||
TYPE ASCII mismatch
|
||||
Length 18 mismatch
|
||||
Value Yesterday at noon mismatch
|
||||
|
||||
@ -1,13 +1,99 @@
|
||||
#!/bin/bash
|
||||
# TIFF parser test driver
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Check if the exifprobe tool is available
|
||||
exifprobe 2>/dev/null >/dev/null
|
||||
if [ "$?" != "0" ] ; then
|
||||
echo "tiff-test.sh: exifprobe not found. Skipping TIFF tests."
|
||||
exit 0
|
||||
fi
|
||||
exifprobe()
|
||||
{
|
||||
f=$1
|
||||
|
||||
# References
|
||||
# process pipe : http://stackoverflow.com/questions/7612320/bash-weird-variable-scope-when-populating-array-with-results
|
||||
# to uppercase : http://unix.stackexchange.com/questions/51983/bash-how-to-uppercase-the-command-line-argument
|
||||
# ---------------------------------------
|
||||
# Parse -pa output
|
||||
# Exif.Image.ImageDescription Ascii 18 Created with GIMP
|
||||
tags=()
|
||||
typs=()
|
||||
lens=()
|
||||
vals=()
|
||||
while read line; do
|
||||
tag=$(echo $line|cut -d. -f 3 | cut -d' ' -f 1) ; tags+=($tag)
|
||||
typ=$(echo $line|cut -d' ' -f 2- | sed -E -e 's/ +/ /g' -e 's/^ //' | cut -d' ' -f 1 ); typs+=($typ)
|
||||
len=$(echo $line|cut -d' ' -f 2- | sed -E -e 's/ +/ /g' -e 's/^ //' | cut -d' ' -f 2 ); lens+=($len)
|
||||
val=$(echo $line|cut -d' ' -f 2- | sed -E -e 's/ +/ /g' -e 's/^ //' | cut -d' ' -f 3-); vals+=("$val")
|
||||
done < <(exiv2 -pa $f 2>/dev/null) # process pipe
|
||||
count=${#tags[@]}
|
||||
|
||||
echo exiv2 -pa output
|
||||
index=0
|
||||
while [ $index -lt $count ]; do
|
||||
tag=${tags[$index]}
|
||||
typ=${typs[$index]}
|
||||
len=${lens[$index]}
|
||||
val=${vals[$index]}
|
||||
echo ${tag} $'\t' ${typ} $'\t' ${len} $'\t' '"'${val}'"'
|
||||
index=$((index+1))
|
||||
done
|
||||
|
||||
# Parse -pS output
|
||||
# address | tag | type | count | offset | value
|
||||
# 254 | 0x00fe NewSubfileType | LONG | 1 | 0 | 0
|
||||
TAGS=()
|
||||
TYPS=()
|
||||
LENS=()
|
||||
OFFS=()
|
||||
VALS=()
|
||||
k=0
|
||||
while read line; do
|
||||
k=$((k+1)) # skip the first couple of lines
|
||||
if [ $k -gt 2 ]; then
|
||||
TAG=$(echo $line| cut -d'|' -f 2 | cut -d' ' -f 3 ); TAGS+=($TAG);
|
||||
TYP=$(echo $line| cut -d'|' -f 3 | sed -E -e's/ +//g'); TYPS+=($TYP)
|
||||
LEN=$(echo $line| cut -d'|' -f 4 | sed -E -e's/ +//g'); LENS+=($LEN)
|
||||
OFF=$(echo $line| cut -d'|' -f 5 | sed -E -e's/ +//g'); OFFS+=($OFF)
|
||||
VAL=$(echo $line| cut -d'|' -f 6- | sed -e's/^ //' ); VALS+=($"$VAL")
|
||||
fi
|
||||
done < <(exiv2 -pS $f 2>/dev/null)
|
||||
COUNT=${#TAGS[@]}
|
||||
|
||||
echo ''
|
||||
echo exiv2 -pS output
|
||||
INDEX=0
|
||||
while [ $INDEX -lt $COUNT ]; do
|
||||
TAG=${TAGS[$INDEX]}
|
||||
TYP=${TYPS[$INDEX]}
|
||||
LEN=${LENS[$INDEX]}
|
||||
OFF=${OFFS[$INDEX]}
|
||||
VAL=${VALS[$INDEX]}
|
||||
ECHO ${TAG} $'\t' ${TYP} $'\t' ${LEN} $'\t' '"'${VAL}'"'
|
||||
INDEX=$((INDEX+1))
|
||||
done
|
||||
|
||||
# ---------------------------------------
|
||||
# Compare
|
||||
echo ''
|
||||
echo "Analysis"
|
||||
echo "count = " $count "COUNT = " $COUNT
|
||||
index=0
|
||||
while [ $index -lt $count ]; do
|
||||
TAG=${TAGS[$index]}
|
||||
tag=${tags[$index]}
|
||||
if [ "$TAG" != "$tag" ]; then echo TAG $TAG $tag mismatch ; fi
|
||||
|
||||
TYP=${TYPS[$index]^^} # to uppercase
|
||||
typ=${typs[$index]^^}
|
||||
if [ "$TYP" != "$typ" ]; then echo TYPE $TYP $typ mismatch ; fi
|
||||
|
||||
LEN=${LENS[$index]}
|
||||
len=${lens[$index]}
|
||||
if [ "$LEN" != "$len" ]; then echo Length $LEN $len mismatch ; fi
|
||||
|
||||
VAL=${VALS[$index]}
|
||||
val=${vals[$index]}
|
||||
if [[ "${typ}" == "ASCII" && "$VAL" != "$val" ]]; then echo Value $VAL $val mismatch ; fi
|
||||
|
||||
index=$((index+1))
|
||||
done
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Setup
|
||||
@ -18,6 +104,7 @@ source ./functions.source
|
||||
testfile=mini9.tif
|
||||
copyTestFile ${testfile}
|
||||
exifprobe ${testfile}
|
||||
|
||||
runTest tiff-test ${testfile}
|
||||
exifprobe ${testfile}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user