exiftool-vendored.pl 12.56.0 → 12.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/bin/Changes +115 -5
  2. package/bin/LICENSE +674 -0
  3. package/bin/MANIFEST +11 -0
  4. package/bin/META.json +1 -1
  5. package/bin/META.yml +1 -1
  6. package/bin/README +45 -44
  7. package/bin/config_files/example.config +1 -0
  8. package/bin/config_files/rotate_regions.config +1 -1
  9. package/bin/exiftool +262 -160
  10. package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  11. package/bin/lib/Image/ExifTool/APE.pm +2 -2
  12. package/bin/lib/Image/ExifTool/BMP.pm +0 -1
  13. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -19
  14. package/bin/lib/Image/ExifTool/Canon.pm +26 -6
  15. package/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
  16. package/bin/lib/Image/ExifTool/DJI.pm +28 -2
  17. package/bin/lib/Image/ExifTool/Exif.pm +77 -19
  18. package/bin/lib/Image/ExifTool/FlashPix.pm +33 -10
  19. package/bin/lib/Image/ExifTool/FujiFilm.pm +7 -3
  20. package/bin/lib/Image/ExifTool/GPS.pm +7 -2
  21. package/bin/lib/Image/ExifTool/Geotag.pm +30 -7
  22. package/bin/lib/Image/ExifTool/JPEG.pm +14 -2
  23. package/bin/lib/Image/ExifTool/Jpeg2000.pm +36 -11
  24. package/bin/lib/Image/ExifTool/LIF.pm +10 -2
  25. package/bin/lib/Image/ExifTool/LNK.pm +5 -4
  26. package/bin/lib/Image/ExifTool/MIE.pm +3 -3
  27. package/bin/lib/Image/ExifTool/MPEG.pm +2 -2
  28. package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -2
  29. package/bin/lib/Image/ExifTool/Minolta.pm +6 -7
  30. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  31. package/bin/lib/Image/ExifTool/Nikon.pm +1005 -909
  32. package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  33. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  34. package/bin/lib/Image/ExifTool/Olympus.pm +88 -6
  35. package/bin/lib/Image/ExifTool/PDF.pm +17 -8
  36. package/bin/lib/Image/ExifTool/PNG.pm +10 -2
  37. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  38. package/bin/lib/Image/ExifTool/Pentax.pm +8 -5
  39. package/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
  40. package/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
  41. package/bin/lib/Image/ExifTool/QuickTime.pm +48 -14
  42. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +91 -27
  43. package/bin/lib/Image/ExifTool/README +19 -2
  44. package/bin/lib/Image/ExifTool/RIFF.pm +34 -13
  45. package/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
  46. package/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
  47. package/bin/lib/Image/ExifTool/Sigma.pm +5 -4
  48. package/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  49. package/bin/lib/Image/ExifTool/Sony.pm +39 -10
  50. package/bin/lib/Image/ExifTool/TagLookup.pm +4687 -4628
  51. package/bin/lib/Image/ExifTool/TagNames.pod +338 -117
  52. package/bin/lib/Image/ExifTool/Validate.pm +5 -5
  53. package/bin/lib/Image/ExifTool/WPG.pm +296 -0
  54. package/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
  55. package/bin/lib/Image/ExifTool/WritePDF.pl +7 -8
  56. package/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  57. package/bin/lib/Image/ExifTool/Writer.pl +162 -40
  58. package/bin/lib/Image/ExifTool/XMP.pm +35 -8
  59. package/bin/lib/Image/ExifTool/XMP2.pl +2 -1
  60. package/bin/lib/Image/ExifTool/ZIP.pm +159 -41
  61. package/bin/lib/Image/ExifTool.pm +286 -65
  62. package/bin/lib/Image/ExifTool.pod +95 -51
  63. package/bin/perl-Image-ExifTool.spec +44 -43
  64. package/bin/pp_build_exe.args +5 -4
  65. package/package.json +3 -3
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.33';
19
+ $VERSION = '1.34';
20
20
 
21
21
  sub ProcessJpeg2000Box($$$);
22
22
  sub ProcessJUMD($$$);
