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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +225 -1
  3. data/bin/MANIFEST +23 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -43
  7. data/bin/arg_files/xmp2exif.args +2 -1
  8. data/bin/config_files/acdsee.config +193 -6
  9. data/bin/config_files/convert_regions.config +25 -14
  10. data/bin/config_files/cuepointlist.config +70 -0
  11. data/bin/config_files/example.config +2 -9
  12. data/bin/exiftool +142 -87
  13. data/bin/fmt_files/gpx.fmt +2 -2
  14. data/bin/fmt_files/gpx_wpt.fmt +2 -2
  15. data/bin/fmt_files/kml.fmt +1 -1
  16. data/bin/fmt_files/kml_track.fmt +1 -1
  17. data/bin/lib/Image/ExifTool/Apple.pm +3 -2
  18. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +30 -12
  19. data/bin/lib/Image/ExifTool/CBOR.pm +277 -0
  20. data/bin/lib/Image/ExifTool/Canon.pm +49 -18
  21. data/bin/lib/Image/ExifTool/DJI.pm +6 -6
  22. data/bin/lib/Image/ExifTool/DPX.pm +13 -2
  23. data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
  24. data/bin/lib/Image/ExifTool/Exif.pm +28 -11
  25. data/bin/lib/Image/ExifTool/FITS.pm +13 -2
  26. data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
  27. data/bin/lib/Image/ExifTool/FujiFilm.pm +19 -8
  28. data/bin/lib/Image/ExifTool/GPS.pm +22 -11
  29. data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
  30. data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
  31. data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
  32. data/bin/lib/Image/ExifTool/ID3.pm +15 -3
  33. data/bin/lib/Image/ExifTool/JPEG.pm +74 -4
  34. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  35. data/bin/lib/Image/ExifTool/Jpeg2000.pm +393 -16
  36. data/bin/lib/Image/ExifTool/LIF.pm +153 -0
  37. data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
  38. data/bin/lib/Image/ExifTool/M2TS.pm +137 -5
  39. data/bin/lib/Image/ExifTool/MIE.pm +4 -3
  40. data/bin/lib/Image/ExifTool/MRC.pm +341 -0
  41. data/bin/lib/Image/ExifTool/MWG.pm +3 -3
  42. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
  45. data/bin/lib/Image/ExifTool/Nikon.pm +19 -8
  46. data/bin/lib/Image/ExifTool/NikonSettings.pm +28 -11
  47. data/bin/lib/Image/ExifTool/Olympus.pm +6 -3
  48. data/bin/lib/Image/ExifTool/Other.pm +93 -0
  49. data/bin/lib/Image/ExifTool/PDF.pm +9 -12
  50. data/bin/lib/Image/ExifTool/PNG.pm +8 -7
  51. data/bin/lib/Image/ExifTool/Panasonic.pm +28 -3
  52. data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
  53. data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
  54. data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
  55. data/bin/lib/Image/ExifTool/QuickTime.pm +247 -88
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
  57. data/bin/lib/Image/ExifTool/README +3 -0
  58. data/bin/lib/Image/ExifTool/RIFF.pm +89 -12
  59. data/bin/lib/Image/ExifTool/Samsung.pm +48 -10
  60. data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
  61. data/bin/lib/Image/ExifTool/Sony.pm +237 -78
  62. data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
  63. data/bin/lib/Image/ExifTool/TagLookup.pm +4125 -4028
  64. data/bin/lib/Image/ExifTool/TagNames.pod +644 -286
  65. data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  68. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
  69. data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
  70. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
  71. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +55 -21
  72. data/bin/lib/Image/ExifTool/WriteXMP.pl +7 -3
  73. data/bin/lib/Image/ExifTool/Writer.pl +47 -10
  74. data/bin/lib/Image/ExifTool/XMP.pm +39 -14
  75. data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
  76. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  77. data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
  78. data/bin/lib/Image/ExifTool.pm +223 -72
  79. data/bin/lib/Image/ExifTool.pod +114 -93
  80. data/bin/perl-Image-ExifTool.spec +43 -42
  81. data/lib/exiftool_vendored/version.rb +1 -1
  82. 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.12';
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 => 'Hoogte referentie',
1505
+ Description => 'GPS hoogte - referentie',
1506
1506
  PrintConv => {
1507
- 'Above Sea Level' => 'Zee spiegel',
1508
- 'Below Sea Level' => 'Zee spiegel referentie (negatieve waarde)',
1507
+ 'Above Sea Level' => 'Boven zeeniveau',
1508
+ 'Below Sea Level' => 'Onder zeeniveau',
1509
1509
  },
