exiftool_vendored 12.18.0 → 12.33.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +236 -4
- 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 +152 -97
- 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 +31 -13
- data/bin/lib/Image/ExifTool/CBOR.pm +331 -0
- data/bin/lib/Image/ExifTool/Canon.pm +44 -19
- 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 +124 -13
- 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 +30 -5
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +395 -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 +3 -3
- data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
- data/bin/lib/Image/ExifTool/Nikon.pm +18 -5
- data/bin/lib/Image/ExifTool/NikonSettings.pm +19 -2
- data/bin/lib/Image/ExifTool/Olympus.pm +10 -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 +234 -75
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
- data/bin/lib/Image/ExifTool/README +5 -2
- 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 +230 -69
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +4145 -4029
- data/bin/lib/Image/ExifTool/TagNames.pod +671 -287
- 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 +45 -15
- data/bin/lib/Image/ExifTool/XMP2.pl +3 -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 +233 -81
- 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
|