exiftool-vendored.pl 12.73.0 → 12.78.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 (70) hide show
  1. package/bin/Changes +94 -6
  2. package/bin/MANIFEST +4 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +46 -45
  6. package/bin/config_files/example.config +10 -2
  7. package/bin/exiftool +143 -94
  8. package/bin/lib/File/RandomAccess.pm +31 -5
  9. package/bin/lib/File/RandomAccess.pod +4 -4
  10. package/bin/lib/Image/ExifTool/7Z.pm +3 -3
  11. package/bin/lib/Image/ExifTool/AFCP.pm +2 -2
  12. package/bin/lib/Image/ExifTool/BZZ.pm +2 -2
  13. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
  14. package/bin/lib/Image/ExifTool/Canon.pm +17 -13
  15. package/bin/lib/Image/ExifTool/CanonVRD.pm +8 -2
  16. package/bin/lib/Image/ExifTool/DICOM.pm +2 -2
  17. package/bin/lib/Image/ExifTool/DNG.pm +4 -4
  18. package/bin/lib/Image/ExifTool/Exif.pm +54 -5
  19. package/bin/lib/Image/ExifTool/FLIR.pm +2 -2
  20. package/bin/lib/Image/ExifTool/Fixup.pm +3 -3
  21. package/bin/lib/Image/ExifTool/FlashPix.pm +3 -3
  22. package/bin/lib/Image/ExifTool/FujiFilm.pm +8 -3
  23. package/bin/lib/Image/ExifTool/GPS.pm +5 -3
  24. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  25. package/bin/lib/Image/ExifTool/Geolocation.pm +237 -0
  26. package/bin/lib/Image/ExifTool/Geotag.pm +4 -4
  27. package/bin/lib/Image/ExifTool/HtmlDump.pm +7 -4
  28. package/bin/lib/Image/ExifTool/ID3.pm +2 -2
  29. package/bin/lib/Image/ExifTool/Import.pm +9 -6
  30. package/bin/lib/Image/ExifTool/JSON.pm +11 -11
  31. package/bin/lib/Image/ExifTool/Jpeg2000.pm +51 -12
  32. package/bin/lib/Image/ExifTool/MIE.pm +3 -3
  33. package/bin/lib/Image/ExifTool/MWG.pm +1 -0
  34. package/bin/lib/Image/ExifTool/MacOS.pm +19 -4
  35. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  36. package/bin/lib/Image/ExifTool/Nikon.pm +5 -3
  37. package/bin/lib/Image/ExifTool/NikonCustom.pm +3 -3
  38. package/bin/lib/Image/ExifTool/Ogg.pm +4 -3
  39. package/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  40. package/bin/lib/Image/ExifTool/PDF.pm +59 -9
  41. package/bin/lib/Image/ExifTool/PLIST.pm +3 -3
  42. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
  43. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  44. package/bin/lib/Image/ExifTool/PhaseOne.pm +2 -2
  45. package/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  46. package/bin/lib/Image/ExifTool/PostScript.pm +2 -2
  47. package/bin/lib/Image/ExifTool/QuickTime.pm +223 -117
  48. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +260 -242
  49. package/bin/lib/Image/ExifTool/RSRC.pm +2 -2
  50. package/bin/lib/Image/ExifTool/Samsung.pm +4 -4
  51. package/bin/lib/Image/ExifTool/Shift.pl +1 -2
  52. package/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -3
  53. package/bin/lib/Image/ExifTool/Sony.pm +3 -3
  54. package/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  55. package/bin/lib/Image/ExifTool/TagLookup.pm +85 -8
  56. package/bin/lib/Image/ExifTool/TagNames.pod +148 -8
  57. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  58. package/bin/lib/Image/ExifTool/WriteExif.pl +26 -23
  59. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  60. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +15 -2
  61. package/bin/lib/Image/ExifTool/WriteXMP.pl +4 -2
  62. package/bin/lib/Image/ExifTool/Writer.pl +77 -52
  63. package/bin/lib/Image/ExifTool/XMP.pm +2 -1
  64. package/bin/lib/Image/ExifTool/XMP2.pl +9 -0
  65. package/bin/lib/Image/ExifTool/ZIP.pm +6 -6
  66. package/bin/lib/Image/ExifTool.pm +204 -63
  67. package/bin/lib/Image/ExifTool.pod +118 -94
  68. package/bin/perl-Image-ExifTool.spec +45 -44
  69. package/bin/pp_build_exe.args +4 -230
  70. package/package.json +4 -4
