exiftool_vendored 12.73.0 → 12.75.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +41 -2
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +46 -45
  6. data/bin/exiftool +97 -83
  7. data/bin/lib/File/RandomAccess.pm +31 -5
  8. data/bin/lib/File/RandomAccess.pod +4 -4
  9. data/bin/lib/Image/ExifTool/7Z.pm +3 -3
  10. data/bin/lib/Image/ExifTool/AFCP.pm +2 -2
  11. data/bin/lib/Image/ExifTool/BZZ.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
  13. data/bin/lib/Image/ExifTool/Canon.pm +6 -5
  14. data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
  15. data/bin/lib/Image/ExifTool/DICOM.pm +2 -2
  16. data/bin/lib/Image/ExifTool/DNG.pm +4 -4
  17. data/bin/lib/Image/ExifTool/Exif.pm +3 -2
  18. data/bin/lib/Image/ExifTool/FLIR.pm +2 -2
  19. data/bin/lib/Image/ExifTool/Fixup.pm +3 -3
  20. data/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
  21. data/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
  22. data/bin/lib/Image/ExifTool/Geotag.pm +3 -3
  23. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
  24. data/bin/lib/Image/ExifTool/ID3.pm +2 -2
  25. data/bin/lib/Image/ExifTool/Import.pm +5 -5
  26. data/bin/lib/Image/ExifTool/JSON.pm +2 -2
  27. data/bin/lib/Image/ExifTool/Jpeg2000.pm +51 -12
  28. data/bin/lib/Image/ExifTool/MIE.pm +3 -3
  29. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  30. data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
  31. data/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
  32. data/bin/lib/Image/ExifTool/Ogg.pm +2 -2
  33. data/bin/lib/Image/ExifTool/PDF.pm +54 -4
  34. data/bin/lib/Image/ExifTool/PLIST.pm +3 -3
  35. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
  36. data/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
  37. data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  38. data/bin/lib/Image/ExifTool/PostScript.pm +2 -2
  39. data/bin/lib/Image/ExifTool/QuickTime.pm +41 -107
  40. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +8 -6
  41. data/bin/lib/Image/ExifTool/RSRC.pm +2 -2
  42. data/bin/lib/Image/ExifTool/Samsung.pm +4 -4
  43. data/bin/lib/Image/ExifTool/Shift.pl +1 -2
  44. data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
  45. data/bin/lib/Image/ExifTool/Sony.pm +3 -3
  46. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  47. data/bin/lib/Image/ExifTool/TagLookup.pm +8 -5
  48. data/bin/lib/Image/ExifTool/TagNames.pod +36 -5
  49. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  50. data/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
  51. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  52. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
  53. data/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
  54. data/bin/lib/Image/ExifTool/Writer.pl +68 -44
  55. data/bin/lib/Image/ExifTool/XMP.pm +2 -1
  56. data/bin/lib/Image/ExifTool/XMP2.pl +9 -0
  57. data/bin/lib/Image/ExifTool/ZIP.pm +6 -6
  58. data/bin/lib/Image/ExifTool.pm +42 -26
  59. data/bin/lib/Image/ExifTool.pod +76 -71
  60. data/bin/perl-Image-ExifTool.spec +45 -44
  61. data/lib/exiftool_vendored/version.rb +1 -1
  62. metadata +2 -2
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '2.91';
51
+ $VERSION = '2.93';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -268,6 +268,24 @@ my %timeInfo = (
268
268
  PrintConvInv => '$self->InverseDateTime($val)',
269
269
  # (can't put Groups here because they aren't constant!)
270
270
  );
271
+ # properties for ISO 8601 format date/time tags
272
+ my %iso8601Date = (
273
+ Shift => 'Time',
274
+ ValueConv => q{
275
+ require Image::ExifTool::XMP;
276
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
277
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
278
+ return $val;
279
+ },
280
+ ValueConvInv => q{
281
+ require Image::ExifTool::XMP;
282
+ my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
283
+ ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
284
+ return $val;
285
+ },
286
+ PrintConv => '$self->ConvertDateTime($val)',
287
+ PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
288
+ );
271
289
  # information for duration tags
