exiftool_vendored 13.04.0 → 13.06.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.
- checksums.yaml +4 -4
- data/bin/Changes +22 -0
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +27 -21
- data/bin/lib/Image/ExifTool/DJI.pm +90 -28
- data/bin/lib/Image/ExifTool/Geolocation.pm +2 -1
- data/bin/lib/Image/ExifTool/GoPro.pm +3 -3
- data/bin/lib/Image/ExifTool/JPEG.pm +19 -4
- data/bin/lib/Image/ExifTool/Protobuf.pm +242 -0
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +66 -25
- data/bin/lib/Image/ExifTool/Sony.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +2336 -2324
- data/bin/lib/Image/ExifTool/TagNames.pod +61 -2
- data/bin/lib/Image/ExifTool/Writer.pl +1 -1
- data/bin/lib/Image/ExifTool/XMP.pm +11 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +38 -0
- data/bin/lib/Image/ExifTool.pm +54 -28
- data/bin/lib/Image/ExifTool.pod +7 -6
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -109,7 +109,7 @@ my %insvLimit = (
|
|
109
109
|
The tags below are extracted from timed metadata in QuickTime and other
|
110
110
|
formats of video files when the ExtractEmbedded option is used. Although
|
111
111
|
most of these tags are combined into the single table below, ExifTool
|
112
|
-
currently reads
|
112
|
+
currently reads 85 different formats of timed GPS metadata from video files.
|
113
113
|
},
|
114
114
|
VARS => { NO_ID => 1 },
|
115
115
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -339,10 +339,16 @@ my %insvLimit = (
|
|
339
339
|
Groups => { 2 => 'Preview' },
|
340
340
|
RawConv => '$self->ValidateImage(\$val,$tag)',
|
341
341
|
},
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
342
|
+
djmd => { # (DJI AC003 Osmo Action 4 cam)
|
343
|
+
Name => 'DJIMetadata',
|
344
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Protobuf' },
|
345
|
+
},
|
346
|
+
dbgi => { # (DJI AC003 Osmo Action 4 cam)
|
347
|
+
Name => 'DJIDebug',
|
348
|
+
Unknown => 2,
|
349
|
+
Notes => 'extracted only if Unknown option is 2 or greater',
|
350
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Protobuf' },
|
351
|
+
},
|
346
352
|
Unknown00 => { Unknown => 1 },
|
347
353
|
Unknown01 => { Unknown => 1 },
|
348
354
|
Unknown02 => { Unknown => 1 },
|
@@ -894,7 +900,7 @@ sub FoundSomething($$;$$)
|
|
894
900
|
#------------------------------------------------------------------------------
|
895
901
|
# Approximate GPSDateTime value from sample time and CreateDate
|
896
902
|
# Inputs: 0) ExifTool ref, 1) tag table ptr, 2) sample time (s)
|
897
|
-
# 3) true if CreateDate is
|
903
|
+
# 3) true if CreateDate is UTC
|
898
904
|
# Notes: Uses ExifTool CreateDateAtEnd as flag to subtract video duration
|
899
905
|
sub SetGPSDateTime($$$;$)
|
900
906
|
{
|
@@ -1432,7 +1438,7 @@ Sample: for ($i=0; ; ) {
|
|
1432
1438
|
|
1433
1439
|
if ($$tagTbl{$metaFormat}) {
|
1434
1440
|
my $tagInfo = $et->GetTagInfo($tagTbl, $metaFormat, \$buff);
|
1435
|
-
if ($tagInfo) {
|
1441
|
+
if ($tagInfo and (not $$tagInfo{Unknown} or $$et{OPTIONS}{Unknown} >= $$tagInfo{Unknown})) {
|
1436
1442
|
FoundSomething($et, $tagTbl, $time[$i], $dur[$i]);
|
1437
1443
|
$$et{ee} = $ee; # need ee information for 'keys'
|
1438
1444
|
$et->HandleTag($tagTbl, $metaFormat, undef,
|
@@ -1442,6 +1448,15 @@ Sample: for ($i=0; ; ) {
|
|
1442
1448
|
TagInfo => $tagInfo,
|
1443
1449
|
);
|
1444
1450
|
delete $$et{ee};
|
1451
|
+
# synthesize GPSDateTime if necessary for djmd metadata
|
1452
|
+
if ($metaFormat eq 'djmd') {
|
1453
|
+
if (defined $$et{GPSLatitude} and defined $$et{GPSLongitude} and not $$et{GPSDateTime}) {
|
1454
|
+
SetGPSDateTime($et, $tagTbl, $time[$i], 1); # (NC)
|
1455
|
+
}
|
1456
|
+
delete $$et{GPSLatitude};
|
1457
|
+
delete $$et{GPSLongitude};
|
1458
|
+
delete $$et{GPSDateTime};
|
1459
|
+
}
|
1445
1460
|
} elsif ($metaFormat eq 'camm' and $buff =~ /^X/) {
|
1446
1461
|
# seen 'camm' metadata in this format (X/Y/Z acceleration and G force? + GPRMC + ?)
|
1447
1462
|
# "X0000.0000Y0000.0000Z0000.0000G0000.0000$GPRMC,000125,V,,,,,000.0,,280908,002.1,N*71~, 794021 \x0a"
|
@@ -1670,7 +1685,7 @@ sub ProcessFreeGPS($$$)
|
|
1670
1685
|
}
|
1671
1686
|
if ($notEnc and $notStr) {
|
1672
1687
|
|
1673
|
-
$debug and $et->FoundTag(GPSType =>
|
1688
|
+
$debug and $et->FoundTag(GPSType => 3);
|
1674
1689
|
# decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format)
|
1675
1690
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1676
1691
|
# 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........]
|
@@ -1698,7 +1713,7 @@ sub ProcessFreeGPS($$$)
|
|
1698
1713
|
|
1699
1714
|
} else {
|
1700
1715
|
|
1701
|
-
$debug and $et->FoundTag(GPSType =>
|
1716
|
+
$debug and $et->FoundTag(GPSType => 4);
|
1702
1717
|
# decode freeGPS from E-ACE B44 dashcam
|
1703
1718
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
1704
1719
|
# 0010: 08 00 00 00 22 00 00 00 01 00 00 00 18 00 00 00 [...."...........]
|
@@ -1735,7 +1750,7 @@ sub ProcessFreeGPS($$$)
|
|
1735
1750
|
|
1736
1751
|
} elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
|
1737
1752
|
|
1738
|
-
$debug and $et->FoundTag(GPSType =>
|
1753
|
+
$debug and $et->FoundTag(GPSType => 5);
|
1739
1754
|
# also decode 'gpmd' chunk from Kingslim D4 dashcam videos
|
1740
1755
|
# 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................]
|
1741
1756
|
# 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E]
|
@@ -1762,7 +1777,7 @@ sub ProcessFreeGPS($$$)
|
|
1762
1777
|
|
1763
1778
|
} elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) {
|
1764
1779
|
|
1765
|
-
$debug and $et->FoundTag(GPSType =>
|
1780
|
+
$debug and $et->FoundTag(GPSType => 6);
|
1766
1781
|
# decode freeGPS from Akaso dashcam
|
1767
1782
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 60 00 00 00 [....freeGPS `...]
|
1768
1783
|
# 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
|
@@ -1796,7 +1811,7 @@ sub ProcessFreeGPS($$$)
|
|
1796
1811
|
|
1797
1812
|
} elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
|
1798
1813
|
|
1799
|
-
$debug and $et->FoundTag(GPSType =>
|
1814
|
+
$debug and $et->FoundTag(GPSType => 7);
|
1800
1815
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....]
|
1801
1816
|
# 0010: 5a 58 53 42 4e 58 59 53 00 00 00 00 00 00 00 00 [ZXSBNXYS........]
|
1802
1817
|
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
@@ -1817,7 +1832,7 @@ sub ProcessFreeGPS($$$)
|
|
1817
1832
|
|
1818
1833
|
} elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
|
1819
1834
|
|
1820
|
-
$debug and $et->FoundTag(GPSType =>
|
1835
|
+
$debug and $et->FoundTag(GPSType => 8);
|
1821
1836
|
# Akaso V1 dascham
|
1822
1837
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
|
1823
1838
|
# 0010: 59 6e 64 41 6b 61 73 6f 43 61 72 00 00 00 00 00 [YndAkasoCar.....]
|
@@ -1854,7 +1869,7 @@ sub ProcessFreeGPS($$$)
|
|
1854
1869
|
|
1855
1870
|
} elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) {
|
1856
1871
|
|
1857
|
-
$debug and $et->FoundTag(GPSType =>
|
1872
|
+
$debug and $et->FoundTag(GPSType => 9);
|
1858
1873
|
# EACHPAI dash cam
|
1859
1874
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 ac 00 00 00 [....freeGPS ....]
|
1860
1875
|
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
@@ -1878,7 +1893,7 @@ sub ProcessFreeGPS($$$)
|
|
1878
1893
|
|
1879
1894
|
} elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
|
1880
1895
|
|
1881
|
-
$debug and $et->FoundTag(GPSType =>
|
1896
|
+
$debug and $et->FoundTag(GPSType => 10);
|
1882
1897
|
# Vantrue S1 dashcam
|
1883
1898
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
|
1884
1899
|
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
@@ -1904,7 +1919,7 @@ sub ProcessFreeGPS($$$)
|
|
1904
1919
|
|
1905
1920
|
} elsif (substr($$dataPt,0x45,3) eq 'ATC') {
|
1906
1921
|
|
1907
|
-
$debug and $et->FoundTag(GPSType =>
|
1922
|
+
$debug and $et->FoundTag(GPSType => 11);
|
1908
1923
|
# header looks like this: (sample 1)
|
1909
1924
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 38 06 00 00 [....freeGPS 8...]
|
1910
1925
|
# 0010: 49 51 53 32 30 31 33 30 33 30 36 42 00 00 00 00 [IQS20130306B....]
|
@@ -2017,7 +2032,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2017
2032
|
|
2018
2033
|
} elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s and $dirLen >= 0x88) {
|
2019
2034
|
|
2020
|
-
$debug and $et->FoundTag(GPSType =>
|
2035
|
+
$debug and $et->FoundTag(GPSType => 12);
|
2021
2036
|
# header looks like this in my sample:
|
2022
2037
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 08 01 00 00 [....freeGPS ....]
|
2023
2038
|
# 0010: 32 30 31 33 30 38 31 35 2e 30 31 00 00 00 00 00 [20130815.01.....]
|
@@ -2048,9 +2063,9 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2048
2063
|
|
2049
2064
|
} elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) {
|
2050
2065
|
|
2051
|
-
$debug and $et->FoundTag(GPSType =>
|
2066
|
+
$debug and $et->FoundTag(GPSType => 13);
|
2052
2067
|
# INNOVV MP4 video (same format as INNOVV TS)
|
2053
|
-
while ($$dataPt =~ /(A[NS][EW]\0.{28})/
|
2068
|
+
while ($$dataPt =~ /(A[NS][EW]\0.{28})/sg) {
|
2054
2069
|
my $dat = $1;
|
2055
2070
|
$lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
|
2056
2071
|
$lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
|
@@ -2068,9 +2083,35 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2068
2083
|
SetByteOrder($oldOrder);
|
2069
2084
|
return 1;
|
2070
2085
|
|
2086
|
+
} elsif ($$dataPt =~ /^.{24}A([NS])([EW])/s) {
|
2087
|
+
|
2088
|
+
$debug and $et->FoundTag(GPSType => 14);
|
2089
|
+
# XBHT motorcycle dashcam Model XB702
|
2090
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
2091
|
+
# 0010: 00 17 05 11 0d 25 18 00 41 4e 45 64 83 3f 00 00 [.....%..ANEd.?..]
|
2092
|
+
# 0020: 44 3d c5 02 48 6d ff 07 df 03 00 00 6b 00 00 00 [D=..Hm......k...]
|
2093
|
+
# 0030: 00 00 00 00 00 17 05 11 0d 25 18 01 41 4e 45 64 [.........%..ANEd]
|
2094
|
+
# 0040: 8b 3f 00 00 30 3d c5 02 50 6d ff 07 df 03 00 00 [.?..0=..Pm......]
|
2095
|
+
while ($$dataPt =~ /(.{8}A[NS][EW].{25})/sg) {
|
2096
|
+
my $dat = $1;
|
2097
|
+
my ($yr,$mon,$day,$hr,$min,$sec,$ss,$latRef,$lonRef,$lat,$lon,$spd) =
|
2098
|
+
unpack('xC7xCCx5VVx4v', $dat);
|
2099
|
+
$yr += 2000; $lat /= 1e4; $lon /= 1e4;
|
2100
|
+
$ss = 0 if $ss > 9; # (just in case)
|
2101
|
+
ConvertLatLon($lat, $lon);
|
2102
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
2103
|
+
my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%d',$yr,$mon,$day,$hr,$min,$sec,$ss);
|
2104
|
+
$et->HandleTag($tagTbl, GPSDateTime => $time);
|
2105
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
2106
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
|
2107
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
2108
|
+
}
|
2109
|
+
SetByteOrder($oldOrder);
|
2110
|
+
return 1;
|
2111
|
+
|
2071
2112
|
} elsif ($$dataPt =~ /^.{28}A.{11}([NS]).{15}([EW])/s) {
|
2072
2113
|
|
2073
|
-
$debug and $et->FoundTag(GPSType =>
|
2114
|
+
$debug and $et->FoundTag(GPSType => 15);
|
2074
2115
|
# Vantrue N4 dashcam
|
2075
2116
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
|
2076
2117
|
# 0010: 0d 00 00 00 16 00 00 00 1e 00 00 00 41 00 00 00 [............A...]
|
@@ -2127,7 +2168,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2127
2168
|
($hr,$min,$sec,$yr,$mon,$day,$stat,$latRef,$lonRef) =
|
2128
2169
|
unpack('x48V6a1a1a1x1V4', $$dataPt);
|
2129
2170
|
if (substr($$dataPt, 16, 3) eq 'IQS') {
|
2130
|
-
$debug and $et->FoundTag(GPSType =>
|
2171
|
+
$debug and $et->FoundTag(GPSType => 16);
|
2131
2172
|
# Type 3b (ref PH)
|
2132
2173
|
# header looks like this in my sample:
|
2133
2174
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
@@ -2139,7 +2180,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2139
2180
|
$spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
|
2140
2181
|
$alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
|
2141
2182
|
} else {
|
2142
|
-
$debug and $et->FoundTag(GPSType =>
|
2183
|
+
$debug and $et->FoundTag(GPSType => 17);
|
2143
2184
|
$lat = GetFloat($dataPt, 0x4c);
|
2144
2185
|
$lon = GetFloat($dataPt, 0x50);
|
2145
2186
|
$spd = GetFloat($dataPt, 0x54) * $knotsToKph;
|
@@ -2159,7 +2200,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2159
2200
|
|
2160
2201
|
} elsif ($$dataPt =~ m<^.{23}(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2}) [N|S]>s) {
|
2161
2202
|
|
2162
|
-
$debug and $et->FoundTag(GPSType =>
|
2203
|
+
$debug and $et->FoundTag(GPSType => 18);
|
2163
2204
|
# XGODY 12" 4K Dashcam
|
2164
2205
|
# 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
|
2165
2206
|
# 0010: 6e 6f 72 6d 61 6c 3a 32 30 32 34 2f 30 35 2f 32 [normal:2024/05/2]
|
@@ -2191,7 +2232,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2191
2232
|
|
2192
2233
|
} elsif ($$dataPt =~ m/^.{30}A.{20}VV/) {
|
2193
2234
|
|
2194
|
-
$debug and $et->FoundTag(GPSType =>
|
2235
|
+
$debug and $et->FoundTag(GPSType => 19);
|
2195
2236
|
# 70mai A810 dashcam (note: no timestamps in the samples I have)
|
2196
2237
|
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 ed 01 00 00 [..@.freeGPS ....]
|
2197
2238
|
# 0010: 03 00 ed 01 00 00 00 0f 00 00 70 08 00 00 41 66 [..........p...Af]
|
@@ -2208,7 +2249,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2208
2249
|
|
2209
2250
|
} else {
|
2210
2251
|
|
2211
|
-
$debug and $et->FoundTag(GPSType =>
|
2252
|
+
$debug and $et->FoundTag(GPSType => 20);
|
2212
2253
|
# (look for binary GPS as stored by Nextbase 512G, ref PH)
|
2213
2254
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
|
2214
2255
|
# 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
|
@@ -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.
|
37
|
+
$VERSION = '3.71';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -2166,6 +2166,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2166
2166
|
397 => 'ILCE-7CM2', #JR
|
2167
2167
|
398 => 'ILX-LR1', #JR
|
2168
2168
|
399 => 'ZV-E10M2', #JR
|
2169
|
+
400 => 'ILCE-1M2', #PH
|
2169
2170
|
},
|
2170
2171
|
},
|
2171
2172
|
0xb020 => { #2
|