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.
- package/bin/exiftool_files/Changes +38 -3
- package/bin/exiftool_files/README +2 -2
- package/bin/exiftool_files/exiftool.pl +32 -23
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +13 -8
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +6 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +2 -0
- package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +5 -1
- package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +44 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MISB.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +193 -85
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +7 -2
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +45 -6
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +35 -2
- package/bin/exiftool_files/lib/Image/ExifTool/README +4 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +29 -14
- package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4562 -4552
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +46 -9
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +9 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +8 -5
- package/bin/exiftool_files/lib/Image/ExifTool.pod +9 -8
- 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.
|
|
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
|
|
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
|
|
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.
|
|
111
|
-
cd Image-ExifTool-12.
|
|
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.
|
|
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
|
-
$
|
|
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.
|
|
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
|
|
5919
|
-
|
|
5920
|
-
|
|
5921
|
-
file
|
|
5922
|
-
the file
|
|
5923
|
-
|
|
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
|
|
5943
|
-
performance
|
|
5944
|
-
of
|
|
5945
|
-
|
|
5946
|
-
example, -fileOrder4 may be used if *TAG* is a
|
|
5947
|
-
If multiple -fileOrder options are used, the
|
|
5948
|
-
the lowest -fast level. Note that files are
|
|
5949
|
-
boundaries if multiple input directories
|
|
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
|
|
6284
|
-
are formatted as a comma-separated list of the following
|
|
6285
|
-
values: Avoid, Binary, List, Mandatory, Permanent,
|
|
6286
|
-
Unknown and Unsafe (see the Tag Name documentation). For
|
|
6287
|
-
tags, the list type (Alt, Bag or Seq) is added to the
|
|
6288
|
-
flattened structure tags are indicated by a Flattened
|
|
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.
|
|
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
|
-
|
|
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 $
|
|
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, "
|
|
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.
|
|
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.
|
|
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 =>
|
|
6381
|
-
|
|
6382
|
-
$val =~
|
|
6383
|
-
|
|
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
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
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;
|