exiftool_vendored 12.73.0 → 12.75.0

Sign up to get free protection for your applications and to get access to all the features.
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);