272
290
  my %durationInfo = (
273
291
  ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
@@ -645,6 +663,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
645
663
  Deletable => 1,
646
664
  SubDirectory => {
647
665
  TagTable => 'Image::ExifTool::Jpeg2000::Main',
666
+ DirName => 'JUMBF',
648
667
  # 16 bytes uuid
649
668
  # +4 bytes 0
650
669
  # +9 bytes "manifest\0"
@@ -1574,22 +1593,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1574
1593
  "\xa9day" => {
1575
1594
  Name => 'ContentCreateDate',
1576
1595
  Groups => { 2 => 'Time' },
1577
- Shift => 'Time',
1578
- # handle values in the form "2010-02-12T13:27:14-0800" (written by Apple iPhone)
1579
- ValueConv => q{
1580
- require Image::ExifTool::XMP;
1581
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
1582
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
1583
- return $val;
1584
- },
1585
- ValueConvInv => q{
1586
- require Image::ExifTool::XMP;
1587
- my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
1588
- ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
1589
- return $val;
1590
- },
1591
- PrintConv => '$self->ConvertDateTime($val)',
1592
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
1596
+ %iso8601Date,
1593
1597
  },
1594
1598
  "\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
1595
1599
  "\xa9alb" => 'Album', #PH (iTunes 8.0.2)
@@ -1873,21 +1877,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1873
1877
  Apple Photos has been reported to show a crazy date/time for some MP4 files
1874
1878
  containing this tag, but perhaps only if it is missing a time zone
1875
1879
  }, #forum10690/11125
1876
- Shift => 'Time',
1877
- ValueConv => q{
1878
- require Image::ExifTool::XMP;
1879
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
1880
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
1881
- return $val;
1882
- },
1883
- ValueConvInv => q{
1884
- require Image::ExifTool::XMP;
1885
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
1886
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
1887
- return $val;
1888
- },
1889
- PrintConv => '$self->ConvertDateTime($val)',
1890
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
1880
+ %iso8601Date,
1891
1881
  },
1892
1882
  manu => { # (SX280)
1893
1883
  Name => 'Make',
@@ -2310,23 +2300,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2310
2300
  symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
2311
2301
  },
2312
2302
  Groups => { 2 => 'Time' },
2313
- Shift => 'Time',
2314
2303
  Avoid => 1,
2315
2304
  # handle values in the form "2010-02-12T13:27:14-0800"
2316
- ValueConv => q{
2317
- require Image::ExifTool::XMP;
2318
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
2319
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
2320
- return $val;
2321
- },
2322
- ValueConvInv => q{
2323
- require Image::ExifTool::XMP;
2324
- my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
2325
- ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
2326
- return $val;
2327
- },
2328
- PrintConv => '$self->ConvertDateTime($val)',
2329
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
2305
+ %iso8601Date,
2330
2306
  },
