- Timestamp:
- 2021-02-26T19:39:51+13:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cpan/Image/ExifTool/BigTIFF.pm
r24107 r34921 16 16 use Image::ExifTool::Exif; 17 17 18 $VERSION = '1.0 5';18 $VERSION = '1.07'; 19 19 20 20 my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size … … 26 26 sub ProcessBigIFD($$$) 27 27 { 28 my ($e xifTool, $dirInfo, $tagTablePtr) = @_;28 my ($et, $dirInfo, $tagTablePtr) = @_; 29 29 my $raf = $$dirInfo{RAF}; 30 my $verbose = $ exifTool->{OPTIONS}->{Verbose};31 my $htmlDump = $ exifTool->{HTML_DUMP};30 my $verbose = $$et{OPTIONS}{Verbose}; 31 my $htmlDump = $$et{HTML_DUMP}; 32 32 my $dirName = $$dirInfo{DirName}; 33 33 my $dirStart = $$dirInfo{DirStart}; 34 35 $verbose = -1 if $htmlDump; # mix htmlDump into verbose so we can test for both at once 34 my ($offName, $nextOffName); 35 36 if ($htmlDump) { 37 $verbose = -1; # mix htmlDump into verbose so we can test for both at once 38 $offName = $$dirInfo{OffsetName}; 39 } 36 40 37 41 # loop through IFD chain 38 42 for (;;) { 39 if ($dirStart > $maxOffset and not $e xifTool->Options('LargeFileSupport')) {40 $e xifTool->Warn('Huge offsets not supported (LargeFileSupport not set)');43 if ($dirStart > $maxOffset and not $et->Options('LargeFileSupport')) { 44 $et->Warn('Huge offsets not supported (LargeFileSupport not set)'); 41 45 last; 42 46 } 43 47 unless ($raf->Seek($dirStart, 0)) { 44 $e xifTool->Warn("Bad $dirName offset");48 $et->Warn("Bad $dirName offset"); 45 49 return 0; 46 50 } 47 51 my ($dirBuff, $index); 48 52 unless ($raf->Read($dirBuff, 8) == 8) { 49 $e xifTool->Warn("Truncated $dirName count");53 $et->Warn("Truncated $dirName count"); 50 54 return 0; 51 55 } 52 56 my $numEntries = Image::ExifTool::Get64u(\$dirBuff, 0); 53 $verbose > 0 and $e xifTool->VerboseDir($dirName, $numEntries);57 $verbose > 0 and $et->VerboseDir($dirName, $numEntries); 54 58 my $bsize = $numEntries * 20; 55 59 if ($bsize > $maxOffset) { 56 $e xifTool->Warn('Huge directory counts not yet supported');60 $et->Warn('Huge directory counts not yet supported'); 57 61 last; 58 62 } 59 63 my $bufPos = $raf->Tell(); 60 64 unless ($raf->Read($dirBuff, $bsize) == $bsize) { 61 $e xifTool->Warn("Truncated $dirName directory");65 $et->Warn("Truncated $dirName directory"); 62 66 return 0; 63 67 } … … 65 69 $raf->Read($nextIFD, 8) == 8 or undef $nextIFD; # try to read next IFD pointer 66 70 if ($htmlDump) { 67 $e xifTool->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries");71 $et->HDump($bufPos-8, 8, "$dirName entries", "Entry count: $numEntries", undef, $offName); 68 72 if (defined $nextIFD) { 69 my $tip = sprintf("Offset: 0x%.8x", Image::ExifTool::Get64u(\$nextIFD, 0)); 70 $exifTool->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0); 73 my $off = Image::ExifTool::Get64u(\$nextIFD, 0); 74 my $tip = sprintf("Offset: 0x%.8x", $off); 75 my $id = $offName; 76 ($nextOffName, $id) = Image::ExifTool::Exif::NextOffsetName($et, $id) if $off; 77 $et->HDump($bufPos + 20 * $numEntries, 8, "Next IFD", $tip, 0, $id); 71 78 } 72 79 } … … 79 86 my $formatSize = $Image::ExifTool::Exif::formatSize[$format]; 80 87 unless (defined $formatSize) { 81 $e xifTool->HDump($bufPos+$entry,20,"[invalid IFD entry]",82 "Bad format value: $format", 1);88 $et->HDump($bufPos+$entry,20,"[invalid IFD entry]", 89 "Bad format value: $format", 1, $offName); 83 90 # warn unless the IFD was just padded with zeros 84 $e xifTool->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID));91 $et->Warn(sprintf("Unknown format ($format) for $dirName tag 0x%x",$tagID)); 85 92 return 0; # assume corrupted IFD 86 93 } 87 94 my $formatStr = $Image::ExifTool::Exif::formatName[$format]; 88 95 my $size = $count * $formatSize; 89 my $tagInfo = $e xifTool->GetTagInfo($tagTablePtr, $tagID);96 my $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID); 90 97 next unless defined $tagInfo or $verbose; 91 98 my $valuePtr = $entry + 12; 92 my ($valBuff, $valBase );99 my ($valBuff, $valBase, $rational, $subOffName); 93 100 if ($size > 8) { 94 101 if ($size > $maxOffset) { 95 $e xifTool->Warn("Can't handle $dirName entry $index (huge size)");102 $et->Warn("Can't handle $dirName entry $index (huge size)"); 96 103 next; 97 104 } 98 105 $valuePtr = Image::ExifTool::Get64u(\$dirBuff, $valuePtr); 99 if ($valuePtr > $maxOffset and not $e xifTool->Options('LargeFileSupport')) {100 $e xifTool->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)");106 if ($valuePtr > $maxOffset and not $et->Options('LargeFileSupport')) { 107 $et->Warn("Can't handle $dirName entry $index (LargeFileSupport not set)"); 101 108 next; 102 109 } 103 110 unless ($raf->Seek($valuePtr, 0) and $raf->Read($valBuff, $size) == $size) { 104 $e xifTool->Warn("Error reading $dirName entry $index");111 $et->Warn("Error reading $dirName entry $index"); 105 112 next; 106 113 } … … 112 119 if (defined $tagInfo and not $tagInfo) { 113 120 # GetTagInfo() required the value for a Condition 114 $tagInfo = $e xifTool->GetTagInfo($tagTablePtr, $tagID, \$valBuff);115 } 116 my $val = ReadValue(\$valBuff, 0, $formatStr, $count, $size );121 $tagInfo = $et->GetTagInfo($tagTablePtr, $tagID, \$valBuff); 122 } 123 my $val = ReadValue(\$valBuff, 0, $formatStr, $count, $size, \$rational); 117 124 if ($htmlDump) { 118 125 my $tval = $val; 119 if ($formatStr =~ /^rational64([su])$/) { 120 # show numerator/denominator separately 121 my $f = ReadValue(\$valBuff, 0, "int32$1", $count*2, $size); 122 $f =~ s/(-?\d+) (-?\d+)/$1\/$2/g; 123 $tval .= " ($f)"; 124 } 126 # show numerator/denominator separately for rational numbers 127 $tval .= " ($rational)" if defined $rational; 125 128 my ($tagName, $colName); 126 129 if ($tagID == 0x927c and $dirName eq 'ExifIFD') { … … 153 156 } 154 157 $tip .= "Value: $tval"; 155 $exifTool->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1); 158 my ($id, $sid); 159 if ($tagInfo and $$tagInfo{SubIFD}) { 160 ($subOffName, $id, $sid) = Image::ExifTool::Exif::NextOffsetName($et, $offName); 161 } else { 162 $id = $offName; 163 } 164 $et->HDump($entry+$bufPos, 20, "$dname $colName", $tip, 1, $id); 156 165 if ($size > 8) { 157 166 # add value data block 158 167 my $flg = ($tagInfo and $$tagInfo{SubDirectory} and $$tagInfo{MakerNotes}) ? 4 : 0; 159 $e xifTool->HDump($valuePtr,$size,"$tagName value",'SAME', $flg);168 $et->HDump($valuePtr,$size,"$tagName value",'SAME', $flg, $sid); 160 169 } 161 170 } 162 171 if ($tagInfo and $$tagInfo{SubIFD}) { 163 172 # process all SubIFD's as BigTIFF 164 $verbose > 0 and $e xifTool->VerboseInfo($tagID, $tagInfo,173 $verbose > 0 and $et->VerboseInfo($tagID, $tagInfo, 165 174 Table => $tagTablePtr, 166 175 Index => $index, … … 179 188 $subdirName .= $i if $i; 180 189 my %subdirInfo = ( 181 RAF => $raf, 182 DataPos => 0, 183 DirStart => $offsets[$i], 184 DirName => $subdirName, 185 Parent => $dirInfo, 190 RAF => $raf, 191 DataPos => 0, 192 DirStart => $offsets[$i], 193 DirName => $subdirName, 194 Parent => $dirName, 195 OffsetName => $subOffName, 186 196 ); 187 $e xifTool->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD);197 $et->ProcessDirectory(\%subdirInfo, $tagTablePtr, \&ProcessBigIFD); 188 198 } 189 199 } else { 190 my $tagKey = $e xifTool->HandleTag($tagTablePtr, $tagID, $val,200 my $tagKey = $et->HandleTag($tagTablePtr, $tagID, $val, 191 201 Index => $index, 192 202 DataPt => \$valBuff, … … 198 208 RAF => $raf, 199 209 ); 200 $tagKey and $e xifTool->SetGroup($tagKey, $dirName);210 $tagKey and $et->SetGroup($tagKey, $dirName); 201 211 } 202 212 } 203 213 last unless $dirName =~ /^(IFD|SubIFD)(\d*)$/; 204 214 $dirName = $1 . (($2 || 0) + 1); 205 defined $nextIFD or $e xifTool->Warn("Bad $dirName pointer"), return 0;215 defined $nextIFD or $et->Warn("Bad $dirName pointer"), return 0; 206 216 $dirStart = Image::ExifTool::Get64u(\$nextIFD, 0); 207 217 $dirStart or last; 218 $offName = $nextOffName; 208 219 } 209 220 return 1; … … 216 227 sub ProcessBTF($$) 217 228 { 218 my ($e xifTool, $dirInfo) = @_;229 my ($et, $dirInfo) = @_; 219 230 my $raf = $$dirInfo{RAF}; 220 231 my $buff; … … 223 234 return 0 unless $buff =~ /^(MM\0\x2b\0\x08\0\0|II\x2b\0\x08\0\0\0)/; 224 235 if ($$dirInfo{OutFile}) { 225 $e xifTool->Error('ExifTool does not support writing of BigTIFF images');236 $et->Error('ExifTool does not support writing of BigTIFF images'); 226 237 return 1; 227 238 } 228 $e xifTool->SetFileType('BTF'); # set the FileType tag239 $et->SetFileType('BTF'); # set the FileType tag 229 240 SetByteOrder(substr($buff, 0, 2)); 230 241 my $offset = Image::ExifTool::Get64u(\$buff, 8); 231 if ($ exifTool->{HTML_DUMP}) {242 if ($$et{HTML_DUMP}) { 232 243 my $o = (GetByteOrder() eq 'II') ? 'Little' : 'Big'; 233 $e xifTool->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0);234 $e xifTool->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0);244 $et->HDump(0, 8, "BigTIFF header", "Byte order: $o endian", 0); 245 $et->HDump(8, 8, "IFD0 pointer", sprintf("Offset: 0x%.8x",$offset), 0); 235 246 } 236 247 my %dirInfo = ( … … 242 253 ); 243 254 my $tagTablePtr = GetTagTable('Image::ExifTool::Exif::Main'); 244 $e xifTool->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD);255 $et->ProcessDirectory(\%dirInfo, $tagTablePtr, \&ProcessBigIFD); 245 256 return 1; 246 257 } … … 265 276 =head1 AUTHOR 266 277 267 Copyright 2003-20 11, Phil Harvey (phil at owl.phy.queensu.ca)278 Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com) 268 279 269 280 This library is free software; you can redistribute it and/or modify it
Note:
See TracChangeset
for help on using the changeset viewer.