@@ -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.94';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -58,11 +58,14 @@ sub ProcessEncodingParams($$$);
58
58
  sub ProcessSampleDesc($$$);
59
59
  sub ProcessHybrid($$$);
60
60
  sub ProcessRights($$$);
61
+ sub ProcessNextbase($$$);
61
62
  # ++vvvvvvvvvvvv++ (in QuickTimeStream.pl)
62
63
  sub Process_mebx($$$);
63
64
  sub Process_3gf($$$);
64
65
  sub Process_gps0($$$);
65
66
  sub Process_gsen($$$);
67
+ sub Process_gdat($$$);
68
+ sub Process_nbmt($$$);
66
69
  sub ProcessKenwood($$$);
67
70
  sub ProcessLIGO_JSON($$$);
68
71
  sub ProcessRIFFTrailer($$$);
@@ -88,6 +91,7 @@ sub UnpackLang($;$);
88
91
  sub WriteKeys($$$);
89
92
  sub WriteQuickTime($$$);
90
93
  sub WriteMOV($$);
94
+ sub WriteNextbase($$$);
91
95
  sub GetLangInfo($$);
92
96
  sub CheckQTValue($$$);
93
97
 
@@ -268,6 +272,24 @@ my %timeInfo = (
268
272
  PrintConvInv => '$self->InverseDateTime($val)',
269
273
  # (can't put Groups here because they aren't constant!)
270
274
  );
275
+ # properties for ISO 8601 format date/time tags
276
+ my %iso8601Date = (
277
+ Shift => 'Time',
278
+ ValueConv => q{
279
+ require Image::ExifTool::XMP;
280
+ $val = Image::ExifTool::XMP::ConvertXMPDate($val);
281
+ $val =~ s/([-+]\d{2})(\d{2})$/$1:$2/; # add colon to timezone if necessary
282
+ return $val;
283
+ },
284
+ ValueConvInv => q{
285
+ require Image::ExifTool::XMP;
286
+ my $tmp = Image::ExifTool::XMP::FormatXMPDate($val);
287
+ ($val = $tmp) =~ s/([-+]\d{2}):(\d{2})$/$1$2/ if defined $tmp; # remove time zone colon
288
+ return $val;
289
+ },
290
+ PrintConv => '$self->ConvertDateTime($val)',
291
+ PrintConvInv => '$self->InverseDateTime($val,1)', # (add time zone if it didn't exist)
292
+ );
271
293
  # information for duration tags
272
294
  my %durationInfo = (
273
295
  ValueConv => '$$self{TimeScale} ? $val / $$self{TimeScale} : $val',
@@ -638,6 +660,14 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
638
660
  Name => 'SensorData', # sensor data for the 360Fly
639
661
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
640
662
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
663
+ },{
664
+ Name => 'SensorData',
665
+ Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
666
+ Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
667
+ RawConv => q{
668
+ $self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3);
669
+ return \$val;
670
+ },
641
671
  },
642
672
  { #https://c2pa.org/specifications/
643
673
  Name => 'JUMBF',
@@ -645,6 +675,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
645
675
  Deletable => 1,
646
676
  SubDirectory => {
647
677
  TagTable => 'Image::ExifTool::Jpeg2000::Main',
678
+ DirName => 'JUMBF',
648
679
  # 16 bytes uuid
649
680
  # +4 bytes 0
650
681
  # +9 bytes "manifest\0"
@@ -666,18 +697,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
666
697
  Start => 27,
667
698
  },
668
699
  },
