exiftool-vendored.exe 12.49.0 → 12.50.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 (26) hide show
  1. package/bin/exiftool_files/Changes +38 -3
  2. package/bin/exiftool_files/README +2 -2
  3. package/bin/exiftool_files/exiftool.pl +32 -23
  4. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +13 -8
  6. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +6 -5
  7. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +1 -1
  8. package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +2 -0
  9. package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +5 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +44 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/MISB.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +193 -85
  13. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +2 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +7 -2
  15. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +45 -6
  16. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +35 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/README +4 -0
  18. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +29 -14
  19. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4562 -4552
  21. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +46 -9
  22. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +3 -2
  23. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +9 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool.pm +8 -5
  25. package/bin/exiftool_files/lib/Image/ExifTool.pod +9 -8
  26. package/package.json +1 -1
@@ -4,9 +4,44 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.42. (Other versions are
7
+ Note: The most recent production release is Version 12.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Nov. 8, 2022 - Version 12.50 (production release)
11
+
12
+ - Added a new XMP-GCreations tag
13
+ - Added a few new Sony lenses (thanks Jos Roost)
14
+ - Added new SonyModelID and Olympus CameraType values (thanks LibRaw and Herb)
15
+ - Added a couple of new XMP tags (thanks Jose Oliver-Didier)
16
+ - Added a new Nikon Z lens (thanks LibRaw)
17
+ - Added a new Canon LensType and CanonModelID (thanks Norbert Wasser and
18
+ LibRaw)
19
+ - Added some new Pentax lenses (thanks LibRaw)
20
+ - Added experimental support for timed GPS in TS videos from Jomise T860S-GM
21
+ dashcam (more samples are needed for this to be finalized)
22
+ - Decode information written in "skip" atom of 70mai Pro Plus+ MP4 videos
23
+ - Decode timed accelerometer data from Kenwood dashcam MP4 videos
24
+ - Decode a few new Nikon Z9 tags (thanks Stefan Grussen)
25
+ - Decode ColorData for some newer Canon models (thanks LibRaw)
26
+ - Decode a number of new tags for the Sony ILCE-7RM5 (thanks Jos Roost)
27
+ - Updated IPTC XMP tags to correspond with new Photo Metadata 2022.1 standard
28
+ - Extract JPEG previews from FujiFilm HIF images
29
+ - Changed -if option so multiple -if options are evaluated at the lowest
30
+ specified -fast level
31
+ - Changed MIMEType for ICO and CUR files
32
+ - Enhanced -fast2 so it stops processing QuickTime files at mdat atom
33
+ - Enhanced -listx output so -f also indicates the ID of the parent structure
34
+ for Flattened tags
35
+ - Improved conversion of IPTC date-only and time-only tags to allow formatting
36
+ with the -d option
37
+ - Improved Canon and Nikon TimeZone tags to accept a wider variety of input
38
+ formats when writing
39
+ - Disabled extraction of Nikon Z9 MenuSettings for firmware 3.0 until they can
40
+ be properly decoded (thanks Warren Hatch)
41
+ - Fixed decoding of AF points for some newer Nikon models
42
+ - Fixed inconsistent year and time zone for Kenwood dashcam timed GPS in MP4
43
+ videos
44
+
10
45
  Oct. 19, 2022 - Version 12.49
11
46
 
12
47
  - Added read support for Windows ICO and CUR files
@@ -320,7 +355,7 @@ Oct. 16, 2021 - Version 12.33
320
355
  - Added a new Canon RF lens (thanks Norbert Wasser)
321
356
  - Decode Canon ShutterMode (thanks John Moyer)
322
357
  - Extract LensModel from some Olympus MOV videos
323
- - Generate MediaDataOffset/Size for MOV videos with zero-sized MDAT chunk
358
+ - Generate MediaDataOffset/Size for MOV videos with zero-sized mdat chunk
324
359
  - Improvements to CBOR reader, including hex dump with -v3 option
325
360
  - Recognize Final Cut Pro XML files
326
361
  - Allow binary data of Protected tags to be extracted with the -X -j and -php
@@ -2119,7 +2154,7 @@ Mar. 1, 2018 - Version 10.82
2119
2154
  - Added a few new CanonModelID/SonyModelID values (thanks LibRaw)
2120
2155
  - Added support for the Sony ILCE-7M3 (thanks Jos Roost)
2121
2156
  - Decode timed GPS information from Insta360 MP4 videos with the -ee option
2122
- - Write XMP before idat in MOV/MP4/CR3 files if possible
2157
+ - Write XMP before mdat in MOV/MP4/CR3 files if possible
2123
2158
  - Fixed "'x' outside of string" runtime error when reading some Sony images
2124
2159
  - Fixed problem with some hex dumps going to the console when -v3 was combined
2125
2160
  with the -w option
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.49.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.49
110
+ gzip -dc Image-ExifTool-12.50.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.50
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.49';
14
+ my $version = '12.50';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -1023,8 +1023,12 @@ for (;;) {
1023
1023
  }
1024
1024
  if (/^if(\d*)$/i) {
1025
1025
  my $cond = shift;
1026
- $fastCondition = $1 if length $1;
1026
+ my $fast = length($1) ? $1 : undef;
1027
1027
  defined $cond or Error("Expecting expression for -if option\n"), $badCmd=1, next;
1028
+ # use lowest -fast setting if multiple conditions
1029
+ if (not @condition or not defined $fast or (defined $fastCondition and $fastCondition > $fast)) {
1030
+ $fastCondition = $fast;
1031
+ }
1028
1032
  # prevent processing file unnecessarily for simple case of failed '$ok' or 'not $ok'
1029
1033
  $cond =~ /^\s*(not\s*)\$ok\s*$/i and ($1 xor $rtnValPrev) and $failCondition=1;
1030
1034
  # add to list of requested tags
@@ -5494,7 +5498,7 @@ OPTIONS
5494
5498
 
5495
5499
  produces output like this:
5496
5500
 
5497
- -- Generated by ExifTool 12.49 --
5501
+ -- Generated by ExifTool 12.50 --
5498
5502
  File: a.jpg - 2003:10:31 15:44:19
5499
5503
  (f/5.6, 1/60s, ISO 100)
5500
5504
  File: b.jpg - 2006:05:23 11:57:38
@@ -5915,12 +5919,15 @@ OPTIONS
5915
5919
  images directly from disk, but can be substantial if piping images
5916
5920
  through a network connection. For more substantial speed benefits,
5917
5921
  -fast2 also causes exiftool to avoid extracting any EXIF MakerNote
5918
- information. -fast3 avoids extracting metadata from the file, and
5919
- returns only pseudo System tags, but still reads the file header to
5920
- obtain an educated guess at FileType. -fast4 doesn't even read the
5921
- file header, and returns only System tags and a FileType based on
5922
- the file extension. -fast5 also disables generation of the
5923
- Composite tags (like -e). Has no effect when writing.
5922
+ information, and to stop processing at the IDAT chunk of PNG images
5923
+ and the mdat atom of QuickTime-format files (but note that some
5924
+ files may store metadata after this). -fast3 avoids extracting
5925
+ metadata from the file, and returns only pseudo System tags, but
5926
+ still reads the file header to obtain an educated guess at
5927
+ FileType. -fast4 doesn't even read the file header, and returns
5928
+ only System tags and a FileType based on the file extension. -fast5
5929
+ also disables generation of the Composite tags (like -e). Has no
5930
+ effect when writing.
5924
5931
 
5925
5932
  Note that a separate -fast setting may be used for evaluation of a
5926
5933
  -if condition, or when ordering files with the -fileOrder option.
@@ -5939,14 +5946,15 @@ OPTIONS
5939
5946
  (eg. "-fileOrder -createdate"). Print conversion of the sorted
5940
5947
  values is disabled with the -n option, or a "#" appended to the tag
5941
5948
  name. Other formatting options (eg. -d) have no effect on the
5942
- sorted values. Note that the -fileOrder option can have a large
5943
- performance impact since it involves an additional processing pass
5944
- of each file, but this impact may be reduced by specifying a *NUM*
5945
- for the -fast level used during the metadata-extraction phase. For
5946
- example, -fileOrder4 may be used if *TAG* is a pseudo System tag.
5947
- If multiple -fileOrder options are used, the extraction is done at
5948
- the lowest -fast level. Note that files are sorted across directory
5949
- boundaries if multiple input directories are specified.
5949
+ sorted values. Note that the -fileOrder option can incur large
5950
+ performance penalty since it involves an additional initial
5951
+ processing pass of all files, but this impact may be reduced by
5952
+ specifying a *NUM* to effectively set the -fast level for the
5953
+ initial pass. For example, -fileOrder4 may be used if *TAG* is a
5954
+ pseudo System tag. If multiple -fileOrder options are used, the
5955
+ extraction is done at the lowest -fast level. Note that files are
5956
+ sorted across directory boundaries if multiple input directories
5957
+ are specified.
5950
5958
 
5951
5959
  -i *DIR* (-ignore)
5952
5960
  Ignore specified directory name. *DIR* may be either an individual
@@ -6280,12 +6288,13 @@ OPTIONS
6280
6288
 
6281
6289
  When combined with -listx, the -s option shortens the output by
6282
6290
  omitting the descriptions and values (as in the last example
6283
- above), and -f adds a 'flags' attribute if applicable. The flags
6284
- are formatted as a comma-separated list of the following possible
6285
- values: Avoid, Binary, List, Mandatory, Permanent, Protected,
6286
- Unknown and Unsafe (see the Tag Name documentation). For XMP List
6287
- tags, the list type (Alt, Bag or Seq) is added to the flags, and
6288
- flattened structure tags are indicated by a Flattened flag.
6291
+ above), and -f adds 'flags' and 'struct' attributes if applicable.
6292
+ The flags are formatted as a comma-separated list of the following
6293
+ possible values: Avoid, Binary, List, Mandatory, Permanent,
6294
+ Protected, Unknown and Unsafe (see the Tag Name documentation). For
6295
+ XMP List tags, the list type (Alt, Bag or Seq) is added to the
6296
+ flags, and flattened structure tags are indicated by a Flattened
6297
+ flag with 'struct' giving the ID of the parent structure.
6289
6298
 
6290
6299
  Note that none of the -list options require an input *FILE*.
6291
6300
 
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
35
35
  use Image::ExifTool::Validate;
36
36
  use Image::ExifTool::MacOS;
37
37
 
38
- $VERSION = '3.49';
38
+ $VERSION = '3.50';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -1291,16 +1291,19 @@ TagID: foreach $tagID (@keys) {
1291
1291
  $printConv = shift @printConvList;
1292
1292
  $index = shift @indexList;
1293
1293
  }
1294
- } elsif ($printConv and $printConv =~ /DecodeBits\(\$val,\s*(\{.*\})\s*\)/s) {
1294
+ # look inside scalar PrintConv for a bit/byte conversion
1295
+ # (see Photoshop:PrintFlags for use of "$byte" decoding)
1296
+ } elsif ($printConv and $printConv =~ /DecodeBits\(\$(val|byte),\s*(\\\%[\w:]+|\{.*\})\s*\)/s) {
1297
+ my $type = $1 eq 'byte' ? 'Byte' : 'Bit';
1295
1298
  $$self{Model} = ''; # needed for Nikon ShootingMode
1296
- my $bits = eval $1;
1299
+ my $bits = eval $2;
1297
1300
  delete $$self{Model};
1298
1301
  if ($@) {
1299
1302
  warn $@;
1300
1303
  } else {
1301
1304
  my @pk = sort { NumbersFirst($a,$b) } keys %$bits;
1302
1305
  foreach (@pk) {
1303
- push @values, "Bit $_ = " . $$bits{$_};
1306
+ push @values, "$type $_ = " . $$bits{$_};
1304
1307
  }
1305
1308
  }
1306
1309
  }
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.62';
91
+ $VERSION = '4.63';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -620,8 +620,9 @@ $VERSION = '4.62';
620
620
  '61182.40' => 'Canon RF 1200mm F8L IS USM', #42