2331
2307
  '@xyz' => { #PH (iPhone 3GS)
2332
2308
  Name => 'GPSCoordinates',
@@ -3339,22 +3315,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
3339
3315
  "\xa9day" => {
3340
3316
  Name => 'ContentCreateDate',
3341
3317
  Groups => { 2 => 'Time' },
3342
- Shift => 'Time',
3343
- # handle values in the form "2010-02-12T13:27:14-0800"
3344
- ValueConv => q{
3345
- require Image::ExifTool::XMP;
3346
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
3347
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
3348
- return $val;
3349
- },
3350
- ValueConvInv => q{
3351
- require Image::ExifTool::XMP;
3352
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
3353
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
3354
- return $val;
3355
- },
3356
- PrintConv => '$self->ConvertDateTime($val)',
3357
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
3318
+ %iso8601Date,
3358
3319
  },
3359
3320
  "\xa9des" => 'Description', #4
3360
3321
  "\xa9enc" => 'EncodedBy', #10
@@ -6403,12 +6364,10 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6403
6364
  ValueConvInv => '$val * 1000',
6404
6365
  PrintConv => 'ConvertDuration($val)',
6405
6366
  PrintConvInv => q{
6406
- $val =~ s/ s$//;
6407
- my @a = split /(:| days )/, $val;
6408
- my $sign = ($val =~ s/^-//) ? -1 : 1;
6409
- $a[0] += shift(@a) * 24 if @a == 4;
6410
- $a[0] += shift(@a) * 60 while @a > 1;
6411
- return $a[0] * $sign;
6367
+ my $sign = ($val =~ s/^-//) ? -1 : 1;
6368
+ my @a = $val =~ /(\d+(?:\.\d+)?)/g;
6369
+ unshift @a, 0 while @a < 4;
6370
+ return $sign * (((($a[0] * 24) + $a[1]) * 60 + $a[2]) * 60 + $a[3]);
6412
6371
  },
6413
6372
  },
6414
6373
 
@@ -6522,21 +6481,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6522
6481
  creationdate=> {
6523
6482
  Name => 'CreationDate',
6524
6483
  Groups => { 2 => 'Time' },
6525
- Shift => 'Time',
6526
- ValueConv => q{
6527
- require Image::ExifTool::XMP;
6528
- $val = Image::ExifTool::XMP::ConvertXMPDate($val,1);
6529
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
6530
- return $val;
6531
- },
6532
- ValueConvInv => q{
6533
- require Image::ExifTool::XMP;
6534
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
6535
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
6536
- return $val;
6537
- },
6538
- PrintConv => '$self->ConvertDateTime($val)',
6539
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
6484
+ %iso8601Date,
6540
6485
  },
6541
6486
  description => { },
6542
6487
  director => { },
@@ -6586,21 +6531,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6586
6531
  'location.date' => {
6587
6532
  Name => 'LocationDate',
6588
6533
  Groups => { 2 => 'Time' },
6589
- Shift => 'Time',
6590
- ValueConv => q{
6591
- require Image::ExifTool::XMP;
6592
- $val = Image::ExifTool::XMP::ConvertXMPDate($val);
6593
- $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
6594
- return $val;
6595
- },
6596
- ValueConvInv => q{
6597
- require Image::ExifTool::XMP;
6598
- $val = Image::ExifTool::XMP::FormatXMPDate($val);
6599
- $val =~ s/([-+]\d{2}):(\d{2})$/$1$2/; # remove time zone colon
6600
- return $val;
6601
- },
6602
- PrintConv => '$self->ConvertDateTime($val)',
6603
- PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
6534
+ %iso8601Date,
6604
6535
  },
6605
6536
  'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' },
6606
6537
  'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' },
@@ -6693,6 +6624,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6693
6624
  'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
6694
6625
  # (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
6695
6626
  'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
6627
+ # the following tags generated by ShutterEncoder when "preserve metadata" is selected (forum15610)
6628
+ major_brand => { Name => 'MajorBrand', Avoid => 1 },
6629
+ minor_version => { Name => 'MinorVersion', Avoid => 1 },
6630
+ compatible_brands => { Name => 'CompatibleBrands', Avoid => 1 },
6631
+ creation_time => {
6632
+ Name => 'CreationTime',
6633
+ Groups => { 2 => 'Time' },
6634
+ Avoid => 1,
6635
+ %iso8601Date,
6636
+ },
6696
6637
  #
6697
6638
  # seen in Apple ProRes RAW file
6698
6639
  #
@@ -6708,13 +6649,6 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6708
6649
  # (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
6709
6650
  # (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
6710
6651
  # (mdta)com.apple.proapps.image.{TIFF}.Software (eg. "9.0")
6711
- #
6712
- # also seen (but don't yet add support for these)
6713
- #
6714
- # (mdta)major_brand
6715
- # (mdta)minor_version
6716
- # (mdta)compatible_brands
6717
- # (mdta)creation_time
6718
6652
  );
6719
6653
 
6720
6654
  # iTunes info ('----') atoms
@@ -9373,7 +9307,7 @@ sub ProcessMOV($$;$)
9373
9307
  }
9374
9308
  # more convenient to package data as a RandomAccess file
9375
9309
  unless ($raf) {
9376
- $raf = new File::RandomAccess($dataPt);
9310
+ $raf = File::RandomAccess->new($dataPt);
9377
9311
  $dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen};
9378
9312
  }
9379
9313
  # skip leading bytes if necessary
@@ -848,11 +848,11 @@ sub FoundSomething($$;$$)
848
848
  #------------------------------------------------------------------------------
