exiftool_vendored 12.17.1 → 12.32.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 +225 -1
- data/bin/MANIFEST +23 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -43
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/config_files/acdsee.config +193 -6
- data/bin/config_files/convert_regions.config +25 -14
- data/bin/config_files/cuepointlist.config +70 -0
- data/bin/config_files/example.config +2 -9
- data/bin/exiftool +142 -87
- data/bin/fmt_files/gpx.fmt +2 -2
- data/bin/fmt_files/gpx_wpt.fmt +2 -2
- data/bin/fmt_files/kml.fmt +1 -1
- data/bin/fmt_files/kml_track.fmt +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +3 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +30 -12
- data/bin/lib/Image/ExifTool/CBOR.pm +277 -0
- data/bin/lib/Image/ExifTool/Canon.pm +49 -18
- data/bin/lib/Image/ExifTool/DJI.pm +6 -6
- data/bin/lib/Image/ExifTool/DPX.pm +13 -2
- data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
- data/bin/lib/Image/ExifTool/Exif.pm +28 -11
- data/bin/lib/Image/ExifTool/FITS.pm +13 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
- data/bin/lib/Image/ExifTool/FujiFilm.pm +19 -8
- data/bin/lib/Image/ExifTool/GPS.pm +22 -11
- data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
- data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
- data/bin/lib/Image/ExifTool/ID3.pm +15 -3
- data/bin/lib/Image/ExifTool/JPEG.pm +74 -4
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +393 -16
- data/bin/lib/Image/ExifTool/LIF.pm +153 -0
- data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
- data/bin/lib/Image/ExifTool/M2TS.pm +137 -5
- data/bin/lib/Image/ExifTool/MIE.pm +4 -3
- data/bin/lib/Image/ExifTool/MRC.pm +341 -0
- data/bin/lib/Image/ExifTool/MWG.pm +3 -3
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
- data/bin/lib/Image/ExifTool/Nikon.pm +19 -8
- data/bin/lib/Image/ExifTool/NikonSettings.pm +28 -11
- data/bin/lib/Image/ExifTool/Olympus.pm +6 -3
- data/bin/lib/Image/ExifTool/Other.pm +93 -0
- data/bin/lib/Image/ExifTool/PDF.pm +9 -12
- data/bin/lib/Image/ExifTool/PNG.pm +8 -7
- data/bin/lib/Image/ExifTool/Panasonic.pm +28 -3
- data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
- data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
- data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
- data/bin/lib/Image/ExifTool/QuickTime.pm +247 -88
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
- data/bin/lib/Image/ExifTool/README +3 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +89 -12
- data/bin/lib/Image/ExifTool/Samsung.pm +48 -10
- data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
- data/bin/lib/Image/ExifTool/Sony.pm +237 -78
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +4125 -4028
- data/bin/lib/Image/ExifTool/TagNames.pod +644 -286
- data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
- data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +55 -21
- data/bin/lib/Image/ExifTool/WriteXMP.pl +7 -3
- data/bin/lib/Image/ExifTool/Writer.pl +47 -10
- data/bin/lib/Image/ExifTool/XMP.pm +39 -14
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
- data/bin/lib/Image/ExifTool.pm +223 -72
- data/bin/lib/Image/ExifTool.pod +114 -93
- data/bin/perl-Image-ExifTool.spec +43 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +28 -13
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::nl;
|
|
|
11
11
|
use strict;
|
|
12
12
|
use vars qw($VERSION);
|
|
13
13
|
|
|
14
|
-
$VERSION = '1.
|
|
14
|
+
$VERSION = '1.13';
|
|
15
15
|
|
|
16
16
|
%Image::ExifTool::Lang::nl::Translate = (
|
|
17
17
|
'AEBAutoCancel' => {
|
|
@@ -1502,97 +1502,98 @@ $VERSION = '1.12';
|
|
|
1502
1502
|
'GIFVersion' => 'GIF versie',
|
|
1503
1503
|
'GPSAltitude' => 'Hoogte',
|
|
1504
1504
|
'GPSAltitudeRef' => {
|
|
1505
|
-
Description => '
|
|
1505
|
+
Description => 'GPS hoogte - referentie',
|
|
1506
1506
|
PrintConv => {
|
|
1507
|
-
'Above Sea Level' => '
|
|
1508
|
-
'Below Sea Level' => '
|
|
1507
|
+
'Above Sea Level' => 'Boven zeeniveau',
|
|
1508
|
+
'Below Sea Level' => 'Onder zeeniveau',
|
|
1509
1509
|
},
|
|
1510
1510
|
},
|
|
1511
|
-
'GPSAreaInformation' => '
|
|
1512
|
-
'GPSDOP' => '
|
|
1513
|
-
'GPSDateStamp' => 'GPS datum',
|
|
1514
|
-
'GPSDateTime' => 'GPS tijd
|
|
1515
|
-
'GPSDestBearing' => '
|
|
1511
|
+
'GPSAreaInformation' => 'GPS naam van het gebied',
|
|
1512
|
+
'GPSDOP' => 'GPS meetnauwkeurigheid',
|
|
1513
|
+
'GPSDateStamp' => 'GPS UTC datum',
|
|
1514
|
+
'GPSDateTime' => 'GPS UTC datum en tijd',
|
|
1515
|
+
'GPSDestBearing' => 'GPS peiling van bestemming',
|
|
1516
1516
|
'GPSDestBearingRef' => {
|
|
1517
|
-
Description => '
|
|
1517
|
+
Description => 'GPS peiling van bestemming - referentie',
|
|
1518
1518
|
PrintConv => {
|
|
1519
|
-
'Magnetic North' => 'Magnetische
|
|
1520
|
-
'True North' => 'Geografische
|
|
1519
|
+
'Magnetic North' => 'Magnetische noorden',
|
|
1520
|
+
'True North' => 'Geografische noorden',
|
|
1521
1521
|
},
|
|
1522
1522
|
},
|
|
1523
|
-
'GPSDestDistance' => '
|
|
1523
|
+
'GPSDestDistance' => 'GPS afstand tot bestemming',
|
|
1524
1524
|
'GPSDestDistanceRef' => {
|
|
1525
|
-
Description => '
|
|
1525
|
+
Description => 'GPS afstand tot bestemming - referentie',
|
|
1526
1526
|
PrintConv => {
|
|
1527
|
-
'Miles' => '
|
|
1528
|
-
'Nautical Miles' => '
|
|
1527
|
+
'Miles' => 'Engelse mijlen',
|
|
1528
|
+
'Nautical Miles' => 'Zeemijlen',
|
|
1529
1529
|
},
|
|
1530
1530
|
},
|
|
1531
|
-
'GPSDestLatitude' => '
|
|
1531
|
+
'GPSDestLatitude' => 'GPS breedtegraad van bestemming',
|
|
1532
1532
|
'GPSDestLatitudeRef' => {
|
|
1533
|
-
Description => '
|
|
1533
|
+
Description => 'GPS breedtegraad van bestemming - referentie',
|
|
1534
1534
|
PrintConv => {
|
|
1535
|
-
'North' => '
|
|
1536
|
-
'South' => '
|
|
1535
|
+
'North' => 'Noorderbreedte',
|
|
1536
|
+
'South' => 'Zuiderbreedte',
|
|
1537
1537
|
},
|
|
1538
1538
|
},
|
|
1539
|
-
'GPSDestLongitude' => '
|
|
1539
|
+
'GPSDestLongitude' => 'GPS lengtegraad van bestemming',
|
|
1540
1540
|
'GPSDestLongitudeRef' => {
|
|
1541
|
-
Description => '
|
|
1541
|
+
Description => 'GPS lengtegraad van bestemming - referentie',
|
|
1542
1542
|
PrintConv => {
|
|
1543
|
-
'East' => '
|
|
1544
|
-
'West' => '
|
|
1543
|
+
'East' => 'Oosterlengte',
|
|
1544
|
+
'West' => 'Westerlengte',
|
|
1545
1545
|
},
|
|
1546
1546
|
},
|
|
1547
1547
|
'GPSDifferential' => {
|
|
1548
1548
|
Description => 'GPS differentiaal correctie',
|
|
1549
1549
|
PrintConv => {
|
|
1550
|
-
'Differential Corrected' => '
|
|
1551
|
-
'No Correction' => '
|
|
1550
|
+
'Differential Corrected' => 'Met differentiaal correctie',
|
|
1551
|
+
'No Correction' => 'Zonder differentiaal correctie',
|
|
1552
1552
|
},
|
|
1553
1553
|
},
|
|
1554
|
-
'GPSImgDirection' => '
|
|
1554
|
+
'GPSImgDirection' => 'GPS peiling van de afbeelding',
|
|
1555
1555
|
'GPSImgDirectionRef' => {
|
|
1556
|
-
Description => '
|
|
1556
|
+
Description => 'GPS peiling van de afbeelding - referentie',
|
|
1557
1557
|
PrintConv => {
|
|
1558
|
-
'Magnetic North' => 'Magnetische
|
|
1559
|
-
'True North' => 'Geografische
|
|
1558
|
+
'Magnetic North' => 'Magnetische noorden',
|
|
1559
|
+
'True North' => 'Geografische noorden',
|
|
1560
1560
|
},
|
|
1561
1561
|
},
|
|
1562
|
-
'GPSInfo' => 'GPS Info
|
|
1563
|
-
'GPSLatitude' => '
|
|
1562
|
+
'GPSInfo' => 'GPS Info',
|
|
1563
|
+
'GPSLatitude' => 'GPS breedtegraad',
|
|
1564
1564
|
'GPSLatitudeRef' => {
|
|
1565
|
-
Description => '
|
|
1565
|
+
Description => 'GPS breedtegraad - referentie',
|
|
1566
1566
|
PrintConv => {
|
|
1567
|
-
'North' => '
|
|
1568
|
-
'South' => '
|
|
1567
|
+
'North' => 'Noorderbreedte',
|
|
1568
|
+
'South' => 'Zuiderbreedte',
|
|
1569
1569
|
},
|
|
1570
1570
|
},
|
|
1571
|
-
'GPSLongitude' => '
|
|
1571
|
+
'GPSLongitude' => 'GPS lengtegraad',
|
|
1572
1572
|
'GPSLongitudeRef' => {
|
|
1573
|
-
Description => '
|
|
1573
|
+
Description => 'GPS lengtegraad - referentie',
|
|
1574
1574
|
PrintConv => {
|
|
1575
|
-
'East' => '
|
|
1576
|
-
'West' => '
|
|
1575
|
+
'East' => 'Oosterlengte',
|
|
1576
|
+
'West' => 'Westerlengte',
|
|
1577
1577
|
},
|
|
1578
1578
|
},
|
|
1579
|
-
'GPSMapDatum' => '
|
|
1579
|
+
'GPSMapDatum' => 'GPS geodetisch datum',
|
|
1580
1580
|
'GPSMeasureMode' => {
|
|
1581
|
-
Description => 'GPS
|
|
1581
|
+
Description => 'GPS meetmethode',
|
|
1582
1582
|
PrintConv => {
|
|
1583
|
-
'2-D' => '
|
|
1584
|
-
'2-Dimensional' => '
|
|
1585
|
-
'2-Dimensional Measurement' => '
|
|
1586
|
-
'3-D' => '
|
|
1587
|
-
'3-Dimensional' => '
|
|
1588
|
-
'3-Dimensional Measurement' => '
|
|
1583
|
+
'2-D' => 'Tweedimensionale meting',
|
|
1584
|
+
'2-Dimensional' => 'Tweedimensionale meting',
|
|
1585
|
+
'2-Dimensional Measurement' => 'Tweedimensionale meting',
|
|
1586
|
+
'3-D' => 'Driedimensionale meting',
|
|
1587
|
+
'3-Dimensional' => 'Driedimensionale meting',
|
|
1588
|
+
'3-Dimensional Measurement' => 'Driedimensionale meting',
|
|
1589
1589
|
},
|
|
1590
1590
|
},
|
|
1591
|
-
'
|
|
1592
|
-
'
|
|
1593
|
-
'
|
|
1591
|
+
'GPSPosition' => 'GPS positie',
|
|
1592
|
+
'GPSProcessingMethod' => 'GPS verwerkingsmethode',
|
|
1593
|
+
'GPSSatellites' => 'GPS satellieten gebruikt voor de meting',
|
|
1594
|
+
'GPSSpeed' => 'GPS ontvanger bewegingssnelheid',
|
|
1594
1595
|
'GPSSpeedRef' => {
|
|
1595
|
-
Description => '
|
|
1596
|
+
Description => 'GPS ontvanger bewegingssnelheid - referentie',
|
|
1596
1597
|
PrintConv => {
|
|
1597
1598
|
'km/h' => 'Kilometer per uur',
|
|
1598
1599
|
'knots' => 'Knopen',
|
|
@@ -1602,20 +1603,20 @@ $VERSION = '1.12';
|
|
|
1602
1603
|
'GPSStatus' => {
|
|
1603
1604
|
Description => 'GPS ontvanger status',
|
|
1604
1605
|
PrintConv => {
|
|
1605
|
-
'Measurement Active' => '
|
|
1606
|
-
'Measurement Void' => '
|
|
1606
|
+
'Measurement Active' => 'Actuele meting beschikbaar',
|
|
1607
|
+
'Measurement Void' => 'Actuele meting niet beschikbaar',
|
|
1607
1608
|
},
|
|
1608
1609
|
},
|
|
1609
|
-
'GPSTimeStamp' => 'GPS tijd
|
|
1610
|
-
'GPSTrack' => '
|
|
1610
|
+
'GPSTimeStamp' => 'GPS UTC tijd',
|
|
1611
|
+
'GPSTrack' => 'GPS ontvanger bewegingsrichting',
|
|
1611
1612
|
'GPSTrackRef' => {
|
|
1612
|
-
Description => '
|
|
1613
|
+
Description => 'GPS ontvanger bewegingsrichting - referentie',
|
|
1613
1614
|
PrintConv => {
|
|
1614
|
-
'Magnetic North' => 'Magnetische
|
|
1615
|
-
'True North' => '
|
|
1615
|
+
'Magnetic North' => 'Magnetische noorden',
|
|
1616
|
+
'True North' => 'Geografische noorden',
|
|
1616
1617
|
},
|
|
1617
1618
|
},
|
|
1618
|
-
'GPSVersionID' => 'GPS
|
|
1619
|
+
'GPSVersionID' => 'GPS versie ID',
|
|
1619
1620
|
'GainControl' => {
|
|
1620
1621
|
Description => 'Belichtingsversterking',
|
|
1621
1622
|
PrintConv => {
|
|
@@ -31,7 +31,7 @@ use strict;
|
|
|
31
31
|
use vars qw($VERSION);
|
|
32
32
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
33
33
|
|
|
34
|
-
$VERSION = '1.
|
|
34
|
+
$VERSION = '1.21';
|
|
35
35
|
|
|
36
36
|
# program map table "stream_type" lookup (ref 6/1)
|
|
37
37
|
my %streamType = (
|
|
@@ -57,7 +57,8 @@ my %streamType = (
|
|
|
57
57
|
0x13 => 'ISO 14496-1 SL-packetized',
|
|
58
58
|
0x14 => 'ISO 13818-6 Synchronized Download Protocol',
|
|
59
59
|
# 0x15-0x7F => 'ISO 13818-1 Reserved',
|
|
60
|
-
0x1b => 'H.264 Video',
|
|
60
|
+
0x1b => 'H.264 (AVC) Video',
|
|
61
|
+
0x24 => 'H.265 (HEVC) Video', #PH
|
|
61
62
|
0x80 => 'DigiCipher II Video',
|
|
62
63
|
0x81 => 'A52/AC-3 Audio',
|
|
63
64
|
0x82 => 'HDMV DTS Audio',
|
|
@@ -67,6 +68,7 @@ my %streamType = (
|
|
|
67
68
|
0x86 => 'DTS-HD Audio',
|
|
68
69
|
0x87 => 'E-AC-3 Audio',
|
|
69
70
|
0x8a => 'DTS Audio',
|
|
71
|
+
0x90 => 'PGS Audio', #https://www.avsforum.com/threads/bass-eq-for-filtered-movies.2995212/page-399
|
|
70
72
|
0x91 => 'A52b/AC-3 Audio',
|
|
71
73
|
0x92 => 'DVD_SPU vls Subtitle',
|
|
72
74
|
0x94 => 'SDDS Audio',
|
|
@@ -111,6 +113,8 @@ my %noSyntax = (
|
|
|
111
113
|
0xff => 1, # program_stream_directory
|
|
112
114
|
);
|
|
113
115
|
|
|
116
|
+
my $knotsToKph = 1.852; # knots --> km/h
|
|
117
|
+
|
|
114
118
|
# information extracted from the MPEG-2 transport stream
|
|
115
119
|
%Image::ExifTool::M2TS::Main = (
|
|
116
120
|
GROUPS => { 2 => 'Video' },
|
|
@@ -299,6 +303,116 @@ sub ParsePID($$$$$)
|
|
|
299
303
|
} elsif ($type == 0x81 or $type == 0x87 or $type == 0x91) {
|
|
300
304
|
# AC-3 audio
|
|
301
305
|
ParseAC3Audio($et, $dataPt);
|
|
306
|
+
} elsif ($type < 0) {
|
|
307
|
+
if ($$dataPt =~ /^(.{164})?(.{24})A[NS][EW]/s) {
|
|
308
|
+
# (Blueskysea B4K, Novatek NT96670)
|
|
309
|
+
# 0000: 01 00 ff 00 30 31 32 33 34 35 37 38 61 62 63 64 [....01234578abcd]
|
|
310
|
+
# 0010: 65 66 67 0a 00 00 00 00 00 00 00 00 00 00 00 00 [efg.............]
|
|
311
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
312
|
+
# 0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
313
|
+
# 0040: 00 00 00 00 30 31 32 33 34 35 37 38 71 77 65 72 [....01234578qwer]
|
|
314
|
+
# 0050: 74 79 75 69 6f 70 0a 00 00 00 00 00 00 00 00 00 [tyuiop..........]
|
|
315
|
+
# 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
316
|
+
# 0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
317
|
+
# 0080: 00 00 00 00 63 38 61 61 32 35 63 66 34 35 65 65 [....c8aa25cf45ee]
|
|
318
|
+
# 0090: 61 39 65 32 34 34 32 66 61 65 62 35 65 30 39 39 [a9e2442faeb5e099]
|
|
319
|
+
# 00a0: 30 37 64 34 15 00 00 00 10 00 00 00 1b 00 00 00 [07d4............]
|
|
320
|
+
# 00b0: 15 00 00 00 01 00 00 00 09 00 00 00 41 4e 57 00 [............ANW.]
|
|
321
|
+
# 00c0: 82 9a 57 45 98 b2 00 46 66 66 e4 41 d7 e3 14 43 [..WE...Fff.A...C]
|
|
322
|
+
# 00d0: 01 00 02 00 03 00 04 00 05 00 06 00 [............]
|
|
323
|
+
# (Viofo A119V3)
|
|
324
|
+
# 0000: 08 00 00 00 07 00 00 00 18 00 00 00 15 00 00 00 [................]
|
|
325
|
+
# 0010: 03 00 00 00 0b 00 00 00 41 4e 45 00 01 f2 ac 45 [........ANE....E]
|
|
326
|
+
# 0020: 2d 7f 6e 45 b8 1e 97 41 d7 23 46 43 00 00 00 00 [-.nE...A.#FC....]
|
|
327
|
+
# pad with dummy header and parse with existing FreeGPS code (minimum 92 bytes)
|
|
328
|
+
my $dat = ("\0" x 16) . substr($$dataPt, length($1 || '')) . ("\0" x 20);
|
|
329
|
+
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
330
|
+
Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl);
|
|
331
|
+
$more = 1;
|
|
332
|
+
} elsif ($$dataPt =~ /^A([NS])([EW])\0/s) {
|
|
333
|
+
# INNOVV TS video (same format is INNOVV MP4)
|
|
334
|
+
SetByteOrder('II');
|
|
335
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
336
|
+
while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
|
|
337
|
+
my $dat = $1;
|
|
338
|
+
my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
|
|
339
|
+
my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
|
|
340
|
+
my $spd = GetFloat(\$dat, 12) * $knotsToKph;
|
|
341
|
+
my $trk = GetFloat(\$dat, 16);
|
|
342
|
+
my @acc = unpack('x20V3', $dat);
|
|
343
|
+
map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
|
|
344
|
+
Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
|
|
345
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
346
|
+
$et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
|
|
347
|
+
$et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
|
|
348
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
|
349
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
350
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
351
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
352
|
+
$et->HandleTag($tagTbl, Accelerometer => "@acc");
|
|
353
|
+
}
|
|
354
|
+
SetByteOrder('MM');
|
|
355
|
+
$more = 1;
|
|
356
|
+
} elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
|
|
357
|
+
# $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
|
|
358
|
+
# $GSNRINFO,0.01,0.04,0.25\0
|
|
359
|
+
$$dataPt =~ tr/\x0d/\x0a/;
|
|
360
|
+
$$dataPt =~ tr/\0//d;
|
|
361
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
362
|
+
my @lines = split /\x0a/, $$dataPt;
|
|
363
|
+
my ($line, $lastTime);
|
|
364
|
+
foreach $line (@lines) {
|
|
365
|
+
if ($line =~ /^\$GPSINFO/) {
|
|
366
|
+
my @a = split /,/, $lines[0];
|
|
367
|
+
next unless @a > 7;
|
|
368
|
+
# ignore duplicate fixes
|
|
369
|
+
next if $lastTime and $a[2] eq $lastTime;
|
|
370
|
+
$lastTime = $a[2];
|
|
371
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
372
|
+
$a[2] =~ tr/./:/;
|
|
373
|
+
# (untested, and probably doesn't work for S/W hemispheres)
|
|
374
|
+
my ($lat, $lon) = @a[3,4];
|
|
375
|
+
Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
|
|
376
|
+
# $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010'
|
|
377
|
+
$et->HandleTag($tagTbl, GPSDateTime => $a[2]);
|
|
378
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
379
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
380
|
+
$et->HandleTag($tagTbl, GPSSpeed => $a[5]);
|
|
381
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
382
|
+
# $a[6] - values: 48-60
|
|
383
|
+
$et->HandleTag($tagTbl, GPSTrack => $a[7]);
|
|
384
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
385
|
+
# #a[8,9] - always 0
|
|
386
|
+
} elsif ($line =~ /^\$GSNRINFO/) {
|
|
387
|
+
my @a = split /,/, $line;
|
|
388
|
+
shift @a;
|
|
389
|
+
$et->HandleTag($tagTbl, Accelerometer => "@a");
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
$more = 1;
|
|
393
|
+
} elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) {
|
|
394
|
+
#forum11320
|
|
395
|
+
SetByteOrder('II');
|
|
396
|
+
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
397
|
+
my $lat = abs(GetFloat($dataPt, 48)); # (abs just to be safe)
|
|
398
|
+
my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe)
|
|
399
|
+
my $spd = GetFloat($dataPt, 64);
|
|
400
|
+
my $trk = GetFloat($dataPt, 68);
|
|
401
|
+
$et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
|
|
402
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
403
|
+
my @date = unpack('x32V3x28V3', $$dataPt);
|
|
404
|
+
$date[3] += 2000;
|
|
405
|
+
$et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date[3..5,0..2]));
|
|
406
|
+
$et->HandleTag($tagTbl, GPSLatitude => abs($lat) * ($1 eq 'S' ? -1 : 1));
|
|
407
|
+
$et->HandleTag($tagTbl, GPSLongitude => abs($lon) * ($2 eq 'W' ? -1 : 1));
|
|
408
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
|
409
|
+
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
410
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
411
|
+
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
412
|
+
SetByteOrder('MM');
|
|
413
|
+
$more = 1;
|
|
414
|
+
}
|
|
415
|
+
delete $$et{DOC_NUM};
|
|
302
416
|
}
|
|
303
417
|
return $more;
|
|
304
418
|
}
|
|
@@ -350,8 +464,23 @@ sub ProcessM2TS($$)
|
|
|
350
464
|
);
|
|
351
465
|
my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
|
|
352
466
|
my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
|
|
467
|
+
# PID's that may contain GPS info
|
|
468
|
+
my %gpsPID = (
|
|
469
|
+
0x0300 => 1, # Novatek INNOVV
|
|
470
|
+
0x01e4 => 1, # vsys a6l dashcam
|
|
471
|
+
);
|
|
353
472
|
my $pEnd = 0;
|
|
354
473
|
|
|
474
|
+
# scan entire file for GPS programs if ExtractEmbedded option is 3 or higher
|
|
475
|
+
# (some dashcams write these programs but don't include it in the PMT)
|
|
476
|
+
if (($et->Options('ExtractEmbedded') || 0) > 2) {
|
|
477
|
+
foreach (keys %gpsPID) {
|
|
478
|
+
$needPID{$_} = 1;
|
|
479
|
+
$pidType{$_} = -1;
|
|
480
|
+
$pidName{$_} ='unregistered dashcam GPS';
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
355
484
|
# parse packets from MPEG-2 Transport Stream
|
|
356
485
|
for (;;) {
|
|
357
486
|
|
|
@@ -421,12 +550,11 @@ sub ProcessM2TS($$)
|
|
|
421
550
|
my $adaptation_field_exists = $prefix & 0x00000020;
|
|
422
551
|
my $payload_data_exists = $prefix & 0x00000010;
|
|
423
552
|
# my $continuity_counter = $prefix & 0x0000000f;
|
|
424
|
-
|
|
425
553
|
if ($verbose > 1) {
|
|
426
554
|
my $i = ($raf->Tell() - length($buff) + $pEnd) / $pLen - 1;
|
|
427
555
|
print $out "Transport packet $i:\n";
|
|
428
556
|
$et->VerboseDump(\$buff, Len => $pLen, Addr => $i * $pLen, Start => $pos - $prePos);
|
|
429
|
-
my $str = $pidName{$pid} ? " ($pidName{$pid})" : '';
|
|
557
|
+
my $str = $pidName{$pid} ? " ($pidName{$pid})" : ' <not in Program Map Table!>';
|
|
430
558
|
printf $out " Timecode: 0x%.4x\n", Get32u(\$buff, $pos - $prePos) if $pLen == 192;
|
|
431
559
|
printf $out " Packet ID: 0x%.4x$str\n", $pid;
|
|
432
560
|
printf $out " Start Flag: %s\n", $payload_unit_start_indicator ? 'Yes' : 'No';
|
|
@@ -639,7 +767,11 @@ sub ProcessM2TS($$)
|
|
|
639
767
|
}
|
|
640
768
|
$data{$pid} = substr($buff, $pos, $pEnd-$pos);
|
|
641
769
|
} else {
|
|
642
|
-
|
|
770
|
+
unless (defined $data{$pid}) {
|
|
771
|
+
# (vsys a6l dashcam GPS record doesn't have a start indicator)
|
|
772
|
+
next unless $gpsPID{$pid};
|
|
773
|
+
$data{$pid} = '';
|
|
774
|
+
}
|
|
643
775
|
# accumulate data for each elementary stream
|
|
644
776
|
$data{$pid} .= substr($buff, $pos, $pEnd-$pos);
|
|
645
777
|
}
|
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
14
14
|
use Image::ExifTool::Exif;
|
|
15
15
|
use Image::ExifTool::GPS;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.49';
|
|
18
18
|
|
|
19
19
|
sub ProcessMIE($$);
|
|
20
20
|
sub ProcessMIEGroup($$$);
|
|
@@ -393,7 +393,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
393
393
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
394
394
|
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
|
|
395
395
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
|
396
|
-
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
396
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
|
|
397
397
|
},
|
|
398
398
|
Longitude => {
|
|
399
399
|
Name => 'GPSLongitude',
|
|
@@ -406,7 +406,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
406
406
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
407
407
|
ValueConvInv => 'Image::ExifTool::GPS::ToDMS($self, $val, 0)',
|
|
408
408
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
|
409
|
-
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
|
|
409
|
+
PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
|
|
410
410
|
},
|
|
411
411
|
MeasureMode => {
|
|
412
412
|
Name => 'GPSMeasureMode',
|
|
@@ -1023,6 +1023,7 @@ sub WriteMIEGroup($$$)
|
|
|
1023
1023
|
# we are writing the new tag now
|
|
1024
1024
|
my ($newVal, $writable, $oldVal, $newFormat, $compress);
|
|
1025
1025
|
my $newTag = shift @editTags;
|
|
1026
|
+
length($newTag) > 255 and $et->Warn('Tag name too long'), next; # (just to be safe)
|
|
1026
1027
|
my $newInfo = $$editDirs{$newTag};
|
|
1027
1028
|
if ($newInfo) {
|
|
1028
1029
|
# create the new subdirectory or rewrite existing non-MIE directory
|