@@ -34,6 +34,9 @@ my %resolutionUnit = (
34
34
  6 => 'um',
35
35
  );
36
36
 
37
+ # top-level boxes containing image data
38
+ my %isImageData = ( jp2c=>1, jbrd=>1, jxlp=>1, jxlc=>1 );
39
+
37
40
  # map of where information is written in JPEG2000 image
38
41
  my %jp2Map = (
39
42
  IPTC => 'UUID-IPTC',
@@ -59,7 +62,7 @@ my %jp2Map = (
59
62
  # map of where information is written in a JXL image
60
63
  my %jxlMap = (
61
64
  IFD0 => 'Exif',
62
- XMP => 'XML',
65
+ XMP => 'xml ',
63
66
  'Exif' => 'JP2',
64
67
  IFD1 => 'IFD0',
65
68
  EXIF => 'IFD0', # to write EXIF as a block
@@ -428,6 +431,7 @@ my %j2cMarker = (
428
431
  # stuff seen in JPEG XL images:
429
432
  #
430
433
  # jbrd - JPEG Bitstream Reconstruction Data (allows lossless conversion back to original JPG)
434
+ # jxlp - partial JXL codestream
431
435
  jxlc => {
432
436
  Name => 'JXLCodestream',
433
437
  Format => 'undef',
@@ -827,8 +831,8 @@ sub CreateNewBoxes($$)
827
831
  # add UUID boxes (and/or JXL Exif/XML boxes)
828
832
  foreach $dirName (sort keys %$addDirs) {
829
833
  # handle JPEG XL XMP and EXIF
830
- if ($dirName eq 'XML' or $dirName eq 'Exif') {
831
- my ($tag, $dir) = $dirName eq 'XML' ? ('xml ', 'XMP') : ('Exif', 'EXIF');
834
+ if ($dirName eq 'xml ' or $dirName eq 'Exif') {
835
+ my ($tag, $dir) = $dirName eq 'xml ' ? ('xml ', 'XMP') : ('Exif', 'EXIF');
832
836
  my $tagInfo = $Image::ExifTool::Jpeg2000::Main{$tag};
833
837
  $tagInfo = $$tagInfo[1] if ref $tagInfo eq 'ARRAY'; # (hack for stupid JXL XMP)
834
838
  my $subdir = $$tagInfo{SubDirectory};
@@ -930,7 +934,7 @@ sub ProcessJpeg2000Box($$$)
930
934
  my $raf = $$dirInfo{RAF};
931
935
  my $outfile = $$dirInfo{OutFile};
932
936
  my $dirEnd = $dirStart + $dirLen;
933
- my ($err, $outBuff, $verbose, $doColour);
937
+ my ($err, $outBuff, $verbose, $doColour, $md5);
934
938
 
935
939
  if ($outfile) {
936
940
  unless ($raf) {
@@ -948,6 +952,8 @@ sub ProcessJpeg2000Box($$$)
948
952
  # (must not set verbose flag when writing!)
949
953
  $verbose = $$et{OPTIONS}{Verbose};
950
954
  $et->VerboseDir($$dirInfo{DirName}) if $verbose;
955
+ # do MD5 if requested, but only for top-level image data
956
+ $md5 = $$et{ImageDataMD5} if $raf;
951
957
  }
952
958
  # loop through all contained boxes
953
959
  my ($pos, $boxLen, $lastBox);
@@ -971,6 +977,11 @@ sub ProcessJpeg2000Box($$$)
971
977
  }
972
978
  $boxLen = unpack("x$pos N",$$dataPt); # (length includes header and data)
973
979
  $boxID = substr($$dataPt, $pos+4, 4);
980
+ # (ftbl box contains flst boxes with absolute file offsets, not currently handled)
981
+ if ($outfile and $boxID eq 'ftbl') {
982
+ $et->Error("Can't yet handle fragmented JPX files");
983
+ return -1;
984
+ }
974
985
  # remove old colr boxes if necessary
975
986
  if ($doColour and $boxID eq 'colr') {
976
987
  if ($doColour == 1) { # did we successfully write the new colr box?
@@ -1007,9 +1018,14 @@ sub ProcessJpeg2000Box($$$)
1007
1018
  while ($raf->Read($buff, 65536)) {
1008
1019
  Write($outfile, $buff) or $err = 1;
1009
1020
  }
1010
- } elsif ($verbose) {
1011
- my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos);
1012
- $et->VPrint(0, "$$et{INDENT}- Tag '${boxID}' ($msg)\n");
1021
+ } else {
1022
+ if ($verbose) {
1023
+ my $msg = sprintf("offset 0x%.4x to end of file", $dataPos + $base + $pos);
1024
+ $et->VPrint(0, "$$et{INDENT}- Tag '${boxID}' ($msg)\n");
1025
+ }
1026
+ if ($md5 and $isImageData{$boxID}) {
1027
+ $et->ImageDataMD5($raf, undef, $boxID);
1028
+ }
1013
1029
  }
1014
1030
  last; # (ignore the rest of the file when reading)
1015
1031
  }
@@ -1026,6 +1042,8 @@ sub ProcessJpeg2000Box($$$)
1026
1042
  Write($outfile, $$dataPt) or $err = 1;
1027
1043
  $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
1028
1044
  Write($outfile, $buff) or $err = 1;
1045
+ } elsif ($md5 and $isImageData{$boxID}) {
1046
+ $et->ImageDataMD5($raf, $boxLen, $boxID);
1029
1047
  } else {
1030
1048
  $raf->Seek($boxLen, 1) or $err = 'Seek error', last;
1031
1049
  }
@@ -1038,6 +1056,10 @@ sub ProcessJpeg2000Box($$$)
1038
1056
  # read the box data
1039
1057
  $dataPos = $raf->Tell() - $base;
1040
1058
  $raf->Read($buff,$boxLen) == $boxLen or $err = '', last;
1059
+ if ($md5 and $isImageData{$boxID}) {
1060
+ $md5->add($buff);
1061
+ $et->VPrint(0, "$$et{INDENT}(ImageDataMD5: $boxLen bytes of $boxID data)\n");
1062
+ }
1041
1063
  $valuePtr = 0;
1042
1064
  $dataLen = $boxLen;
1043
1065
  } elsif ($pos + $boxLen > $dirEnd) {
@@ -1123,8 +1145,8 @@ sub ProcessJpeg2000Box($$$)
1123
1145
  my $subTable = GetTagTable($$subdir{TagTable}) || $tagTablePtr;
1124
1146
  if ($outfile) {
1125
1147
  # remove this directory from our create list
1126
- delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF')
1127
- delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif')
1148
+ delete $$et{AddJp2Dirs}{$$tagInfo{Name}}; # (eg. 'EXIF' or 'XMP')
1149
+ delete $$et{AddJp2Dirs}{$boxID}; # (eg. 'Exif' or 'xml ')
1128
1150
  my $newdir;
1129
1151
  # only edit writable UUID, Exif and jp2h boxes
1130
1152
  if ($uuid or $boxID eq 'Exif' or ($boxID eq 'xml ' and $$et{IsJXL}) or
@@ -1311,7 +1333,7 @@ sub ProcessJP2($$)
1311
1333
  }
1312
1334
 
1313
1335
  #------------------------------------------------------------------------------
1314
- # Read meta information from a JPEG XL image
1336
+ # Read/write meta information in a JPEG XL image
1315
1337
  # Inputs: 0) ExifTool object reference, 1) dirInfo reference
1316
1338
  # Returns: 1 on success, 0 if this wasn't a valid JPEG XL file, -1 on write error
1317
1339
  sub ProcessJXL($$)
@@ -1340,6 +1362,9 @@ sub ProcessJXL($$)
1340
1362
  $$dirInfo{RAF} = new File::RandomAccess(\$buff);
1341
1363
  } else {
1342
1364
  $et->SetFileType('JXL Codestream','image/jxl', 'jxl');
1365
+ if ($$et{ImageDataMD5} and $raf->Seek(0,0)) {
1366
+ $et->ImageDataMD5($raf, undef, 'JXL');
1367
+ }
1343
1368
  return ProcessJXLCodestream($et, \$hdr);
1344
1369
  }
1345
1370
  } else {
@@ -13,7 +13,7 @@ use vars qw($VERSION);
13
13
  use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::XMP;
15
15
 
16
- $VERSION = '1.00';
16
+ $VERSION = '1.01';
17
17
 
18
18
  %Image::ExifTool::LIF::Main = (
19
19
  GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
@@ -30,7 +30,15 @@ $VERSION = '1.00';
30
30
  my $unixTimeZero = 134774 * 24 * 3600;
31
31
  my @vals = split ' ', $val;
32
32
  foreach (@vals) {
33
- $_ = 1e-7 * hex($_);
33
+ if (/[^0-9a-f]/i) {
34
+ $_ = '0000:00:00 00:00:00';
35
+ } elsif (length $_ > 8) {
36
+ my $lo = hex substr($_, -8);
37
+ my $hi = hex substr($_, 0, -8);
38
+ $_ = 1e-7 * ($hi * 4294967296 + $lo);
39
+ } else {
40
+ $_ = 1e-7 * hex($_);
41
+ }
34
42
  # shift from Jan 1, 1601 to Jan 1, 1970
35
43
  $_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
36
44
  }
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.08';
18
+ $VERSION = '1.09';
19
19
 
20
20
  sub ProcessItemID($$$);
21
21
  sub ProcessLinkInfo($$$);
@@ -507,7 +507,7 @@ sub ProcessLinkInfo($$$)
507
507
  if ($lif & 0x01) {
508
508
  # read Volume ID
509
509
  $off = Get32u($dataPt, 0x0c);
510
- if ($off + 0x20 <= $dataLen) {
510
+ if ($off and $off + 0x20 <= $dataLen) {
511
511
  # my $len = Get32u($dataPt, $off);
512
512
  $et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
513
513
  $et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8);
@@ -545,6 +545,7 @@ sub ProcessLinkInfo($$$)
545
545
  $off = Get32u($dataPt, 0x14);
546
546
  if ($off and $off + 0x14 <= $dataLen) {
547
547
  my $siz = Get32u($dataPt, $off);
548
+ return 0 if $off + $siz > $dataLen;
548
549
  $pos = Get32u($dataPt, $off + 0x08);
549
550
  if ($pos > 0x14 and $siz >= 0x18) {
550
551
  $pos = Get32u($dataPt, $off + 0x14);
@@ -552,7 +553,7 @@ sub ProcessLinkInfo($$$)
552
553
  } else {
553
554
  undef $unicode;
554
555
  }
555
- $val = GetString($dataPt, $pos, $unicode);
556
+ $val = GetString($dataPt, $off + $pos, $unicode);
556
557
  if (defined $val) {
557
558
  $size = length $val;
558
559
  $val = $et->Decode($val, 'UCS2') if $unicode;
@@ -567,7 +568,7 @@ sub ProcessLinkInfo($$$)
567
568
  } else {
568
569
  undef $unicode;
569
570
  }
570
- $val = GetString($dataPt, $pos, $unicode);
571
+ $val = GetString($dataPt, $off + $pos, $unicode);
571
572
  if (defined $val) {
572
573
  $size = length $val;
573
574
  $val = $et->Decode($val, 'UCS2') if $unicode;
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::GPS;
16
16
 
17
- $VERSION = '1.50';
17
+ $VERSION = '1.51';
18
18
 
19
19
  sub ProcessMIE($$);
20
20
  sub ProcessMIEGroup($$$);
@@ -391,7 +391,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
391
391
  -30", "-40.5", "40 30 0.00 S"
392
392
  },
393
393
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
394
- ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
394
+ ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
395
395
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
396
396
  PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
397
397
  },
@@ -404,7 +404,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
404
404
  negative, but may be entered as positive numbers with a trailing 'W'
405
405
  },
406
406
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
407
- ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
407
+ ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 3)',
408
408
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
409
409
  PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
410
410
  },
@@ -18,7 +18,7 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.16';
21
+ $VERSION = '1.17';
22
22
 
23
23
  %Image::ExifTool::MPEG::Audio = (
24
24
  GROUPS => { 2 => 'Audio' },
@@ -599,7 +599,7 @@ sub ProcessMPEGVideo($$)
599
599
  return 0;
600
600
  }
601
601
  # set file type if not done already
602
- $et->SetFileType('MPEG') unless $$et{VALUE}{FileType};
602
+ $et->SetFileType('MPEG') unless $$et{FileType};
603
603
 
604
604
  my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Video');
605
605
  ProcessFrameHeader($et, $tagTablePtr, $w1, $w2);
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.12';
24
+ $VERSION = '2.14';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -92,11 +92,12 @@ my $debug; # set to 1 to enable debugging code
92
92
  {
93
93
  Name => 'MakerNoteDJIInfo',
94
94
  Condition => '$$valPt =~ /^\[ae_dbg_info:/',
95
+ NotIFD => 1,
95
96
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
96
97
  },
97
98
  {
98
99
  Name => 'MakerNoteDJI',
99
- Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
100
+ Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^(...\@AMBA|DJI)/s',
100
101
  SubDirectory => {
101
102
  TagTable => 'Image::ExifTool::DJI::Main',
102
103
  Start => '$valuePtr',
@@ -49,7 +49,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
49
49
  use Image::ExifTool qw(:DataAccess :Utils);
50
50
  use Image::ExifTool::Exif;
51
51
 
52
- $VERSION = '2.87';
52
+ $VERSION = '2.88';
53
53
 
54
54
  # Full list of product codes for Sony-compatible Minolta lenses
55
55
  # (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
@@ -179,12 +179,9 @@ $VERSION = '2.87';
179
179
  # ("New" and "II" appear in brackets if original version also has this LensType)
180
180
  %minoltaLensTypes = (
181
181
  Notes => q{
182
- Decimal values have been added to differentiate lenses which would otherwise
183
- have the same LensType, and are used by the Composite LensID tag when
184
- attempting to identify the specific lens model. "New" or "II" appear in
185
- brackets if the original version of the lens has the same LensType. Special
186
- logic is employed to identify the attached lens when a Metabones Canon EF
187
- adapter is used.
182
+ "New" or "II" appear in brackets if the original version of the lens has the
183
+ same LensType. Special logic is employed to identify the attached lens when
184
+ a Metabones Canon EF adapter is used.
188
185
  },
189
186
  OTHER => sub {
190
187
  my ($val, $inv) = @_;
@@ -898,6 +895,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
898
895
  SeparateTable => 1,
899
896
  ValueConvInv => 'int($val)', # (must truncate decimal part)
900
897
  PrintConv => \%minoltaLensTypes,
898
+ PrintInt => 1,
901
899
  },
902
900
  # 0x010e - WhiteBalance according to ref #10
903
901
  0x0111 => { #20
@@ -2708,6 +2706,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2708
2706
  SeparateTable => 1,
2709
2707
  ValueConvInv => 'int($val)', # (must truncate decimal part)
2710
2708
  PrintConv => \%minoltaLensTypes,
2709
+ PrintInt => 1,
2711
2710
  },
2712
2711
  0x49c0 => {
2713
2712
  Name => 'ExposureCompensation', # (in exposure bracketing, this is the actual value used)
@@ -17,7 +17,7 @@ use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
  use Image::ExifTool::Minolta;
19
19
 
20
- $VERSION = '1.16';
20
+ $VERSION = '1.18';
21
21
 
22
22
  sub ProcessMRW($$;$);
23
23
  sub WriteMRW($$;$);
@@ -489,6 +489,7 @@ sub ProcessMRW($$;$)
489
489
  $err and $et->Error("MRW format error", $$et{TIFF_TYPE} eq 'ARW');
490
490
  } else {
491
491
  $err and $et->Warn("MRW format error");
492
+ $et->ImageDataMD5($raf, undef, 'raw') unless $$et{A100DataOffset};
492
493
  }
493
494
  return $rtnVal;
494
495
  }