621
621
  '61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
622
622
  '61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
623
+ '61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
623
624
  # we need the RFLensType values for the following...
624
- '61182.43' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
625
+ '61182.44' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
625
626
  65535 => 'n/a',
626
627
  );
627
628
 
@@ -982,6 +983,7 @@ $VERSION = '4.62';
982
983
  0x80000465 => 'EOS R10', #42
983
984
  0x80000467 => 'PowerShot ZOOM',
984
985
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
986
+ 0x80000481 => 'EOS R6 Mark II', #42
985
987
  0x80000520 => 'EOS D2000C', #IB
986
988
  0x80000560 => 'EOS D6000C', #PH (guess)
987
989
  );
@@ -1944,7 +1946,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1944
1946
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
1945
1947
  },
1946
1948
  { # (int16u[3973]) - R3 ref IB
1947
- Condition => '$count == 3973',
1949
+ Condition => '$count == 3973 or $count == 3778',
1948
1950
  Name => 'ColorData11',
1949
1951
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
1950
1952
  },
@@ -6377,10 +6379,11 @@ my %ciMaxFocal = (
6377
6379
  1 => {
6378
6380
  Name => 'TimeZone',
6379
6381
  PrintConv => 'Image::ExifTool::TimeZoneString($val)',
6380
- PrintConvInv => sub {
6381
- my $val = shift;
6382
- $val =~ /^([-+]?)(\d{1,2}):?(\d{2})$/ or return undef;
6383
- return(($1 eq '-' ? -1 : 1) * ($2 * 60 + $3));
6382
+ PrintConvInv => q{
6383
+ $val =~ /Z$/ and return 0;
6384
+ $val =~ /([-+])(\d{1,2}):?(\d{2})$/ and return $1 . ($2 * 60 + $3);
6385
+ $val =~ /^(\d{2})(\d{2})$/ and return $1 * 60 + $2;
6386
+ return undef;
6384
6387
  },
6385
6388
  },
6386
6389
  2 => {
@@ -6836,6 +6839,7 @@ my %ciMaxFocal = (
6836
6839
  299 => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
6837
6840
  300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
6838
6841
  302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6842
+ 303 => 'Canon RF 135mm F1.8 L IS USM', #42
6839
6843
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6840
6844
  },
6841
6845
  },
@@ -8333,7 +8337,7 @@ my %ciMaxFocal = (
8333
8337
  # Color data (MakerNotes tag 0x4001, count=3973, ref IB)
8334
8338
  %Image::ExifTool::Canon::ColorData11 = (
8335
8339
  %binaryDataAttrs,
8336
- NOTES => 'These tags are used by the EOS R3',
8340
+ NOTES => 'These tags are used by the EOS R3, R7 and R6mkII',
8337
8341
  FORMAT => 'int16s',
8338
8342
  FIRST_ENTRY => 0,
8339
8343
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8345,6 +8349,7 @@ my %ciMaxFocal = (
8345
8349
  RawConv => '$$self{ColorDataVersion} = $val',
8346
8350
  PrintConv => {
8347
8351
  34 => '34 (R3)', #IB
8352
+ 48 => '48 (R7, R10, R6 Mark II)', #IB
8348
8353
  },
8349
8354
  },
8350
8355
  0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -1084,11 +1084,11 @@ my %opcodeInfo = (
1084
1084
  {
1085
1085
  Name => 'ThumbnailOffset',
1086
1086
  Notes => q{
1087
- ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
1088
- images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
1089
- PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images;
1090
- JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and
1091
- OtherImageStart in everything else
1087
+ called JPEGInterchangeFormat in the specification, this is ThumbnailOffset
1088
+ in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW images and AVI and
1089
+ MOV videos, and the SubIFD in IFD1 of SRW images; PreviewImageStart in
1090
+ MakerNotes and IFD0 of ARW and SR2 images; JpgFromRawStart in SubIFD of NEF
1091
+ images and IFD2 of PEF images; and OtherImageStart in everything else
1092
1092
  },
1093
1093
  # thumbnail is found in IFD1 of JPEG and TIFF images, and
1094
1094
  # IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos
@@ -1225,6 +1225,7 @@ my %opcodeInfo = (
1225
1225
  {
1226
1226
  Name => 'ThumbnailLength',
1227
1227
  Notes => q{
1228
+ called JPEGInterchangeFormatLength in the specification, this is
1228
1229
  ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
1229
1230
  images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
1230
1231
  PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
@@ -558,7 +558,7 @@ DoneFix: $isDate = 1;
558
558
  } elsif ($nmea eq 'RMC') {
559
559
  # $GPRMC,092204.999,A,4250.5589,S,14718.5084,E,0.00,89.68,211200,,*25
560
560
  # $GPRMC,093657.007,,3652.835020,N,01053.104094,E,1.642,,290913,,,A*0F
561
- # $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,ddmmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
561
+ # $GPRMC,hhmmss.sss,A/V,ddmm.mmmm,N/S,dddmm.mmmm,E/W,spd(knots),dir(deg),DDMMYY,,*cs
562
562
  /^\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/ or next;
563
563
  next if $13 > 31 or $14 > 12 or $15 > 99; # validate day/month/year
564
564
  $fix{lat} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
@@ -86,6 +86,8 @@ sub ProcessICO($$$)
86
86
  # verify this is a valid ICO/CUR file
87
87
  return 0 unless $raf->Read($buff, 6) == 6;
88
88
  return 0 unless $buff =~ /^\0\0([\x01\x02])\0[^0]\0/s;
89
+ # (note: have seen cursor files in the wild with an 0x01 here,
90
+ # but SetFileType will use the .cur extension to identify these)
89
91
  $et->SetFileType($1 eq "\x01" ? 'ICO' : 'CUR');
90
92
  SetByteOrder('II');
91
93
  my $tagTbl = GetTagTable('Image::ExifTool::ICO::Main');
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION $AUTOLOAD %iptcCharset);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.57';
18
+ $VERSION = '1.58';
19
19
 
20
20
  %iptcCharset = (
21
21
  "\x1b%G" => 'UTF8',
@@ -411,6 +411,7 @@ my %fileFormat = (
411
411
  Shift => 'Time',
412
412
  ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
413
413
  ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
414
+ PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("$val 00:00:00") : $val',
414
415
  PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
415
416
  },
416
417
  60 => {
@@ -420,6 +421,7 @@ my %fileFormat = (
420
421
  Shift => 'Time',
421
422
  ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
422
423
  ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
424
+ PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("1970:01:01 $val") : $val',
423
425
  PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
424
426
  },
425
427
  62 => {
@@ -429,6 +431,7 @@ my %fileFormat = (
429
431
  Shift => 'Time',
430
432
  ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
431
433
  ValueConvInv => 'Image::ExifTool::IPTC::IptcDate($val)',
434
+ PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("$val 00:00:00") : $val',
432
435
  PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
433
436
  },
434
437
  63 => {
@@ -438,6 +441,7 @@ my %fileFormat = (
438
441
  Shift => 'Time',
439
442
  ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
440
443
  ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
444
+ PrintConv => '$self->Options("DateFormat") ? $self->ConvertDateTime("1970:01:01 $val") : $val',
441
445
  PrintConvInv => 'Image::ExifTool::IPTC::InverseDateOrTime($self,$val)',
442
446
  },
443
447
  65 => {
@@ -32,7 +32,7 @@ use strict;
32
32
  use vars qw($VERSION);
33
33
  use Image::ExifTool qw(:DataAccess :Utils);
34
34
 
35
- $VERSION = '1.22';
35
+ $VERSION = '1.23';
36
36
 
37
37
  # program map table "stream_type" lookup (ref 6/1/9)
38
38
  my %streamType = (
@@ -415,6 +415,48 @@ sub ParsePID($$$$$)
415
415
  }
416
416
  }
417
417
  $more = 1;
418
+ } elsif ($$dataPt =~ /\$GPRMC,/) {
419
+ # Jomise T860S-GM dashcam
420
+ # $GPRMC,hhmmss.ss,A,ddmm.mmmmm,N,dddmm.mmmmm,W,spd-kts,dir-dg,DDMMYY,,*cs
421
+ # $GPRMC,172255.00,A,:985.95194,N,17170.14674,W,029.678,170.68,240822,,,D*7B
422
+ # $GPRMC,172355.00,A,:984.76779,N,17170.00473,W,032.219,172.04,240822,,,D*7B
423
+ # ddmm.mmmm: from 4742.2568 12209.2028 (should be)
424
+ # to 4741.7696 12209.1056
425
+ # stamped on video: 47.70428N, 122.15338W, 35mph (dd.ddddd)
426
+ # to 47.69616N, 122.15176W, 37mph
427
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
428
+ while ($$dataPt =~ /\$[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(.{2})(\d{2}\.\d+),([NS]),(.{3})(\d{2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/g and
429
+ # do some basic sanity checks on the date
430
+ $13 <= 31 and $14 <= 12 and $15 <= 99)
431
+ {
432
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
433
+ my $year = $15 + ($15 >= 70 ? 1900 : 2000);
434
+ $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $year, $14, $13, $1, $2, $3));
435
+ #(not this simple)
436
+ #$et->HandleTag($tagTbl, GPSLatitude => (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1));
437
+ #$et->HandleTag($tagTbl, GPSLongitude => (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1));
438
+ $et->HandleTag($tagTbl, GPSSpeed => $11 * $knotsToKph) if length $11;
439
+ $et->HandleTag($tagTbl, GPSTrack => $12) if length $12;
440
+ # it looks like maybe the degrees are xor-ed with something,
441
+ # and the minutes have some scaling factor and offset?
442
+ # (the code below is approximately correct for my only sample)
443
+ my @chars = unpack('C*', $5 . $8);
444
+ my @xor = (0x0e,0x0e,0x00,0x05,0x03); # (empirical based on 1 sample; may be completely off base)
445
+ my $bad;
446
+ foreach (@chars) {
447
+ $_ ^= shift(@xor);
448
+ $bad = 1 if $_ < 0x30 or $_ > 0x39;
449
+ }
450
+ if ($bad) {
451
+ $et->WarnOnce('Error decrypting GPS degrees');
452
+ } else {
453
+ my $la = pack('C*', @chars[0,1]);
454
+ my $lo = pack('C*', @chars[2,3,4]);
455
+ $et->WarnOnce('Decryption of this GPS is highly experimental. More testing samples are required');
456
+ $et->HandleTag($tagTbl, GPSLatitude => (($la || 0) + (($6-85.95194)/2.43051724137931+42.2568)/60) * ($7 eq 'N' ? 1 : -1));
457
+ $et->HandleTag($tagTbl, GPSLongitude => (($lo || 0) + (($9-70.14674)/1.460987654320988+9.2028)/60) * ($10 eq 'E' ? 1 : -1));
458
+ }
459
+ }
418
460
  } elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) {
419
461
  #forum11320
420
462
  SetByteOrder('II');
@@ -493,6 +535,7 @@ sub ProcessM2TS($$)
493
535
  my %gpsPID = (
494
536
  0x0300 => 1, # Novatek INNOVV
495
537
  0x01e4 => 1, # vsys a6l dashcam
538
+ 0x0e1b => 1, # Jomise T860S-GM dashcam
496
539
  );
497
540
  my $pEnd = 0;
498
541
 
@@ -385,7 +385,7 @@ sub ProcessKLV($$$)
385
385
  # Parse MISB metadata
386
386
  # Inputs: 0) ExifTool ref, 1) data ref, 2) tag table ref
387
387
  # Returns: 1 if something was extracted, 0 otherwise
388
- sub ParseMISB($$)
388
+ sub ParseMISB($$$)
389
389
  {
390
390
  my ($et, $dataPt, $tagTablePtr) = @_;
391
391
  my $end = length $$dataPt;