669
- {
670
- Name => 'SensorData',
671
- Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
672
- Notes => 'raw 360Fly sensor data without ExtractEmbedded option',
673
- RawConv => q{
674
- $self->WarnOnce('Use the ExtractEmbedded option to decode timed SensorData',3);
675
- return \$val;
676
- },
677
- },
678
700
  { #PH (Canon CR3)
679
701
  Name => 'PreviewImage',
680
- Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16/',
702
+ Condition => '$$valPt=~/^\xea\xf4\x2b\x5e\x1c\x98\x4b\x88\xb9\xfb\xb7\xdc\x40\x6e\x4d\x16.{32}/s',
681
703
  Groups => { 2 => 'Preview' },
682
704
  PreservePadding => 1,
683
705
  # 0x00 - undef[16]: UUID
@@ -692,6 +714,25 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
692
714
  # 0x3c - int32u: preview length
693
715
  RawConv => '$val = substr($val, 0x30); $self->ValidateImage(\$val, $tag)',
694
716
  },
717
+ { #PH (Garmin MP4)
718
+ Name => 'ThumbnailImage',
719
+ Condition => '$$valPt=~/^\x11\x6e\x40\xdc\xb1\x86\x46\xe4\x84\x7c\xd9\xc0\xc3\x49\x10\x81.{8}\xff\xd8\xff/s',
720
+ Groups => { 2 => 'Preview' },
721
+ Binary => 1,
722
+ # 0x00 - undef[16]: UUID
723
+ # 0x10 - int32u[2]: ThumbnailLength
724
+ # 0x14 - int16u[2]: width/height of image (160/120)
725
+ RawConv => q{
726
+ my $len = Get32u(\$val, 0x10);
727
+ return undef unless length($val) >= $len + 0x18;
728
+ return substr($val, 0x18, $len);
729
+ },
730
+ },
731
+ # also seen 120-byte record in Garmin MP4's, starting like this (model name at byte 9):
732
+ # 0000: 47 52 4d 4e 00 00 00 01 00 44 43 35 37 00 00 00 [GRMN.....DC57...]
733
+ # 0000: 47 52 4d 4e 00 00 00 01 00 44 43 36 36 57 00 00 [GRMN.....DC66W..]
734
+ # and this in Garmin, followed by 8 bytes of 0's:
735
+ # 0000: db 11 98 3d 8f 65 43 8c bb b8 e1 ac 56 fe 6b 04
695
736
  { #8
696
737
  Name => 'UUID-Unknown',
697
738
  %unknownInfo,
@@ -816,6 +857,20 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
816
857
  },
817
858
  # gpsa - seen hex "01 20 00 00" (DuDuBell M1, VSYS M6L)
818
859
  # gsea - 20 bytes hex "05 00's..." (DuDuBell M1) "05 08 02 01 ..." (VSYS M6L)
860
+ gdat => { # Base64-encoded JSON-format timed GPS (Nextbase software)
861
+ Name => 'GPSData',
862
+ SubDirectory => {
863
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
864
+ ProcessProc => \&Process_gdat,
865
+ },
866
+ },
867
+ nbmt => { # (Nextbase)
868
+ Name => 'NextbaseMeta',
869
+ SubDirectory => {
870
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
871
+ ProcessProc => \&Process_nbmt,
872
+ },
873
+ },
819
874
  'GPS ' => { # GPS data written by 70mai dashcam (parsed in QuickTimeStream.pl)
820
875
  Name => 'GPSDataList2',
821
876
  Unknown => 1,
@@ -1574,22 +1629,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1574
1629
  "\xa9day" => {
1575
1630
  Name => 'ContentCreateDate',
1576
1631
  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)
1632
+ %iso8601Date,
1593
1633
  },
1594
1634
  "\xa9ART" => 'Artist', #PH (iTunes 8.0.2)
1595
1635
  "\xa9alb" => 'Album', #PH (iTunes 8.0.2)
@@ -1873,21 +1913,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1873
1913
  Apple Photos has been reported to show a crazy date/time for some MP4 files
1874
1914
  containing this tag, but perhaps only if it is missing a time zone
1875
1915
  }, #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)
1916
+ %iso8601Date,
1891
1917
  },