849
849
  # Approximate GPSDateTime value from sample time and CreateDate
850
850
  # Inputs: 0) ExifTool ref, 1) tag table ptr, 2) sample time (s)
851
- # 3) true if CreateDate is at end of video
851
+ # 3) true if CreateDate is at end of video, 4) flag if CreateDate is UTC
852
852
  # Notes: Uses ExifTool CreateDateAtEnd as flag to subtract video duration
853
- sub SetGPSDateTime($$$)
853
+ sub SetGPSDateTime($$$;$)
854
854
  {
855
- my ($et, $tagTbl, $sampleTime) = @_;
855
+ my ($et, $tagTbl, $sampleTime, $isUTC) = @_;
856
856
  my $value = $$et{VALUE};
857
857
  if (defined $sampleTime and $$value{CreateDate}) {
858
858
  $sampleTime += $$value{CreateDate}; # adjust sample time to seconds since the epoch
@@ -863,7 +863,9 @@ sub SetGPSDateTime($$$)
863
863
  } else {
864
864
  $et->WarnOnce('Approximating GPSDateTime as CreateDate + SampleTime', 1);
865
865
  }
866
- unless ($et->Options('QuickTimeUTC')) {
866
+ my $utc = $et->Options('QuickTimeUTC');
867
+ $utc = $isUTC unless defined $utc; # (allow QuickTimeUTC=0 to override $isUTC default)
868
+ unless ($utc) {
867
869
  my $tzOff = $$et{tzOff}; # use previously calculated offset
868
870
  unless (defined $tzOff) {
869
871
  # adjust to UTC, assuming time is local
@@ -1344,7 +1346,7 @@ Sample: for ($i=0; ; ) {
1344
1346
  $et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000);
1345
1347
  $et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000);
1346
1348
  $et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph);
1347
- SetGPSDateTime($et, $tagTbl, $time[$i]);
1349
+ SetGPSDateTime($et, $tagTbl, $time[$i], 1);
1348
1350
  next; # all done (don't store/process as text)
1349
1351
  }
1350
1352
  unless (defined $val) {
@@ -2454,7 +2456,7 @@ sub ProcessLIGO_JSON($$$)
2454
2456
  $et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
2455
2457
  while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
2456
2458
  my $json = $1;
2457
- my $raf = new File::RandomAccess(\$json);
2459
+ my $raf = File::RandomAccess->new(\$json);
2458
2460
  my %dbase;
2459
2461
  Image::ExifTool::Import::ReadJSON($raf, \%dbase);
2460
2462
  my $info = $dbase{'*'} or next;
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.09';
17
+ $VERSION = '1.10';
18
18
 
19
19
  sub ProcessRSRC($$);
20
20
 
@@ -70,7 +70,7 @@ sub ProcessRSRC($$)
70
70
  my ($hdr, $map, $buff, $i, $j);
71
71
 
72
72
  # allow access with data reference
73
- $raf or $raf = new File::RandomAccess($$dirInfo{DataPt});
73
+ $raf or $raf = File::RandomAccess->new($$dirInfo{DataPt});
74
74
 
75
75
  # attempt to validate the format as thoroughly as practical
76
76
  return 0 unless $raf->Read($hdr, 30) == 30;
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.55';
25
+ $VERSION = '1.56';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
@@ -1546,7 +1546,7 @@ sub ProcessSamsung($$$)
1546
1546
  my ($buff, $buf2, $index, $offsetPos, $audioNOff, $audioSize);
1547
1547
 
1548
1548
  unless ($raf) {
1549
- $raf = new File::RandomAccess($$dirInfo{DataPt});
1549
+ $raf = File::RandomAccess->new($$dirInfo{DataPt});
1550
1550
  $et->VerboseDir('SamsungTrailer');
1551
1551
  }
1552
1552
  return 0 unless $raf->Seek(-6-$offset, 2) and $raf->Read($buff, 6) == 6 and
@@ -1675,7 +1675,7 @@ SamBlock:
1675
1675
  # add a fixup so the calling routine can apply further shifts if necessary
1676
1676
  require Image::ExifTool::Fixup;
1677
1677
  my $fixup = $$dirInfo{Fixup};
1678
- $fixup or $fixup = $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
1678
+ $fixup or $fixup = $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
1679
1679
  $fixup->AddFixup(length($buff) - $offsetPos);
1680
1680
  $fixup->AddFixup(length($buff) - $offsetPos + 4);
1681
1681
  }
@@ -1697,7 +1697,7 @@ sub WriteSTMN($$$)
1697
1697
  {
1698
1698
  my ($et, $dirInfo, $tagTablePtr) = @_;
1699
1699
  # create a Fixup for the PreviewImage
1700
- $$dirInfo{Fixup} = new Image::ExifTool::Fixup;
1700
+ $$dirInfo{Fixup} = Image::ExifTool::Fixup->new;
1701
1701
  my $val = Image::ExifTool::WriteBinaryData($et, $dirInfo, $tagTablePtr);
1702
1702
  # force PreviewImage into the trailer even if it fits in EXIF segment
1703
1703
  $$et{PREVIEW_INFO}{IsTrailer} = 1 if $$et{PREVIEW_INFO};
@@ -361,7 +361,7 @@ sub ShiftTime($;$$$)
361
361
  };
362
362
  # not a problem if we failed here since we'll just try again next time,
363
363
  # so don't return error message
364
- unless (@$) {
364
+ unless ($@) {
365
365
  my $mode;
366
366
  if (defined $time[0]) {
367
367
  $mode = defined $time[3] ? 'DateTime' : 'Date';
@@ -403,7 +403,6 @@ sub ShiftTime($;$$$)
403
403
  };
404
404
  $@ and return CleanWarning($@);
405
405
  $tm += $$shiftOffset{$mode}; # apply the shift
406
- $tm < 0 and return 'Shift results in negative time';
407
406
  # save fractional seconds in shifted time
408
407
  $frac = $tm - int($tm);
409
408
  if ($frac) {
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::Sigma;
18
18
 
19
- $VERSION = '1.31';
19
+ $VERSION = '1.32';
20
20
 
21
21
  sub ProcessX3FHeader($$$);
22
22
  sub ProcessX3FDirectory($$$);
@@ -460,7 +460,7 @@ sub WriteX3F($$)
460
460
  my $newData;
461
461
  my %jpegInfo = (
462
462
  Parent => 'X3F',
463
- RAF => new File::RandomAccess(\$buff),
463
+ RAF => File::RandomAccess->new(\$buff),
464
464
  OutFile => \$newData,
465
465
  );
466
466
  $$et{FILE_TYPE} = 'JPEG';
@@ -575,7 +575,7 @@ sub ProcessX3FDirectory($$$)
575
575
  if ($$tagInfo{Name} eq 'JpgFromRaw') {
576
576
  my %dirInfo = (
577
577
  Parent => 'X3F',
578
- RAF => new File::RandomAccess(\$buff),
578
+ RAF => File::RandomAccess->new(\$buff),
579
579
  );
580
580
  $$et{BASE} += $offset;
581
581
  $et->ProcessJPEG(\%dirInfo);
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.66';
37
+ $VERSION = '3.67';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -859,7 +859,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
859
859
  # must construct 0x20-byte header which contains length, width and height
860
860
  ValueConvInv => q{
861
861
  return 'none' unless $val;
862
- my $e = new Image::ExifTool;
862
+ my $e = Image::ExifTool->new;
863
863
  my $info = $e->ImageInfo(\$val,'ImageWidth','ImageHeight');
864
864
  return undef unless $$info{ImageWidth} and $$info{ImageHeight};
865
865
  my $size = Set32u($$info{ImageWidth}) . Set32u($$info{ImageHeight});
@@ -11640,7 +11640,7 @@ sub ProcessSR2($$$)
11640
11640
  );
11641
11641
  my $subTable = GetTagTable('Image::ExifTool::Sony::SR2SubIFD');
11642
11642
  if ($outfile) {
11643
- my $fixup = new Image::ExifTool::Fixup;
11643
+ my $fixup = Image::ExifTool::Fixup->new;
11644
11644
  $dirInfo{Fixup} = $fixup;
11645
11645
  $result = $et->WriteDirectory(\%dirInfo, $subTable);
11646
11646
  return undef unless $result;
@@ -15,7 +15,7 @@ use vars qw($VERSION @ISA $makeMissing);
15
15
  use Image::ExifTool qw(:Utils :Vars);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.35';
18
+ $VERSION = '1.36';
19
19
  @ISA = qw(Exporter);
20
20
 
21
21
  # set this to a language code to generate Lang module with 'MISSING' entries
@@ -74,7 +74,7 @@ sub Write(;$$%)
74
74
  {
75
75
  local ($_, *PTIFILE);
76
76
  my ($file, $group, %opts) = @_;
77
- my $et = new Image::ExifTool;
77
+ my $et = Image::ExifTool->new;
78
78
  my ($fp, $tableName, %langInfo, @langs, $defaultLang, @groups);
79
79
  @groups = split ':', $group if $group;
80
80
 
@@ -17,7 +17,7 @@ require Exporter;
17
17
  use vars qw($VERSION @ISA @EXPORT_OK);
18
18
  use Image::ExifTool qw(:Utils);
19
19
 
20
- $VERSION = '1.19';
20
+ $VERSION = '1.20';
21
21
  @ISA = qw(Exporter);
22
22
  @EXPORT_OK = qw(FindTagInfo TagExists);
23
23
 
@@ -1870,6 +1870,7 @@ my %tagLookup = (
1870
1870
  'commanderinternalttlcompgroupb' => { 312 => '22.1', 313 => '28.1' },
1871
1871
  'comment' => { 0 => 0x2, 123 => 'Comment', 160 => 'Comment', 336 => 'Comment', 399 => "\xa9cmt", 401 => 'comment', 407 => "\xa9cmt" },
1872
1872
  'compass' => { 417 => 0x4 },
1873
+ 'compatiblebrands' => { 401 => 'compatible_brands' },
1873
1874
  'compatibleversion' => { 509 => 'CompatibleVersion', 511 => 'CompatibleVersion' },
1874
1875
  'compilation' => { 399 => 'cpil' },
1875
1876
  'compimageimagespersequence' => { 516 => [\'CompositeImageExposureTimes','CompositeImageExposureTimesNumberOfImagesInSequences'] },
@@ -2022,7 +2023,7 @@ my %tagLookup = (
2022
2023
  'crc32' => { 513 => 'crc32' },
2023
2024
  'createdate' => { 122 => 0x9004, 160 => 'CreateDate', 332 => 'CreationDate', 336 => 'create-date', 398 => 'CreationDate', 404 => 0x1, 536 => 'CreateDate' },
2024
2025
  'creationdate' => { 401 => 'creationdate', 525 => 'CreationDate', 528 => 'creationDate' },
2025
- 'creationtime' => { 336 => 'Creation Time' },
2026
+ 'creationtime' => { 336 => 'Creation Time', 401 => 'creation_time' },
2026
2027
  'creativestyle' => { 434 => 0x1a, 435 => 0x18, 445 => 0x41, 448 => 0xb020, 480 => 0x4a },
2027
2028
  'creativestylesetting' => { 436 => 0xf, 453 => 0x7 },
2028
2029
  'creativestylewaschanged' => { 485 => 0x8001 },
@@ -4314,6 +4315,7 @@ my %tagLookup = (
4314
4315
  'mainboardversion' => { 141 => 0x438 },
4315
4316
  'maindialexposurecomp' => { 314 => '0.6' },
4316
4317
  'mainingredient' => { 530 => 'mainIngredient' },
4318
+ 'majorbrand' => { 401 => 'major_brand' },
4317
4319
  'majorversion' => { 500 => 'MajorVersion' },
4318
4320
  'make' => { 101 => 0x0, 118 => 0x1, 122 => 0x10f, 159 => 'Make', 336 => 'Make', 352 => 0x10f, 401 => 'make', 407 => ['@mak',"\xa9mak"], 527 => 'make', 534 => 'Make' },
4319
4321
  'makernote' => { 515 => 'MakerNote' },
@@ -4781,7 +4783,7 @@ my %tagLookup = (
4781
4783
  'minoltaquality' => { 184 => 0x5, 185 => 0xd, 186 => 0x3, 189 => [0x102,0x103] },
4782
4784
  'minoltatime' => { 184 => 0x16 },
4783
4785
  'minormodelagedisclosure' => { 333 => 'MinorModelAgeDisclosure' },
4784
- 'minorversion' => { 500 => 'MinorVersion' },
4786
+ 'minorversion' => { 401 => 'minor_version', 500 => 'MinorVersion' },
4785
4787
  'minsamplevalue' => { 122 => 0x118 },
4786
4788
  'mirrorlockup' => { 85 => 0xc, 86 => 0xc, 87 => 0x60f, 88 => 0xb, 89 => 0xc, 90 => 0x6, 91 => 0x6, 92 => 0xc, 93 => 0x3 },
4787
4789
  'mobilecountrycode' => { 508 => 'mcc' },
@@ -7593,6 +7595,7 @@ my %tagExists = (
7593
7595
  'aeliveviewhistograminfo' => 1,
7594
7596
  'aeliveviewlocalhistogram' => 1,
7595
7597
  'aelocalhistogram' => 1,
7598
+ 'af' => 1,
7596
7599
  'af-cprioritysel' => 1,
7597
7600
  'af-sprioritysel' => 1,
7598
7601
  'afarea' => 1,
@@ -8509,7 +8512,6 @@ my %tagExists = (
8509
8512
  'companymainphone' => 1,
8510
8513
  'companyname' => 1,
8511
8514
  'compatibility' => 1,
8512
- 'compatiblebrands' => 1,
8513
8515
  'compatiblefontname' => 1,
8514
8516
  'complete' => 1,
8515
8517
  'compobj' => 1,
@@ -9041,6 +9043,7 @@ my %tagExists = (
9041
9043
  'editedby' => 1,
9042
9044
  'editor' => 1,
9043
9045
  'edittagarray' => 1,
9046
+ 'ef' => 1,
9044
9047
  'effect' => 1,
9045
9048
  'effectivebw' => 1,
9046
9049
  'effectstrength' => 1,
@@ -9194,6 +9197,7 @@ my %tagExists = (
9194
9197
  'extrasamples' => 1,
9195
9198
  'extraticklocations' => 1,
9196
9199
  'f-stop' => 1,
9200
+ 'f_' => 1,
9197
9201
  'face1birthday' => 1,
9198
9202
  'face1category' => 1,
9199
9203
  'face1name' => 1,
@@ -10361,7 +10365,6 @@ my %tagExists = (
10361
10365
  'mainboard' => 1,
10362
10366
  'maininfo' => 1,
10363
10367
  'maininfoifd' => 1,
10364
- 'majorbrand' => 1,
10365
10368
  'makeandmodel' => 1,
10366
10369
  'makemodel' => 1,
10367
10370
  'makernotepentax5a' => 1,
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
12
12
  =head1 TAG TABLES
13
13
 
14
14
  The tables listed below give the names of all tags recognized by ExifTool.
15
- They contain a total of 27469 tags, with 17233 unique tag names.
15
+ They contain a total of 27474 tags, with 17233 unique tag names.
16
16
 
17
17
  B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
18
18
  table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -25405,10 +25405,13 @@ C2PA (Coalition for Content Provenance and Authenticity) CAI (Content
25405
25405
  Authenticity Initiative) JUMBF (JPEG Universal Metadata Box Format) metdata
25406
25406
  is currently extracted from JPEG, PNG, TIFF-based (eg. TIFF, DNG),
25407
25407
  QuickTime-based (eg. MP4, MOV, HEIF, AVIF), RIFF-based (eg. WAV, AVI, WebP),
25408
- GIF files and ID3v2 metadata. The suggested ExifTool command-line arguments
25409
- for reading C2PA metadata are C<-jumbf:all -G3 -b -j -u -struct>. This
25410
- metadata may be deleted from writable JPEG, PNG, WebP, TIFF-based, and
25411
- QuickTime-based files by deleting the JUMBF group with C<-jumbf:all=>.
25408
+ PDF, SVG and GIF files, and ID3v2 metadata. The suggested ExifTool
25409
+ command-line arguments for reading C2PA metadata are C<-jumbf:all -G3 -b -j
25410
+ -u -struct>. This metadata may be deleted from writable JPEG, PNG, WebP,
25411
+ TIFF-based, and QuickTime-based files by deleting the JUMBF group with
25412
+ C<-jumbf:all=>. The C2PA JUMBF metadata may be extracted as a block via the
25413
+ JUMBF tag. See L<https://c2pa.org/specifications/> for the C2PA
25414
+ specification.
25412
25415
 
25413
25416
  Tag ID Tag Name Writable
25414
25417
  ------ -------- --------
@@ -28532,6 +28535,7 @@ This is the PDF document catalog.
28532
28535
 
28533
28536
  Tag ID Tag Name Writable
28534
28537
  ------ -------- --------
28538
+ 'AF' AF PDF AF
28535
28539
  'AcroForm' AcroForm PDF AcroForm
28536
28540
  'Lang' Language no
28537
28541
  'MarkInfo' MarkInfo PDF MarkInfo
@@ -28542,6 +28546,28 @@ This is the PDF document catalog.
28542
28546
  'Perms' Perms PDF Perms
28543
28547
  'Version' PDFVersion no
28544
28548
 
28549
+ =head3 PDF AF Tags
28550
+
28551
+ Processed only for C2PA information if AFRelationship is "/C2PA_Manifest".
28552
+
28553
+ Tag ID Tag Name Writable
28554
+ ------ -------- --------
28555
+ 'EF' EF PDF EF
28556
+
28557
+ =head3 PDF EF Tags
28558
+
28559
+ Tag ID Tag Name Writable
28560
+ ------ -------- --------
28561
+ 'F' F_ PDF F
28562
+
28563
+ =head3 PDF F Tags
28564
+
28565
+ C2PA JUMBF metadata extracted from "/C2PA_Manifest" file.
28566
+
28567
+ Tag ID Tag Name Writable
28568
+ ------ -------- --------
28569
+ '_stream' JUMBF Jpeg2000
28570
+
28545
28571
  =head3 PDF AcroForm Tags
28546
28572
 
28547
28573
  Tag ID Tag Name Writable
@@ -29481,8 +29507,10 @@ changed via the config file.
29481
29507
  'com.android.version' AndroidVersion yes
29482
29508
  'com.apple.photos.captureMode' CaptureMode yes
29483
29509
  'comment' Comment yes
29510
+ 'compatible_brands' CompatibleBrands yes/
29484
29511
  'content.identifier' ContentIdentifier yes
29485
29512
  'copyright' Copyright yes
29513
+ 'creation_time' CreationTime yes/
29486
29514
  'creationdate' CreationDate yes
29487
29515
  'description' Description yes
29488
29516
  'detected-face' FaceInfo QuickTime FaceInfo
@@ -29514,7 +29542,9 @@ changed via the config file.
29514
29542
  'location.name' LocationName yes
29515
29543
  'location.note' LocationNote yes
29516
29544
  'location.role' LocationRole yes
29545
+ 'major_brand' MajorBrand yes/
29517
29546
  'make' Make yes
29547
+ 'minor_version' MinorVersion yes/
29518
29548
  'model' Model yes
29519
29549
  'player.movie.audio.balance' Balance yes
29520
29550
  'player.movie.audio.bass' Bass yes
@@ -39544,6 +39574,7 @@ FileName.
39544
39574
  JPEGDigest File no
39545
39575
  JPEGImageLength File no
39546
39576
  JPEGQualityEstimate File no
39577
+ JUMBF JUMBF no
39547
39578
  MIMEType File no
39548
39579
  MaxVal File no
39549
39580
  NewGUID ExifTool no
@@ -128,7 +128,7 @@ sub SaveMakerNotes($)
128
128
  delete $$et{MAKER_NOTE_INFO};
129
129
  my $dirEntries = $makerInfo->{Entries};
130
130
  my $numEntries = scalar(keys %$dirEntries);
131
- my $fixup = new Image::ExifTool::Fixup;
131
+ my $fixup = Image::ExifTool::Fixup->new;
132
132
  return unless $numEntries;
133
133
  # build the MakerNotes directory
134
134
  my $makerNotes = Set16u($numEntries);