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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +236 -4
  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 +152 -97
  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 +31 -13
  19. data/bin/lib/Image/ExifTool/CBOR.pm +331 -0
  20. data/bin/lib/Image/ExifTool/Canon.pm +44 -19
  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 +124 -13
  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 +30 -5
  35. data/bin/lib/Image/ExifTool/Jpeg2000.pm +395 -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 +3 -3
  44. data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
  45. data/bin/lib/Image/ExifTool/Nikon.pm +18 -5
  46. data/bin/lib/Image/ExifTool/NikonSettings.pm +19 -2
  47. data/bin/lib/Image/ExifTool/Olympus.pm +10 -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 +234 -75
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
  57. data/bin/lib/Image/ExifTool/README +5 -2
  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 +230 -69
  62. data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
  63. data/bin/lib/Image/ExifTool/TagLookup.pm +4145 -4029
  64. data/bin/lib/Image/ExifTool/TagNames.pod +671 -287
  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 +45 -15
  75. data/bin/lib/Image/ExifTool/XMP2.pl +3 -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 +233 -81
  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