1892
1918
  manu => { # (SX280)
1893
1919
  Name => 'Make',
@@ -2100,8 +2126,21 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2100
2126
  Condition => '$$valPt =~ /^VIRBactioncamera/',
2101
2127
  RawConv => 'substr($val, 16)',
2102
2128
  RawConvInv => '"VIRBactioncamera$val"',
2129
+ },{
2130
+ Name => 'GarminModel', # (NC)
2131
+ Condition => '$$valPt =~ /^\xf7\x6c\xd7\x6a\x07\x5b\x4a\x1e\xb3\x1c\x0e\x7f\xab\x7e\x09\xd4/',
2132
+ Writable => 0,
2133
+ RawConv => q{
2134
+ return undef unless length($val) > 25;
2135
+ my $len = unpack('x24C', $val);
2136
+ return undef unless length($val) >= 25 + $len;
2137
+ return substr($val, 25, $len);
2138
+ },
2103
2139
  },{
2104
2140
  # have seen "28 f3 11 e2 b7 91 4f 6f 94 e2 4f 5d ea cb 3c 01" for RicohThetaZ1 accelerometer RADT data (not yet decoded)
2141
+ # also seen in Garmin MP4:
2142
+ # 51 0b 63 46 6c fd 4a 17 87 42 ea c9 ea ae b3 bd - seems to contain a duplicate of the trak atom
2143
+ # b3 e8 21 f4 fe 33 4e 10 8f 92 f5 e1 d4 36 c9 8a - 8 bytes of zeros
2105
2144
  Name => 'UUID-Unknown',
2106
2145
  Writable => 0,
2107
2146
  %unknownInfo,
@@ -2310,23 +2349,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2310
2349
  symbol in these tag ID's for the Ricoh Theta Z1 and maybe other models
2311
2350
  },
2312
2351
  Groups => { 2 => 'Time' },
2313
- Shift => 'Time',
2314
2352
  Avoid => 1,
2315
2353
  # 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)
2354
+ %iso8601Date,
2330
2355
  },
2331
2356
  '@xyz' => { #PH (iPhone 3GS)
2332
2357
  Name => 'GPSCoordinates',
@@ -2423,6 +2448,30 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2423
2448
  Groups => { 2 => 'Preview' },
2424
2449
  Binary => 1,
2425
2450
  },
2451
+ # ---- Nextbase ----
2452
+ info => 'FirmwareVersion',
2453
+ 'time' => {
2454
+ Name => 'TimeStamp',
2455
+ Format => 'int32u', # (followed by 4 unknown bytes 00 0d 00 00)
2456
+ Writable => 0,
2457
+ Groups => { 2 => 'Time' },
2458
+ ValueConv => '$val =~ s/ .*//; ConvertUnixTime($val)',
2459
+ PrintConv => '$self->ConvertDateTime($val)',
2460
+ },
2461
+ infi => {
2462
+ Name => 'CameraInfo',
2463
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Nextbase' },
2464
+ },
2465
+ finm => {
2466
+ Name => 'OriginalFileName',
2467
+ Writable => 0,
2468
+ },
2469
+ # AMBA ? - (133 bytes)
2470
+ # nbpl ? - "FP-433-KC"
2471
+ nbpl => { Name => 'Unknown_nbpl', Unknown => 1, Hidden => 1 },
2472
+ # maca ? - b8 2d 28 15 f1 48
2473
+ # sern ? - 0d 69 42 74
2474
+ # nbid ? - 0d 69 42 74 65 df 72 65 03 de c0 fb 01 01 00 00
2426
2475
  # ---- Unknown ----
2427
2476
  # CDET - 128 bytes (unknown origin)
2428
2477
  # mtyp - 4 bytes all zero (some drone video)
@@ -3339,22 +3388,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
3339
3388
  "\xa9day" => {
3340
3389
  Name => 'ContentCreateDate',
3341
3390
  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)
3391
+ %iso8601Date,
3358
3392
  },
3359
3393
  "\xa9des" => 'Description', #4
3360
3394
  "\xa9enc" => 'EncodedBy', #10
@@ -6403,12 +6437,10 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6403
6437
  ValueConvInv => '$val * 1000',
6404
6438
  PrintConv => 'ConvertDuration($val)',
6405
6439
  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;
6440
+ my $sign = ($val =~ s/^-//) ? -1 : 1;
6441
+ my @a = $val =~ /(\d+(?:\.\d+)?)/g;
6442
+ unshift @a, 0 while @a < 4;
6443
+ return $sign * (((($a[0] * 24) + $a[1]) * 60 + $a[2]) * 60 + $a[3]);
6412
6444
  },