1510
1510
  },
1511
- 'GPSAreaInformation' => 'Naam van het GPS gebied',
1512
- 'GPSDOP' => 'Meet nauwkeurigheid',
1513
- 'GPSDateStamp' => 'GPS datum',
1514
- 'GPSDateTime' => 'GPS tijd (atoomklok)',
1515
- 'GPSDestBearing' => 'Motiefrichting',
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 => 'Referentie voor de motiefrichting',
1517
+ Description => 'GPS peiling van bestemming - referentie',
1518
1518
  PrintConv => {
1519
- 'Magnetic North' => 'Magnetische uitrichting',
1520
- 'True North' => 'Geografische uitrichting',
1519
+ 'Magnetic North' => 'Magnetische noorden',
1520
+ 'True North' => 'Geografische noorden',
1521
1521
  },
1522
1522
  },
1523
- 'GPSDestDistance' => 'Afstand tot bestemming',
1523
+ 'GPSDestDistance' => 'GPS afstand tot bestemming',
1524
1524
  'GPSDestDistanceRef' => {
1525
- Description => 'Referentie voor de afstand tot de bestemming',
1525
+ Description => 'GPS afstand tot bestemming - referentie',
1526
1526
  PrintConv => {
1527
- 'Miles' => 'Mijlen',
1528
- 'Nautical Miles' => 'Knopen',
1527
+ 'Miles' => 'Engelse mijlen',
1528
+ 'Nautical Miles' => 'Zeemijlen',
1529
1529
  },
1530
1530
  },
1531
- 'GPSDestLatitude' => 'Breedte van het doel',
1531
+ 'GPSDestLatitude' => 'GPS breedtegraad van bestemming',
1532
1532
  'GPSDestLatitudeRef' => {
1533
- Description => 'Referentie voor de breedte van het doel',
1533
+ Description => 'GPS breedtegraad van bestemming - referentie',
1534
1534
  PrintConv => {
1535
- 'North' => 'Noordelijke breedte',
1536
- 'South' => 'Zuidelijke breedte',
1535
+ 'North' => 'Noorderbreedte',
1536
+ 'South' => 'Zuiderbreedte',
1537
1537
  },
1538
1538
  },
1539
- 'GPSDestLongitude' => 'Lengtegraad van het doel',
1539
+ 'GPSDestLongitude' => 'GPS lengtegraad van bestemming',
1540
1540
  'GPSDestLongitudeRef' => {
1541
- Description => 'Referentie voor de lengte van het doel',
1541
+ Description => 'GPS lengtegraad van bestemming - referentie',
1542
1542
  PrintConv => {
1543
- 'East' => 'Oostelijke lengte',
1544
- 'West' => 'Westlijke lengte',
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' => 'Differentiaal correctie toegepast',
1551
- 'No Correction' => 'Meting zonder differentiaal correctie',
1550
+ 'Differential Corrected' => 'Met differentiaal correctie',
1551
+ 'No Correction' => 'Zonder differentiaal correctie',
1552
1552
  },
1553
1553
  },
1554
- 'GPSImgDirection' => 'Richting van de afbeelding',
1554
+ 'GPSImgDirection' => 'GPS peiling van de afbeelding',
1555
1555
  'GPSImgDirectionRef' => {
1556
- Description => 'Referentie voor de uitrichting van de afbeelding',
1556
+ Description => 'GPS peiling van de afbeelding - referentie',
1557
1557
  PrintConv => {
1558
- 'Magnetic North' => 'Magnetische uitrichting',
1559
- 'True North' => 'Geografische uitrichting',
1558
+ 'Magnetic North' => 'Magnetische noorden',
1559
+ 'True North' => 'Geografische noorden',
1560
1560
  },
1561
1561
  },
