exiftool_vendored 13.03.0 → 13.06.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +39 -0
- data/bin/MANIFEST +1 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +42 -32
- data/bin/lib/Image/ExifTool/Canon.pm +7 -1
- data/bin/lib/Image/ExifTool/DJI.pm +90 -28
- data/bin/lib/Image/ExifTool/Exif.pm +8 -4
- data/bin/lib/Image/ExifTool/GPS.pm +33 -29
- data/bin/lib/Image/ExifTool/Geolocation.pm +2 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +43 -9
- data/bin/lib/Image/ExifTool/GoPro.pm +118 -6
- data/bin/lib/Image/ExifTool/JPEG.pm +19 -4
- data/bin/lib/Image/ExifTool/OOXML.pm +7 -7
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -2
- data/bin/lib/Image/ExifTool/Protobuf.pm +242 -0
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +66 -25
- data/bin/lib/Image/ExifTool/Sony.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +2340 -2324
- data/bin/lib/Image/ExifTool/TagNames.pod +86 -8
- data/bin/lib/Image/ExifTool/Writer.pl +1 -1
- data/bin/lib/Image/ExifTool/XMP.pm +11 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +50 -8
- data/bin/lib/Image/ExifTool.pm +61 -33
- data/bin/lib/Image/ExifTool.pod +7 -6
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 277daacb61b45f8ffcf01c45e8a2ae6c7814aa878af57ce5e700433e37a73a89
|
4
|
+
data.tar.gz: c27dc0342c61725b98adb52806417396827df205172ae6793f14bb6eb9d3949b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: acb79bdb9f29cb00439ad4006faba198b460abed0c655e1cce6d7a3845ec14c8fe19a778dcbdb5401bb5f77b51329329e9ab8a6932c98a9d04ff63ca04be9af0
|
7
|
+
data.tar.gz: 2771ca21af4d53e1d2138b4b94dd187f1e59c9f9c6230f8d3a8d83be61979b320570084a50f5ae5a3d038114a46cca518dca35e517d8304ed98087c73ceeb163
|
data/bin/Changes
CHANGED
@@ -7,6 +7,45 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 13.00. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Dec. 5, 2024 - Version 13.06
|
11
|
+
|
12
|
+
- Decode timed metadata from MP4 videos of yet another dashcam model
|
13
|
+
- Patched issue where FileSequence could increment twice for each file when a
|
14
|
+
-if condition was used
|
15
|
+
- API Changes:
|
16
|
+
- Revert default WindowsLongPath option until we can solve the pipe
|
17
|
+
problem)
|
18
|
+
|
19
|
+
Dec. 4, 2024 - Version 13.05
|
20
|
+
|
21
|
+
- Added a new SonyModelID
|
22
|
+
- Added support for XMP HDRGainMap and apdi namespaces
|
23
|
+
- Decode DJI timed djmd and dbgi protobuf-format metadata
|
24
|
+
- Decode APP10 AROT HDRGainCurve and APP2 URN UniformResourceName
|
25
|
+
- Decode a couple of new GoPro tags
|
26
|
+
- API Changes:
|
27
|
+
- Changed default WindowsLongPath option to 1 (please report if this
|
28
|
+
causes any problems)
|
29
|
+
|
30
|
+
Nov. 26, 2024 - Version 13.04
|
31
|
+
|
32
|
+
- Added the ability to write GPSDOP and GPSMeasureMode from the -geotag option
|
33
|
+
if hdop or pdop information exists in the input track file
|
34
|
+
- Added a few new Canon RFLensTypes (thanks Norbert Wasser)
|
35
|
+
- Decode timed GPS from GoPro Hero 13 videos
|
36
|
+
- Improved writing of GPSDestLatitudeRef and GPSDestLongitudeRef tags to allow
|
37
|
+
signed numbers to be written in the same way as GPSLatitudeRef and
|
38
|
+
GPSLongitudeRef
|
39
|
+
- Warn if using an Image::ExifTool library that doesn't match the application
|
40
|
+
version
|
41
|
+
- Renamed an Unknown Photoshop tag
|
42
|
+
- Convert GoPro GPSSpeed and GPSSpeed3D from m/s to km/h
|
43
|
+
- Patched to tolerate XML header in DOCX xml files
|
44
|
+
- Fixed incorrect file offsets for tags in some embedded files of -htmldump
|
45
|
+
output
|
46
|
+
- Fixed -htmldump output to show the same names for unknown EXIF tags as with
|
47
|
+
the -u option
|
48
|
+
|
10
49
|
Nov. 12, 2024 - Version 13.03
|
11
50
|
|
12
51
|
- Added ability to include or exclude tags from CSV and JSON imports
|
data/bin/MANIFEST
CHANGED
@@ -397,6 +397,7 @@ lib/Image/ExifTool/PhotoMechanic.pm
|
|
397
397
|
lib/Image/ExifTool/Photoshop.pm
|
398
398
|
lib/Image/ExifTool/PostScript.pm
|
399
399
|
lib/Image/ExifTool/PrintIM.pm
|
400
|
+
lib/Image/ExifTool/Protobuf.pm
|
400
401
|
lib/Image/ExifTool/Qualcomm.pm
|
401
402
|
lib/Image/ExifTool/QuickTime.pm
|
402
403
|
lib/Image/ExifTool/QuickTimeStream.pl
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
109
109
|
terminal window to extract and run ExifTool:
|
110
110
|
|
111
111
|
cd ~/Desktop
|
112
|
-
gzip -dc Image-ExifTool-13.
|
113
|
-
cd Image-ExifTool-13.
|
112
|
+
gzip -dc Image-ExifTool-13.06.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-13.06
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
data/bin/exiftool
CHANGED
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use warnings;
|
12
12
|
require 5.004;
|
13
13
|
|
14
|
-
my $version = '13.
|
14
|
+
my $version = '13.06';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -597,6 +597,10 @@ if (@Image::ExifTool::UserDefined::Arguments) {
|
|
597
597
|
unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
|
598
598
|
}
|
599
599
|
|
600
|
+
if ($version ne $Image::ExifTool::VERSION) {
|
601
|
+
Warn "Application version $version does not match Image::ExifTool library version $Image::ExifTool::VERSION\n";
|
602
|
+
}
|
603
|
+
|
600
604
|
# parse command-line options in 2 passes...
|
601
605
|
# pass 1: set all of our ExifTool options
|
602
606
|
# pass 2: print all of our help and informational output (-list, -ver, etc)
|
@@ -1914,7 +1918,7 @@ if (@dbKeys) {
|
|
1914
1918
|
print $vout "Imported entry for '${_}' (full path: '${absPath}')\n";
|
1915
1919
|
}
|
1916
1920
|
} elsif ($verbose and $verbose > 1) {
|
1917
|
-
print $vout "Imported entry for '${_}' (
|
1921
|
+
print $vout "Imported entry for '${_}' (no full path)\n";
|
1918
1922
|
}
|
1919
1923
|
}
|
1920
1924
|
}
|
@@ -2168,7 +2172,10 @@ sub GetImageInfo($$)
|
|
2168
2172
|
}
|
2169
2173
|
# can't make use of $info if verbose because we must reprocess
|
2170
2174
|
# the file anyway to generate the verbose output
|
2171
|
-
|
2175
|
+
if ($verbose or defined $fastCondition or defined $diff) {
|
2176
|
+
undef $info;
|
2177
|
+
--$$et{FILE_SEQUENCE};
|
2178
|
+
}
|
2172
2179
|
} elsif ($file =~ s/^(\@JSON:)(.*)/$1/) {
|
2173
2180
|
# read JSON file from command line
|
2174
2181
|
my $dat = $2;
|
@@ -4159,11 +4166,12 @@ sub ScanDir($$;$)
|
|
4159
4166
|
}
|
4160
4167
|
$dir =~ /\/$/ or $dir .= '/'; # make sure directory name ends with '/'
|
4161
4168
|
foreach $file (@fileList) {
|
4169
|
+
next if $file eq '.' or $file eq '..';
|
4162
4170
|
my $path = "$dir$file";
|
4163
4171
|
if ($et->IsDirectory($path)) {
|
4164
4172
|
next unless $recurse;
|
4165
4173
|
# ignore directories starting with "." by default
|
4166
|
-
next if $file =~ /^\./ and
|
4174
|
+
next if $file =~ /^\./ and $recurse == 1;
|
4167
4175
|
next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
|
4168
4176
|
ScanDir($et, $path, $list);
|
4169
4177
|
last if $end;
|
@@ -4311,14 +4319,15 @@ sub AbsPath($)
|
|
4311
4319
|
{
|
4312
4320
|
my $file = shift;
|
4313
4321
|
my $path;
|
4314
|
-
if (defined $file
|
4315
|
-
|
4316
|
-
|
4317
|
-
|
4318
|
-
|
4319
|
-
$
|
4320
|
-
$path =
|
4322
|
+
if (defined $file) {
|
4323
|
+
return undef if $file eq '*'; # (CSV SourceFile may be '*' -- no absolute path for that)
|
4324
|
+
if ($^O eq 'MSWin32' and $mt->Options('WindowsLongPath')) {
|
4325
|
+
$path = $mt->WindowsLongPath($file);
|
4326
|
+
} elsif (eval { require Cwd }) {
|
4327
|
+
local $SIG{'__WARN__'} = sub { };
|
4328
|
+
$path = eval { Cwd::abs_path($file) };
|
4321
4329
|
}
|
4330
|
+
$path =~ tr/\\/\// if $^O eq 'MSWin32' and defined $path; # use forward slashes
|
4322
4331
|
}
|
4323
4332
|
return $path;
|
4324
4333
|
}
|
@@ -5903,7 +5912,7 @@ with this command:
|
|
5903
5912
|
|
5904
5913
|
produces output like this:
|
5905
5914
|
|
5906
|
-
-- Generated by ExifTool 13.
|
5915
|
+
-- Generated by ExifTool 13.06 --
|
5907
5916
|
File: a.jpg - 2003:10:31 15:44:19
|
5908
5917
|
(f/5.6, 1/60s, ISO 100)
|
5909
5918
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -5919,8 +5928,9 @@ name, a value of 1 is returned if any tag exists in the specified group, or
|
|
5919
5928
|
0 otherwise (unless the C<All> group is also specified, in which case the
|
5920
5929
|
values of all matching tags are joined).
|
5921
5930
|
|
5922
|
-
|
5923
|
-
|
5931
|
+
The B<-p> output iterates through the family 3 group names, with each
|
5932
|
+
sub-document producing additional output. This feature is most useful when
|
5933
|
+
used in combination with the B<-ee> option to extract embedded documents.
|
5924
5934
|
|
5925
5935
|
If a specified tag does not exist, a minor warning is issued and the line
|
5926
5936
|
with the missing tag is not printed. However, the B<-f> option may be used
|
@@ -6017,7 +6027,8 @@ import). May be combined with B<-s> to print tag names instead of
|
|
6017
6027
|
descriptions, or B<-S> to print tag values only, tab-delimited on a single
|
6018
6028
|
line. The B<-t> option may be combined with B<-j>, B<-php> or B<-X> to add
|
6019
6029
|
tag table information (C<table>, tag C<id>, and C<index> for cases where
|
6020
|
-
multiple conditional tags exist with the same ID)
|
6030
|
+
multiple conditional tags exist with the same ID), which allows the
|
6031
|
+
corresponding tag to be located in the B<-listx> output.
|
6021
6032
|
|
6022
6033
|
=item B<-T> (B<-table>)
|
6023
6034
|
|
@@ -6770,23 +6781,22 @@ the following two commands are equivalent:
|
|
6770
6781
|
exiftool -geotag trk.log image.jpg
|
6771
6782
|
exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg
|
6772
6783
|
|
6773
|
-
|
6774
|
-
|
6775
|
-
|
6776
|
-
|
6777
|
-
|
6778
|
-
|
6779
|
-
|
6780
|
-
|
6781
|
-
|
6782
|
-
|
6783
|
-
|
6784
|
-
|
6785
|
-
|
6786
|
-
|
6787
|
-
|
6788
|
-
|
6789
|
-
order to be written.
|
6784
|
+
If the C<Geotime> value does not contain a time zone then the local system
|
6785
|
+
timezone is assumed. Writing C<Geotime> causes the following tags to be
|
6786
|
+
written (provided they can be calculated from the track log, and they are
|
6787
|
+
supported by the destination metadata format): GPSLatitude, GPSLatitudeRef,
|
6788
|
+
GPSLongitude, GPSLongitudeRef, GPSAltitude, GPSAltitudeRef, GPSDateStamp,
|
6789
|
+
GPSTimeStamp, GPSDateTime, GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef,
|
6790
|
+
GPSImgDirection, GPSImgDirectionRef, GPSMeasureMode, GPSDOP, GPSPitch,
|
6791
|
+
GPSRoll, GPSCoordinates, AmbientTemperature and CameraElevationAngle. By
|
6792
|
+
default, in image files tags are created in EXIF, and updated in XMP only if
|
6793
|
+
they already exist. In QuickTime-format files GPSCoordinates is created in
|
6794
|
+
the preferred location (ItemList by default) as well as in XMP. However,
|
6795
|
+
C<EXIF:Geotime>, C<XMP:Geotime> or C<QuickTime:Geotime> may be specified to
|
6796
|
+
write to write only to one group. Also, C<ItemList:Geotime>, C<Keys:Geotime>
|
6797
|
+
or C<UserData:Geotime> may be used to write to a specific location in
|
6798
|
+
QuickTime-format files. Note that GPSPitch and GPSRoll are non-standard,
|
6799
|
+
and require user-defined tags in order to be written.
|
6790
6800
|
|
6791
6801
|
The C<Geosync> tag may be used to specify a time correction which is applied
|
6792
6802
|
to each C<Geotime> value for synchronization with GPS time. For example,
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
88
88
|
sub ProcessExifInfo($$$);
|
89
89
|
sub SwapWords($);
|
90
90
|
|
91
|
-
$VERSION = '4.
|
91
|
+
$VERSION = '4.85';
|
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)
|
@@ -631,6 +631,9 @@ $VERSION = '4.84';
|
|
631
631
|
'61182.54' => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
|
632
632
|
'61182.55' => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
|
633
633
|
'61182.56' => 'Canon RF 35mm F1.4 L VCM', #42
|
634
|
+
'61182.57' => 'Canon RF 70-200mm F2.8 L IS USM Z', #42
|
635
|
+
'61182.58' => 'Canon RF 50mm F1.4 L VCM', #42
|
636
|
+
'61182.59' => 'Canon RF 24mm F1.4 L VCM', #42
|
634
637
|
65535 => 'n/a',
|
635
638
|
);
|
636
639
|
|
@@ -7001,6 +7004,9 @@ my %ciMaxFocal = (
|
|
7001
7004
|
316 => 'Canon RF 35mm F1.4 L VCM', #42
|
7002
7005
|
317 => 'Canon RF-S 3.9mm F3.5 STM DUAL FISHEYE', #42
|
7003
7006
|
318 => 'Canon RF 28-70mm F2.8 IS STM', #42
|
7007
|
+
319 => 'Canon RF 70-200mm F2.8 L IS USM Z', #42
|
7008
|
+
325 => 'Canon RF 50mm F1.4 L VCM', #42
|
7009
|
+
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
7004
7010
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
7005
7011
|
},
|
7006
7012
|
},
|
@@ -15,11 +15,11 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
15
15
|
use Image::ExifTool::Exif;
|
16
16
|
use Image::ExifTool::XMP;
|
17
17
|
use Image::ExifTool::GPS;
|
18
|
+
use Image::ExifTool::Protobuf;
|
18
19
|
|
19
|
-
$VERSION = '1.
|
20
|
+
$VERSION = '1.10';
|
20
21
|
|
21
22
|
sub ProcessDJIInfo($$$);
|
22
|
-
sub Process_djmd($$$);
|
23
23
|
|
24
24
|
my %convFloat2 = (
|
25
25
|
PrintConv => 'sprintf("%+.2f", $val)',
|
@@ -187,34 +187,96 @@ my %convFloat2 = (
|
|
187
187
|
},
|
188
188
|
);
|
189
189
|
|
190
|
-
#
|
191
|
-
%Image::ExifTool::DJI::
|
192
|
-
|
190
|
+
# metadata in protobuf format (djmd and dbgi meta types, ref PH)
|
191
|
+
%Image::ExifTool::DJI::Protobuf = (
|
192
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
|
193
|
+
TAG_PREFIX => '',
|
194
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
195
|
+
NOTES => q{
|
196
|
+
Tags found in protobuf-format DJI meta djmd and dbgi timed metadata. Only a
|
197
|
+
few tags are currently known, but unknown djmd tags may be extracted by
|
198
|
+
setting the Unknown option to 1 (or 2 to also extract unknown dbgi debug
|
199
|
+
tags). Tag ID's are composed of the corresponding .proto file name combined
|
200
|
+
with the hierarchical protobuf field numbers. The "dvtm_AVATA2.proto" file
|
201
|
+
is used by the DJI Avanta 2, and "dvtm_ac203.proto" by the OsmoAction4.
|
202
|
+
},
|
203
|
+
Protocol => { },
|
204
|
+
# dvtm_ac203_1-1-6 - some version number
|
205
|
+
'dvtm_ac203_1-1-10' => 'Model',
|
206
|
+
'dvtm_ac203_2-3-1' => { Name => 'FrameWidth', Format => 'unsigned' },
|
207
|
+
'dvtm_ac203_2-3-2' => { Name => 'FrameHeight', Format => 'unsigned' },
|
208
|
+
'dvtm_ac203_2-3-3' => { Name => 'FrameRate', Format => 'float' },
|
209
|
+
# dvtm_ac203_3-4-1-4 - model code?
|
210
|
+
'dvtm_ac203_3-4-2-1-1' => {
|
211
|
+
Name => 'CoordinateUnits',
|
212
|
+
Format => 'unsigned',
|
213
|
+
# don't extract this -- just convert to degrees
|
214
|
+
RawConv => '$$self{CoordUnits} = $val; undef',
|
215
|
+
Hidden => 1,
|
216
|
+
# PrintConv => { 0 => 'Radians', 1 => 'Degrees' },
|
217
|
+
},
|
218
|
+
'dvtm_ac203_3-4-2-1-2' => {
|
219
|
+
Name => 'GPSLatitude',
|
220
|
+
Format => 'double',
|
221
|
+
# set ExifTool GPSLatitude/GPSLongitude members so GPSDateTime will be generated if necessary
|
222
|
+
RawConv => '$$self{GPSLatitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
223
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
224
|
+
},
|
225
|
+
'dvtm_ac203_3-4-2-1-3' => {
|
226
|
+
Name => 'GPSLongitude',
|
227
|
+
Format => 'double',
|
228
|
+
RawConv => '$$self{GPSLongitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
229
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
230
|
+
},
|
231
|
+
'dvtm_ac203_3-4-2-2' => {
|
232
|
+
Name => 'GPSAltitude',
|
233
|
+
Format => 'unsigned',
|
234
|
+
ValueConv => '$val / 1000',
|
235
|
+
},
|
236
|
+
'dvtm_ac203_3-4-2-6-1' => {
|
237
|
+
Name => 'GPSDateTime',
|
238
|
+
Format => 'string',
|
239
|
+
Groups => { 2 => 'Time' },
|
240
|
+
RawConv => '$$self{GPSDateTime} = $val',
|
241
|
+
ValueConv => '$val =~ tr/-/:/; $val',
|
242
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
243
|
+
},
|
244
|
+
# dvtm_AVATA2_1-1-2 - some version number
|
245
|
+
# dvtm_AVATA2_1-1-3 - some version number
|
246
|
+
'dvtm_AVATA2_1-1-10' => 'Model',
|
247
|
+
'dvtm_AVATA2_2-2-3-1' => 'SerialNumber', # (NC)
|
248
|
+
'dvtm_AVATA2_2-3-1' => { Name => 'FrameWidth', Format => 'unsigned' },
|
249
|
+
'dvtm_AVATA2_2-3-2' => { Name => 'FrameHeight', Format => 'unsigned' },
|
250
|
+
'dvtm_AVATA2_2-3-3' => { Name => 'FrameRate', Format => 'float' },
|
251
|
+
# dvtm_AVATA2_3-1-1 - frame number (starting at 1)
|
252
|
+
'dvtm_AVATA2_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
|
253
|
+
Name => 'TimeStamp',
|
254
|
+
Format => 'unsigned',
|
255
|
+
# milliseconds, but I don't know what the zero is
|
256
|
+
ValueConv => '$val / 1e6',
|
257
|
+
},
|
258
|
+
# dvtm_AVATA2_3-2-1-4 - model code?
|
259
|
+
# dvtm_AVATA2_3-4-1-4 - model code?
|
260
|
+
'dvtm_AVATA2_3-4-4-1-1' => { # (NC) (default seems to be radians if missing)
|
261
|
+
Name => 'CoordinateDegrees',
|
262
|
+
Format => 'unsigned',
|
263
|
+
RawConv => '$$self{CoordDegrees} = $val; undef',
|
264
|
+
Hidden => 1,
|
265
|
+
},
|
266
|
+
'dvtm_AVATA2_3-4-4-1-2' => {
|
267
|
+
Name => 'GPSLatitude',
|
268
|
+
Format => 'double',
|
269
|
+
RawConv => '$$self{GPSLatitude} = $$self{CoordDegrees} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
270
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
271
|
+
},
|
272
|
+
'dvtm_AVATA2_3-4-4-1-3' => {
|
273
|
+
Name => 'GPSLongitude',
|
274
|
+
Format => 'double',
|
275
|
+
RawConv => '$$self{GPSLongitude} = $$self{CoordDegrees} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
276
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
277
|
+
},
|
193
278
|
);
|
194
279
|
|
195
|
-
#------------------------------------------------------------------------------
|
196
|
-
# Process DJI djmd timed data from Action4 videos (ref PH)
|
197
|
-
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
198
|
-
# Returns: 1 on success
|
199
|
-
# TODO: work in progress
|
200
|
-
sub Process_djmd($$$)
|
201
|
-
{
|
202
|
-
my ($et, $dirInfo, $tagTbl) = @_;
|
203
|
-
my $dataPt = $$dirInfo{DataPt};
|
204
|
-
my ($pos, $bit, $val) = (6, 0, 0);
|
205
|
-
for (;;) {
|
206
|
-
my $v = Get8u($dataPt, $pos);
|
207
|
-
$val += ($v & 0x7f) << $bit;
|
208
|
-
last unless $v & 0x80;
|
209
|
-
++$pos;
|
210
|
-
$bit += 7;
|
211
|
-
}
|
212
|
-
$pos += 49;
|
213
|
-
my @a = unpack("x${pos}fxfxfxfx3fxfxf", $$dataPt);
|
214
|
-
print "$val @a\n";
|
215
|
-
return 1;
|
216
|
-
}
|
217
|
-
|
218
280
|
#------------------------------------------------------------------------------
|
219
281
|
# Process DJI info (ref PH)
|
220
282
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
58
58
|
use Image::ExifTool::MakerNotes;
|
59
59
|
|
60
|
-
$VERSION = '4.
|
60
|
+
$VERSION = '4.55';
|
61
61
|
|
62
62
|
sub ProcessExif($$$);
|
63
63
|
sub WriteExif($$$);
|
@@ -6697,8 +6697,9 @@ sub ProcessExif($$$)
|
|
6697
6697
|
"Format: $fstr\nSize: $size bytes\n";
|
6698
6698
|
if ($size > 4) {
|
6699
6699
|
my $offPt = Get32u($dataPt,$entry+8);
|
6700
|
-
# (test this with ../pics/{CanonEOS-1D_XMarkIII.hif,PanasonicDC-G9.rw2})
|
6701
|
-
my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0) +
|
6700
|
+
# (test this with ../pics/{CanonEOS-1D_XMarkIII.hif,PanasonicDC-G9.rw2,*.raf})
|
6701
|
+
my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0) +
|
6702
|
+
($$et{BASE_FUDGE} || $$et{BASE} || 0);
|
6702
6703
|
$tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
|
6703
6704
|
# highlight tag name (red for bad size)
|
6704
6705
|
my $style = ($bad or not defined $tval) ? 'V' : 'H';
|
@@ -6729,12 +6730,15 @@ sub ProcessExif($$$)
|
|
6729
6730
|
} elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
|
6730
6731
|
if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
|
6731
6732
|
$tval = sprintf('0x%.4x', $tval);
|
6732
|
-
my $actPt = $val + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || 0);
|
6733
|
+
my $actPt = $val + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || $$et{BASE} || 0);
|
6733
6734
|
if ($actPt != $val) {
|
6734
6735
|
$tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
|
6735
6736
|
my $sign = $actPt < $val ? '-' : '';
|
6736
6737
|
$tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val));
|
6737
6738
|
}
|
6739
|
+
if ($$et{EXIF_POS} and not $$et{BASE_FUDGE}) {
|
6740
|
+
$tip .= sprintf("File offset: 0x%.4x\n", $actPt + $$et{EXIF_POS})
|
6741
|
+
}
|
6738
6742
|
} elsif ($$tagInfo{PrintHex}) {
|
6739
6743
|
$tval = sprintf('0x%x', $tval);
|
6740
6744
|
}
|
@@ -12,7 +12,7 @@ use strict;
|
|
12
12
|
use vars qw($VERSION);
|
13
13
|
use Image::ExifTool::Exif;
|
14
14
|
|
15
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.57';
|
16
16
|
|
17
17
|
my %coordConv = (
|
18
18
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
@@ -20,6 +20,34 @@ my %coordConv = (
|
|
20
20
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
|
21
21
|
);
|
22
22
|
|
23
|
+
my %printConvLatRef = (
|
24
|
+
# extract N/S if written from Composite:GPSLatitude
|
25
|
+
# (also allow writing from a signed number)
|
26
|
+
OTHER => sub {
|
27
|
+
my ($val, $inv) = @_;
|
28
|
+
return undef unless $inv;
|
29
|
+
return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i;
|
30
|
+
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
31
|
+
return undef;
|
32
|
+
},
|
33
|
+
N => 'North',
|
34
|
+
S => 'South',
|
35
|
+
);
|
36
|
+
|
37
|
+
my %printConvLonRef = (
|
38
|
+
# extract E/W if written from Composite:GPSLongitude
|
39
|
+
# (also allow writing from a signed number)
|
40
|
+
OTHER => sub {
|
41
|
+
my ($val, $inv) = @_;
|
42
|
+
return undef unless $inv;
|
43
|
+
return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i;
|
44
|
+
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
45
|
+
return undef;
|
46
|
+
},
|
47
|
+
E => 'East',
|
48
|
+
W => 'West',
|
49
|
+
);
|
50
|
+
|
23
51
|
%Image::ExifTool::GPS::Main = (
|
24
52
|
GROUPS => { 0 => 'EXIF', 1 => 'GPS', 2 => 'Location' },
|
25
53
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
|
@@ -43,19 +71,7 @@ my %coordConv = (
|
|
43
71
|
latitudes or negative for south, or a string containing N, North, S or South
|
44
72
|
},
|
45
73
|
Count => 2,
|
46
|
-
PrintConv =>
|
47
|
-
# extract N/S if written from Composite:GPSLatitude
|
48
|
-
# (also allow writing from a signed number)
|
49
|
-
OTHER => sub {
|
50
|
-
my ($val, $inv) = @_;
|
51
|
-
return undef unless $inv;
|
52
|
-
return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i;
|
53
|
-
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
54
|
-
return undef;
|
55
|
-
},
|
56
|
-
N => 'North',
|
57
|
-
S => 'South',
|
58
|
-
},
|
74
|
+
PrintConv => \%printConvLatRef,
|
59
75
|
},
|
60
76
|
0x0002 => {
|
61
77
|
Name => 'GPSLatitude',
|
@@ -72,19 +88,7 @@ my %coordConv = (
|
|
72
88
|
ExifTool will also accept a number when writing this tag, positive for east
|
73
89
|
longitudes or negative for west, or a string containing E, East, W or West
|
74
90
|
},
|
75
|
-
PrintConv =>
|
76
|
-
# extract E/W if written from Composite:GPSLongitude
|
77
|
-
# (also allow writing from a signed number)
|
78
|
-
OTHER => sub {
|
79
|
-
my ($val, $inv) = @_;
|
80
|
-
return undef unless $inv;
|
81
|
-
return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i;
|
82
|
-
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
83
|
-
return undef;
|
84
|
-
},
|
85
|
-
E => 'East',
|
86
|
-
W => 'West',
|
87
|
-
},
|
91
|
+
PrintConv => \%printConvLonRef,
|
88
92
|
},
|
89
93
|
0x0004 => {
|
90
94
|
Name => 'GPSLongitude',
|
@@ -238,7 +242,7 @@ my %coordConv = (
|
|
238
242
|
Writable => 'string',
|
239
243
|
Notes => 'tags 0x0013-0x001a used for subject location according to MWG 2.0',
|
240
244
|
Count => 2,
|
241
|
-
PrintConv =>
|
245
|
+
PrintConv => \%printConvLatRef,
|
242
246
|
},
|
243
247
|
0x0014 => {
|
244
248
|
Name => 'GPSDestLatitude',
|
@@ -251,7 +255,7 @@ my %coordConv = (
|
|
251
255
|
Name => 'GPSDestLongitudeRef',
|
252
256
|
Writable => 'string',
|
253
257
|
Count => 2,
|
254
|
-
PrintConv =>
|
258
|
+
PrintConv => \%printConvLonRef,
|
255
259
|
},
|
256
260
|
0x0016 => {
|
257
261
|
Name => 'GPSDestLongitude',
|
@@ -18,7 +18,8 @@
|
|
18
18
|
# specifying $Image::ExifTool::Geolocation::altDir. This
|
19
19
|
# database and has entries in the same order as Geolocation.dat,
|
20
20
|
# and each entry is a newline-separated list of alternate names
|
21
|
-
# terminated by a null byte.
|
21
|
+
# terminated by a null byte. These alternate names are used
|
22
|
+
# only when searching for a city by name (eg. "Big Apple").
|
22
23
|
#
|
23
24
|
# Databases are based on data from geonames.org with a
|
24
25
|
# Creative Commons license, reformatted as follows in the
|