6413
6445
  },
6414
6446
 
@@ -6522,21 +6554,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6522
6554
  creationdate=> {
6523
6555
  Name => 'CreationDate',
6524
6556
  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)
6557
+ %iso8601Date,
6540
6558
  },
6541
6559
  description => { },
6542
6560
  director => { },
@@ -6586,21 +6604,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6586
6604
  'location.date' => {
6587
6605
  Name => 'LocationDate',
6588
6606
  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)
6607
+ %iso8601Date,
6604
6608
  },
6605
6609
  'location.accuracy.horizontal' => { Name => 'LocationAccuracyHorizontal' },
6606
6610
  'live-photo.auto' => { Name => 'LivePhotoAuto', Writable => 'int8u' },
@@ -6693,6 +6697,16 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6693
6697
  'detected-face.roll-angle' => { Name => 'DetectedFaceRollAngle', Writable => 0 },
6694
6698
  # (fiel)com.apple.quicktime.detected-face.yaw-angle (dtyp=23, float)
6695
6699
  'detected-face.yaw-angle' => { Name => 'DetectedFaceYawAngle', Writable => 0 },
6700
+ # the following tags generated by ShutterEncoder when "preserve metadata" is selected (forum15610)
6701
+ major_brand => { Name => 'MajorBrand', Avoid => 1 },
6702
+ minor_version => { Name => 'MinorVersion', Avoid => 1 },
6703
+ compatible_brands => { Name => 'CompatibleBrands', Avoid => 1 },
6704
+ creation_time => {
6705
+ Name => 'CreationTime',
6706
+ Groups => { 2 => 'Time' },
6707
+ Avoid => 1,
6708
+ %iso8601Date,
6709
+ },
6696
6710
  #
6697
6711
  # seen in Apple ProRes RAW file
6698
6712
  #
@@ -6708,13 +6722,6 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6708
6722
  # (mdta)com.apple.proapps.image.{TIFF}.Make (eg. "Atmos")
6709
6723
  # (mdta)com.apple.proapps.image.{TIFF}.Model (eg. "ShogunInferno")
6710
6724
  # (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
6725
  );
6719
6726
 
6720
6727
  # iTunes info ('----') atoms
@@ -8153,6 +8160,88 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
8153
8160
  },
8154
8161
  );
8155
8162
 