1562
- 'GPSInfo' => 'GPS Info IFD-wijzer',
1563
- 'GPSLatitude' => 'Breedte graad',
1562
+ 'GPSInfo' => 'GPS Info',
1563
+ 'GPSLatitude' => 'GPS breedtegraad',
1564
1564
  'GPSLatitudeRef' => {
1565
- Description => 'Noord. of zuid. breedte',
1565
+ Description => 'GPS breedtegraad - referentie',
1566
1566
  PrintConv => {
1567
- 'North' => 'Noordelijke breedte',
1568
- 'South' => 'Zuidlijke breedte',
1567
+ 'North' => 'Noorderbreedte',
1568
+ 'South' => 'Zuiderbreedte',
1569
1569
  },
1570
1570
  },
1571
- 'GPSLongitude' => 'Geografische lengte',
1571
+ 'GPSLongitude' => 'GPS lengtegraad',
1572
1572
  'GPSLongitudeRef' => {
1573
- Description => 'Oost. of west. lengte',
1573
+ Description => 'GPS lengtegraad - referentie',
1574
1574
  PrintConv => {
1575
- 'East' => 'Oostlijke lengte',
1576
- 'West' => 'Westlijke lengte',
1575
+ 'East' => 'Oosterlengte',
1576
+ 'West' => 'Westerlengte',
1577
1577
  },
1578
1578
  },
1579
- 'GPSMapDatum' => 'Geodatische datum',
1579
+ 'GPSMapDatum' => 'GPS geodetisch datum',
1580
1580
  'GPSMeasureMode' => {
1581
- Description => 'GPS meet methode',
1581
+ Description => 'GPS meetmethode',
1582
1582
  PrintConv => {
1583
- '2-D' => '2 dimensionale meting',
1584
- '2-Dimensional' => '2 dimensionale meting',
1585
- '2-Dimensional Measurement' => '2 dimensionale meting',
1586
- '3-D' => '3 dimensionale meting',
1587
- '3-Dimensional' => '3 dimensionale meting',
1588
- '3-Dimensional Measurement' => '3 dimensionale meting',
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
- 'GPSProcessingMethod' => 'Naam van de GPS verwerk methode',
1592
- 'GPSSatellites' => 'Voor de meting gebruikte satellieten',
1593
- 'GPSSpeed' => 'Snelheid van de GPS ontvanger',
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 => 'Snelheids eenheid',
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' => 'Meting loopt',
1606
- 'Measurement Void' => 'Interoperabiliteit voor metingen',
1606
+ 'Measurement Active' => 'Actuele meting beschikbaar',
1607
+ 'Measurement Void' => 'Actuele meting niet beschikbaar',
1607
1608
  },
1608
1609
  },
1609
- 'GPSTimeStamp' => 'GPS tijd (atoomklok)',
1610
- 'GPSTrack' => 'Bewegingsrichting',
1610
+ 'GPSTimeStamp' => 'GPS UTC tijd',
1611
+ 'GPSTrack' => 'GPS ontvanger bewegingsrichting',
1611
1612
  'GPSTrackRef' => {
1612
- Description => 'Referentie voor de bewegingsrichting',
1613
+ Description => 'GPS ontvanger bewegingsrichting - referentie',
1613
1614
  PrintConv => {
1614
- 'Magnetic North' => 'Magnetische uitrichting',
1615
- 'True North' => 'Geographische uitrichting',
1615
+ 'Magnetic North' => 'Magnetische noorden',
1616
+ 'True North' => 'Geografische noorden',
1616
1617
  },
1617
1618
  },
1618
- 'GPSVersionID' => 'GPS tag versie',
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.18';
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
- next unless defined $data{$pid};
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.48';
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