exiftool-vendored.exe 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.
- package/bin/exiftool_files/Changes +94 -6
- package/bin/exiftool_files/README +46 -45
- package/bin/exiftool_files/config_files/example.config +10 -2
- package/bin/exiftool_files/exiftool.pl +138 -87
- package/bin/exiftool_files/lib/File/RandomAccess.pm +31 -5
- package/bin/exiftool_files/lib/File/RandomAccess.pod +4 -4
- package/bin/exiftool_files/lib/Image/ExifTool/7Z.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/AFCP.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/BZZ.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -7
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +17 -13
- package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +8 -2
- package/bin/exiftool_files/lib/Image/ExifTool/DICOM.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +4 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +54 -5
- package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Fixup.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +8 -3
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +237 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +4 -4
- package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +7 -4
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +9 -6
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +11 -11
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +51 -12
- package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +19 -4
- package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +4 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +59 -9
- package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +223 -117
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +260 -242
- package/bin/exiftool_files/lib/Image/ExifTool/RSRC.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +4 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Shift.pl +1 -2
- package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +85 -8
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +148 -8
- package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +26 -23
- package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +15 -2
- package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +4 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +77 -52
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +9 -0
- package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +6 -6
- package/bin/exiftool_files/lib/Image/ExifTool.pm +204 -63
- package/bin/exiftool_files/lib/Image/ExifTool.pod +118 -94
- package/package.json +5 -5
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|