8163
+ # Nextbase tags (ref PH)
8164
+ %Image::ExifTool::QuickTime::Nextbase = (
8165
+ GROUPS => { 1 => 'Nextbase', 2 => 'Camera' },
8166
+ PROCESS_PROC => \&ProcessNextbase,
8167
+ WRITE_PROC => \&WriteNextbase,
8168
+ VARS => { LONG_TAGS => 3 },
8169
+ NOTES => q{
8170
+ Tags found in 'infi' atom from some Nextbase videos. As well as these tags,
8171
+ other existing tags are also extracted. These tags are not currently
8172
+ writable but they may all be removed by deleting the Nextbase group.
8173
+ },
8174
+ 'Wi-Fi SSID' => { },
8175
+ 'Wi-Fi Password' => { },
8176
+ 'Wi-Fi MAC Address' => { },
8177
+ 'Model' => { },
8178
+ 'Firmware' => { },
8179
+ 'Serial No' => { Name => 'SerialNumber' },
8180
+ 'FCC-ID' => { },
8181
+ 'Battery Status' => { },
8182
+ 'SD Card Manf ID' => { },
8183
+ 'SD Card OEM ID' => { },
8184
+ 'SD Card Model No' => { },
8185
+ 'SD Card Serial No' => { },
8186
+ 'SD Card Manf Date' => { },
8187
+ 'SD Card Type' => { },
8188
+ 'SD Card Used Space' => { },
8189
+ 'SD Card Class' => { },
8190
+ 'SD Card Size' => { },
8191
+ 'SD Card Format' => { },
8192
+ 'Wi-Fi SSID' => { },
8193
+ 'Wi-Fi Password' => { },
8194
+ 'Wi-Fi MAC Address' => { },
8195
+ 'Bluetooth Name' => { },
8196
+ 'Bluetooth MAC Address' => { },
8197
+ 'Resolution' => { },
8198
+ 'Exposure' => { },
8199
+ 'Video Length' => { },
8200
+ 'Audio' => { },
8201
+ 'Time Stamp' => { Name => 'VideoTimeStamp' },
8202
+ 'Speed Stamp' => { },
8203
+ 'GPS Stamp' => { },
8204
+ 'Model Stamp' => { },
8205
+ 'Dual Files' => { },
8206
+ 'Time Lapse' => { },
8207
+ 'Number / License Plate' => { },
8208
+ 'G Sensor' => { },
8209
+ 'Image Stabilisation' => { },
8210
+ 'Extreme Weather Mode' => { },
8211
+ 'Screen Saver' => { },
8212
+ 'Alerts' => { },
8213
+ 'Recording History' => { },
8214
+ 'Parking Mode' => { },
8215
+ 'Language' => { },
8216
+ 'Country' => { },
8217
+ 'Time Zone / DST' => { Groups => { 2 => 'Time' } },
8218
+ 'Time & Date' => { Name => 'TimeAndDate', Groups => { 2 => 'Time' } },
8219
+ 'Speed Units' => { },
8220
+ 'Device Sounds' => { },
8221
+ 'Screen Dimming' => { },
8222
+ 'Auto Power Off' => { },
8223
+ 'Keep User Settings' => { },
8224
+ 'System Info' => { },
8225
+ 'Format SD Card' => { },
8226
+ 'Default Settings' => { },
8227
+ 'Emergency SOS' => { },
8228
+ 'Reversing Camera' => { },
8229
+ 'what3words' => { Name => 'What3Words' },
8230
+ 'MyNextbase - Pairing' => { },
8231
+ 'MyNextbase - Paired Device Name' => { },
8232
+ 'Alexa' => { },
8233
+ 'Alexa - Pairing' => { },
8234
+ 'Alexa - Paired Device Name' => { },
8235
+ 'Alexa - Privacy Mode' => { },
8236
+ 'Alexa - Wake Word Language' => { },
8237
+ 'Firmware Version' => { },
8238
+ 'RTOS' => { },
8239
+ 'Linux' => { },
8240
+ 'NBCD' => { },
8241
+ 'Alexa' => { },
8242
+ '2nd Cam' => { Name => 'SecondCam' },
8243
+ );
8244
+
8156
8245
  # QuickTime composite tags
8157
8246
  %Image::ExifTool::QuickTime::Composite = (
8158
8247
  GROUPS => { 2 => 'Video' },
@@ -9215,6 +9304,23 @@ sub ProcessRights($$$)
9215
9304
  return 1;
9216
9305
  }
9217
9306
 
9307
+ #------------------------------------------------------------------------------
9308
+ # Process Nextbase 'infi' atom (ref PH)
9309
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
9310
+ # Returns: 1 on success
9311
+ sub ProcessNextbase($$$)
9312
+ {
9313
+ my ($et, $dirInfo, $tagTbl) = @_;
9314
+ my $dataPt = $$dirInfo{DataPt};
9315
+ $et->VerboseDir('Nextbase', undef, length($$dataPt));
9316
+ while ($$dataPt =~ /(.*?): +(.*)\x0d/g) {
9317
+ my ($id, $val) = ($1, $2);
9318
+ $$tagTbl{$id} or AddTagToTable($tagTbl, $id, { Name => Image::ExifTool::MakeTagName($id) });
9319
+ $et->HandleTag($tagTbl, $id, $val, Size => length($val));
9320
+ }
9321
+ return 1;
9322
+ }
9323
+
9218
9324
  #------------------------------------------------------------------------------
9219
9325
  # Process iTunes Encoding Params (ref PH)
9220
9326
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -9373,7 +9479,7 @@ sub ProcessMOV($$;$)
9373
9479
  }
9374
9480
  # more convenient to package data as a RandomAccess file
9375
9481
  unless ($raf) {
9376
- $raf = new File::RandomAccess($dataPt);
9482
+ $raf = File::RandomAccess->new($dataPt);
9377
9483
  $dirEnd = $dataPos + $$dirInfo{DirLen} + ($$dirInfo{DirStart} || 0) if $$dirInfo{DirLen};
9378
9484
  }
9379
9485
  # skip leading bytes if necessary