exiftool-vendored.exe 12.26.0 → 12.33.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 +119 -4
- package/bin/exiftool_files/README +44 -43
- package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
- package/bin/exiftool_files/config_files/convert_regions.config +25 -14
- package/bin/exiftool_files/config_files/example.config +1 -1
- package/bin/exiftool_files/exiftool.pl +79 -66
- package/bin/exiftool_files/fmt_files/gpx.fmt +1 -1
- package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +11 -3
- package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -7
- package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +13 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +98 -4
- package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +35 -10
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +13 -2
- package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +15 -3
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +60 -26
- package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +153 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +60 -59
- package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +103 -7
- package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +14 -3
- package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +10 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +9 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +93 -0
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +9 -12
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +14 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +27 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +6 -0
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +105 -24
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
- package/bin/exiftool_files/lib/Image/ExifTool/README +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +6 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +47 -10
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +85 -34
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +65 -5
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +153 -32
- package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +18 -11
- package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +2 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +3 -0
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +21 -4
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +121 -2
- package/bin/exiftool_files/lib/Image/ExifTool.pm +8867 -8835
- package/bin/exiftool_files/lib/Image/ExifTool.pod +58 -56
- package/package.json +3 -3
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.52';
|
|
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)
|
|
@@ -187,7 +187,7 @@ $VERSION = '4.48';
|
|
|
187
187
|
37.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)', #38
|
|
188
188
|
37.3 => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]', #34
|
|
189
189
|
37.4 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro', #forum2937
|
|
190
|
-
38 => 'Canon EF 80-200mm f/4.5-5.6', #32
|
|
190
|
+
38 => 'Canon EF 80-200mm f/4.5-5.6 II', #32 (II added ref https://github.com/Exiv2/exiv2/issues/1906)
|
|
191
191
|
39 => 'Canon EF 75-300mm f/4-5.6',
|
|
192
192
|
40 => 'Canon EF 28-80mm f/3.5-5.6',
|
|
193
193
|
41 => 'Canon EF 28-90mm f/4-5.6', #32
|
|
@@ -519,7 +519,8 @@ $VERSION = '4.48';
|
|
|
519
519
|
507 => 'Canon EF 16-35mm f/4L IS USM', #42
|
|
520
520
|
508 => 'Canon EF 11-24mm f/4L USM or Tamron Lens', #PH
|
|
521
521
|
508.1 => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #PH
|
|
522
|
-
624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S', #IB (018)
|
|
522
|
+
624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens', #IB (018)
|
|
523
|
+
624.1 => 'Sigma 150-600mm f/5-6.3 | C', #ChrisSkopec
|
|
523
524
|
747 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens', #JR
|
|
524
525
|
747.1 => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #50
|
|
525
526
|
748 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens', #JR (1.4x Mk III)
|
|
@@ -557,7 +558,8 @@ $VERSION = '4.48';
|
|
|
557
558
|
4158 => 'Canon EF-S 18-55mm f/4-5.6 IS STM', #PH
|
|
558
559
|
4159 => 'Canon EF-M 32mm f/1.4 STM', #42
|
|
559
560
|
4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
|
|
560
|
-
4208 => 'Sigma 56mm f/1.4 DC DN | C', #forum10603
|
|
561
|
+
4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
|
|
562
|
+
4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016)
|
|
561
563
|
# (Nano USM lenses - 0x90xx)
|
|
562
564
|
36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
|
|
563
565
|
36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42
|
|
@@ -592,6 +594,9 @@ $VERSION = '4.48';
|
|
|
592
594
|
'61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
|
|
593
595
|
'61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
|
|
594
596
|
'61182.22' => 'Canon RF 50mm F1.8 STM', #42
|
|
597
|
+
'61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
|
|
598
|
+
'61182.24' => 'Canon RF 16mm F2.8 STM', #42
|
|
599
|
+
#'61182.xx' => 'Canon RF 100mm F2.8L MACRO IS USM',
|
|
595
600
|
65535 => 'n/a',
|
|
596
601
|
);
|
|
597
602
|
|
|
@@ -6727,7 +6732,17 @@ my %ciMaxFocal = (
|
|
|
6727
6732
|
PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35',
|
|
6728
6733
|
},
|
|
6729
6734
|
# 22 - values: 0, 1
|
|
6730
|
-
|
|
6735
|
+
23 => { #JohnMoyer (forum12925)
|
|
6736
|
+
Name => 'ShutterMode',
|
|
6737
|
+
PrintConv => {
|
|
6738
|
+
0 => 'Mechanical',
|
|
6739
|
+
1 => 'Electronic First Curtain',
|
|
6740
|
+
2 => 'Electronic',
|
|
6741
|
+
# 3 => ?
|
|
6742
|
+
# 21 => ?
|
|
6743
|
+
# 22 => ?
|
|
6744
|
+
},
|
|
6745
|
+
},
|
|
6731
6746
|
25 => { #PH
|
|
6732
6747
|
Name => 'FlashExposureLock',
|
|
6733
6748
|
PrintConv => \%offOn,
|
|
@@ -6760,6 +6775,9 @@ my %ciMaxFocal = (
|
|
|
6760
6775
|
277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
|
|
6761
6776
|
278 => 'Canon RF 70-200mm F4L IS USM', #42
|
|
6762
6777
|
280 => 'Canon RF 50mm F1.8 STM', #42
|
|
6778
|
+
281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
|
|
6779
|
+
288 => 'Canon RF 16mm F2.8 STM', #42
|
|
6780
|
+
#xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
|
|
6763
6781
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6764
6782
|
},
|
|
6765
6783
|
},
|
|
@@ -9253,8 +9271,9 @@ sub PrintLensID(@)
|
|
|
9253
9271
|
push @likely, $tclens;
|
|
9254
9272
|
if ($maxAperture) {
|
|
9255
9273
|
# (not 100% sure that TC affects MaxAperture, but it should!)
|
|
9256
|
-
|
|
9257
|
-
next if $maxAperture
|
|
9274
|
+
# (RF 24-105mm F4L IS USM shows a MaxAperture of 4.177)
|
|
9275
|
+
next if $maxAperture < $sa * $tc - 0.18;
|
|
9276
|
+
next if $maxAperture > $la * $tc + 0.18;
|
|
9258
9277
|
}
|
|
9259
9278
|
push @matches, $tclens;
|
|
9260
9279
|
}
|
|
@@ -15,7 +15,7 @@ use strict;
|
|
|
15
15
|
use vars qw($VERSION);
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
|
|
18
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.06';
|
|
19
19
|
|
|
20
20
|
# DPX tags
|
|
21
21
|
%Image::ExifTool::DPX::Main = (
|
|
@@ -156,7 +156,18 @@ $VERSION = '1.05';
|
|
|
156
156
|
1532=> { Name => 'SourceCreateDate', Format => 'string[24]' },
|
|
157
157
|
1556=> { Name => 'InputDeviceName', Format => 'string[32]' },
|
|
158
158
|
1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
|
|
159
|
-
# 1620=> { Name => '
|
|
159
|
+
# 1620 => { Name => 'Border', Format => 'int16u[4]' },
|
|
160
|
+
1628 => {
|
|
161
|
+
Name => 'AspectRatio',
|
|
162
|
+
Format => 'int32u[2]',
|
|
163
|
+
RawConv => '$val =~ /4294967295/ ? undef : $val', # ignore undefined values
|
|
164
|
+
PrintConv => q{
|
|
165
|
+
return 'undef' if $val eq '0 0';
|
|
166
|
+
return 'inf' if $val=~/ 0$/;
|
|
167
|
+
my @a=split(' ',$val);
|
|
168
|
+
return join(':', Rationalize($a[0]/$a[1]));
|
|
169
|
+
},
|
|
170
|
+
},
|
|
160
171
|
1724 => { Name => 'OriginalFrameRate',Format => 'float' },
|
|
161
172
|
1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2
|
|
162
173
|
1732 => { Name => 'FrameID', Format => 'string[32]' },
|
|
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
56
56
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
57
57
|
use Image::ExifTool::MakerNotes;
|
|
58
58
|
|
|
59
|
-
$VERSION = '4.
|
|
59
|
+
$VERSION = '4.37';
|
|
60
60
|
|
|
61
61
|
sub ProcessExif($$$);
|
|
62
62
|
sub WriteExif($$$);
|
|
@@ -265,6 +265,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
|
|
265
265
|
32892 => 'Sequential Color Filter', #JR (Sony ARQ)
|
|
266
266
|
34892 => 'Linear Raw', #2
|
|
267
267
|
51177 => 'Depth Map', # (DNG 1.5)
|
|
268
|
+
52527 => 'Semantic Mask', # (DNG 1.6)
|
|
268
269
|
);
|
|
269
270
|
|
|
270
271
|
%orientation = (
|
|
@@ -291,6 +292,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
|
|
|
291
292
|
9 => 'Depth map of reduced-resolution image', # (DNG 1.5)
|
|
292
293
|
16 => 'Enhanced image data', # (DNG 1.5)
|
|
293
294
|
0x10001 => 'Alternate reduced-resolution image', # (DNG 1.2)
|
|
295
|
+
0x10004 => 'Semantic Mask', # (DNG 1.6)
|
|
294
296
|
0xffffffff => 'invalid', #(found in E5700 NEF's)
|
|
295
297
|
BITMASK => {
|
|
296
298
|
0 => 'Reduced resolution',
|
|
@@ -366,6 +368,7 @@ my %opcodeInfo = (
|
|
|
366
368
|
11 => 'DeltaPerColumn',
|
|
367
369
|
12 => 'ScalePerRow',
|
|
368
370
|
13 => 'ScalePerColumn',
|
|
371
|
+
14 => 'WarpRectilinear2', # (DNG 1.6)
|
|
369
372
|
},
|
|
370
373
|
PrintConvInv => undef, # (so the inverse conversion is not performed)
|
|
371
374
|
);
|
|
@@ -3038,12 +3041,12 @@ my %opcodeInfo = (
|
|
|
3038
3041
|
},
|
|
3039
3042
|
},
|
|
3040
3043
|
#
|
|
3041
|
-
# DNG tags 0xc6XX and
|
|
3044
|
+
# DNG tags 0xc6XX, 0xc7XX and 0xcdXX (ref 2 unless otherwise stated)
|
|
3042
3045
|
#
|
|
3043
3046
|
0xc612 => {
|
|
3044
3047
|
Name => 'DNGVersion',
|
|
3045
3048
|
Notes => q{
|
|
3046
|
-
tags 0xc612-
|
|
3049
|
+
tags 0xc612-0xcd3b are defined by the DNG specification unless otherwise
|
|
3047
3050
|
noted. See L<https://helpx.adobe.com/photoshop/digital-negative.html> for
|
|
3048
3051
|
the specification
|
|
3049
3052
|
},
|
|
@@ -4041,6 +4044,97 @@ my %opcodeInfo = (
|
|
|
4041
4044
|
Protected => 1,
|
|
4042
4045
|
WriteGroup => 'IFD0',
|
|
4043
4046
|
},
|
|
4047
|
+
0xcd2d => { # DNG 1.6
|
|
4048
|
+
Name => 'ProfileGainTableMap',
|
|
4049
|
+
Writable => 'undef',
|
|
4050
|
+
WriteGroup => 'SubIFD',
|
|
4051
|
+
Protected => 1,
|
|
4052
|
+
Binary => 1,
|
|
4053
|
+
},
|
|
4054
|
+
0xcd2e => { # DNG 1.6
|
|
4055
|
+
Name => 'SemanticName',
|
|
4056
|
+
# Writable => 'string',
|
|
4057
|
+
WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
|
|
4058
|
+
},
|
|
4059
|
+
0xcd30 => { # DNG 1.6
|
|
4060
|
+
Name => 'SemanticInstanceIFD',
|
|
4061
|
+
# Writable => 'string',
|
|
4062
|
+
WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
|
|
4063
|
+
},
|
|
4064
|
+
0xcd31 => { # DNG 1.6
|
|
4065
|
+
Name => 'CalibrationIlluminant3',
|
|
4066
|
+
Writable => 'int16u',
|
|
4067
|
+
WriteGroup => 'IFD0',
|
|
4068
|
+
Protected => 1,
|
|
4069
|
+
SeparateTable => 'LightSource',
|
|
4070
|
+
PrintConv => \%lightSource,
|
|
4071
|
+
},
|
|
4072
|
+
0xcd32 => { # DNG 1.6
|
|
4073
|
+
Name => 'CameraCalibration3',
|
|
4074
|
+
Writable => 'rational64s',
|
|
4075
|
+
WriteGroup => 'IFD0',
|
|
4076
|
+
Count => -1,
|
|
4077
|
+
Protected => 1,
|
|
4078
|
+
},
|
|
4079
|
+
0xcd33 => { # DNG 1.6
|
|
4080
|
+
Name => 'ColorMatrix3',
|
|
4081
|
+
Writable => 'rational64s',
|
|
4082
|
+
WriteGroup => 'IFD0',
|
|
4083
|
+
Count => -1,
|
|
4084
|
+
Protected => 1,
|
|
4085
|
+
},
|
|
4086
|
+
0xcd34 => { # DNG 1.6
|
|
4087
|
+
Name => 'ForwardMatrix3',
|
|
4088
|
+
Writable => 'rational64s',
|
|
4089
|
+
WriteGroup => 'IFD0',
|
|
4090
|
+
Count => -1,
|
|
4091
|
+
Protected => 1,
|
|
4092
|
+
},
|
|
4093
|
+
0xcd35 => { # DNG 1.6
|
|
4094
|
+
Name => 'IlluminantData1',
|
|
4095
|
+
Writable => 'undef',
|
|
4096
|
+
WriteGroup => 'IFD0',
|
|
4097
|
+
Protected => 1,
|
|
4098
|
+
},
|
|
4099
|
+
0xcd36 => { # DNG 1.6
|
|
4100
|
+
Name => 'IlluminantData2',
|
|
4101
|
+
Writable => 'undef',
|
|
4102
|
+
WriteGroup => 'IFD0',
|
|
4103
|
+
Protected => 1,
|
|
4104
|
+
},
|
|
4105
|
+
0xcd37 => { # DNG 1.6
|
|
4106
|
+
Name => 'IlluminantData3',
|
|
4107
|
+
Writable => 'undef',
|
|
4108
|
+
WriteGroup => 'IFD0',
|
|
4109
|
+
Protected => 1,
|
|
4110
|
+
},
|
|
4111
|
+
0xcd38 => { # DNG 1.6
|
|
4112
|
+
Name => 'MaskSubArea',
|
|
4113
|
+
# Writable => 'int32u',
|
|
4114
|
+
WriteGroup => 'SubIFD', #? (NC) Semantic Mask IFD (only for Validate)
|
|
4115
|
+
Count => 4,
|
|
4116
|
+
},
|
|
4117
|
+
0xcd39 => { # DNG 1.6
|
|
4118
|
+
Name => 'ProfileHueSatMapData3',
|
|
4119
|
+
%longBin,
|
|
4120
|
+
Writable => 'float',
|
|
4121
|
+
WriteGroup => 'IFD0',
|
|
4122
|
+
Count => -1,
|
|
4123
|
+
Protected => 1,
|
|
4124
|
+
},
|
|
4125
|
+
0xcd3a => { # DNG 1.6
|
|
4126
|
+
Name => 'ReductionMatrix3',
|
|
4127
|
+
Writable => 'rational64s',
|
|
4128
|
+
WriteGroup => 'IFD0',
|
|
4129
|
+
Count => -1,
|
|
4130
|
+
Protected => 1,
|
|
4131
|
+
},
|
|
4132
|
+
0xcd3b => { # DNG 1.6
|
|
4133
|
+
Name => 'RGBTables',
|
|
4134
|
+
Writable => 'undef',
|
|
4135
|
+
WriteGroup => 'IFD0',
|
|
4136
|
+
Protected => 1,
|
|
4137
|
+
},
|
|
4044
4138
|
0xea1c => { #13
|
|
4045
4139
|
Name => 'Padding',
|
|
4046
4140
|
Binary => 1,
|
|
@@ -5918,7 +6012,7 @@ sub ProcessExif($$$)
|
|
|
5918
6012
|
my $size = $count * $formatSize[$format];
|
|
5919
6013
|
my $readSize = $size;
|
|
5920
6014
|
if ($size > 4) {
|
|
5921
|
-
if ($size > 0x7fffffff) {
|
|
6015
|
+
if ($size > 0x7fffffff and (not $tagInfo or not $$tagInfo{ReadFromRAF})) {
|
|
5922
6016
|
$et->Warn(sprintf("Invalid size (%u) for %s %s",$size,$dir,TagName($tagID,$tagInfo)), $inMakerNotes);
|
|
5923
6017
|
++$warnCount;
|
|
5924
6018
|
next;
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
21
|
use Image::ExifTool::Exif;
|
|
22
22
|
use Image::ExifTool::ASF; # for GetGUID()
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.39';
|
|
25
25
|
|
|
26
26
|
sub ProcessFPX($$);
|
|
27
27
|
sub ProcessFPXR($$$);
|
|
@@ -1369,29 +1369,48 @@ sub ReadFPXValue($$$$$;$$)
|
|
|
1369
1369
|
my $flags = $type & 0xf000;
|
|
1370
1370
|
if ($flags) {
|
|
1371
1371
|
if ($flags == VT_VECTOR) {
|
|
1372
|
-
$noPad = 1; # values
|
|
1372
|
+
$noPad = 1; # values sometimes aren't padded inside vectors!!
|
|
1373
1373
|
my $size = $oleFormatSize{VT_VECTOR};
|
|
1374
|
-
|
|
1374
|
+
if ($valPos + $size > $dirEnd) {
|
|
1375
|
+
$et->WarnOnce('Incorrect FPX VT_VECTOR size');
|
|
1376
|
+
last;
|
|
1377
|
+
}
|
|
1375
1378
|
$count = Get32u($dataPt, $valPos);
|
|
1376
1379
|
push @vals, '' if $count == 0; # allow zero-element vector
|
|
1377
1380
|
$valPos += 4;
|
|
1378
1381
|
} else {
|
|
1379
1382
|
# can't yet handle this property flag
|
|
1383
|
+
$et->WarnOnce('Unknown FPX property');
|
|
1380
1384
|
last;
|
|
1381
1385
|
}
|
|
1382
1386
|
}
|
|
1383
1387
|
unless ($format =~ /^VT_/) {
|
|
1384
1388
|
my $size = Image::ExifTool::FormatSize($format) * $count;
|
|
1385
|
-
|
|
1389
|
+
if ($valPos + $size > $dirEnd) {
|
|
1390
|
+
$et->WarnOnce("Incorrect FPX $format size");
|
|
1391
|
+
last;
|
|
1392
|
+
}
|
|
1386
1393
|
@vals = ReadValue($dataPt, $valPos, $format, $count, $size);
|
|
1387
1394
|
# update position to end of value plus padding
|
|
1388
1395
|
$valPos += ($count * $size + 3) & 0xfffffffc;
|
|
1389
1396
|
last;
|
|
1390
1397
|
}
|
|
1391
1398
|
my $size = $oleFormatSize{$format};
|
|
1392
|
-
my ($item, $val);
|
|
1399
|
+
my ($item, $val, $len);
|
|
1393
1400
|
for ($item=0; $item<$count; ++$item) {
|
|
1394
|
-
|
|
1401
|
+
if ($valPos + $size > $dirEnd) {
|
|
1402
|
+
$et->WarnOnce("Truncated FPX $format value");
|
|
1403
|
+
last;
|
|
1404
|
+
}
|
|
1405
|
+
# sometimes VT_VECTOR items are padded to even 4-byte boundaries, and sometimes they aren't
|
|
1406
|
+
if ($noPad and defined $len and $len & 0x03) {
|
|
1407
|
+
my $pad = 4 - ($len & 0x03);
|
|
1408
|
+
if ($valPos + $pad + $size <= $dirEnd) {
|
|
1409
|
+
# skip padding if all zeros
|
|
1410
|
+
$valPos += $pad if substr($$dataPt, $valPos, $pad) eq "\0" x $pad;
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
undef $len;
|
|
1395
1414
|
if ($format eq 'VT_VARIANT') {
|
|
1396
1415
|
my $subType = Get32u($dataPt, $valPos);
|
|
1397
1416
|
$valPos += $size;
|
|
@@ -1429,9 +1448,12 @@ sub ReadFPXValue($$$$$;$$)
|
|
|
1429
1448
|
$val = ($val - 25569) * 24 * 3600 if $val != 0;
|
|
1430
1449
|
$val = Image::ExifTool::ConvertUnixTime($val);
|
|
1431
1450
|
} elsif ($format =~ /STR$/) {
|
|
1432
|
-
|
|
1451
|
+
$len = Get32u($dataPt, $valPos);
|
|
1433
1452
|
$len *= 2 if $format eq 'VT_LPWSTR'; # convert to byte count
|
|
1434
|
-
|
|
1453
|
+
if ($valPos + $len + 4 > $dirEnd) {
|
|
1454
|
+
$et->WarnOnce("Truncated $format value");
|
|
1455
|
+
last;
|
|
1456
|
+
}
|
|
1435
1457
|
$val = substr($$dataPt, $valPos + 4, $len);
|
|
1436
1458
|
if ($format eq 'VT_LPWSTR') {
|
|
1437
1459
|
# convert wide string from Unicode
|
|
@@ -1450,8 +1472,11 @@ sub ReadFPXValue($$$$$;$$)
|
|
|
1450
1472
|
# on even 32-bit boundaries, but this isn't always the case)
|
|
1451
1473
|
$valPos += $noPad ? $len : ($len + 3) & 0xfffffffc;
|
|
1452
1474
|
} elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') {
|
|
1453
|
-
my $len = Get32u($dataPt, $valPos);
|
|
1454
|
-
|
|
1475
|
+
my $len = Get32u($dataPt, $valPos); # (use local $len because we always expect padding)
|
|
1476
|
+
if ($valPos + $len + 4 > $dirEnd) {
|
|
1477
|
+
$et->WarnOnce("Truncated $format value");
|
|
1478
|
+
last;
|
|
1479
|
+
}
|
|
1455
1480
|
$val = substr($$dataPt, $valPos + 4, $len);
|
|
1456
1481
|
# update position for data length plus padding
|
|
1457
1482
|
# (does this padding disappear in arrays too?)
|
|
@@ -28,7 +28,7 @@ use vars qw($VERSION);
|
|
|
28
28
|
use Image::ExifTool qw(:Public);
|
|
29
29
|
use Image::ExifTool::GPS;
|
|
30
30
|
|
|
31
|
-
$VERSION = '1.
|
|
31
|
+
$VERSION = '1.65';
|
|
32
32
|
|
|
33
33
|
sub JITTER() { return 2 } # maximum time jitter
|
|
34
34
|
|
|
@@ -262,8 +262,10 @@ sub LoadTrackLog($$;$)
|
|
|
262
262
|
$param = 'time';
|
|
263
263
|
} elsif (/^(Pos)?Lat/i) {
|
|
264
264
|
$param = 'lat';
|
|
265
|
+
/ref$/i and $param .= 'ref';
|
|
265
266
|
} elsif (/^(Pos)?Lon/i) {
|
|
266
267
|
$param = 'lon';
|
|
268
|
+
/ref$/i and $param .= 'ref';
|
|
267
269
|
} elsif (/^(Pos)?Alt/i) {
|
|
268
270
|
$param = 'alt';
|
|
269
271
|
} elsif (/^(Angle)?(Heading|Track)/i) {
|
|
@@ -453,7 +455,7 @@ DoneFix: $isDate = 1;
|
|
|
453
455
|
# (ExifTool enhancements allow for standard tag names or descriptions as the column headings,
|
|
454
456
|
# add support for time zones and flexible coordinates, and allow new DateTime and Shift columns)
|
|
455
457
|
#
|
|
456
|
-
my ($param, $date, $secs);
|
|
458
|
+
my ($param, $date, $secs, %neg);
|
|
457
459
|
foreach $param (@csvHeadings) {
|
|
458
460
|
my $val = shift @vals;
|
|
459
461
|
last unless defined $val;
|
|
@@ -479,6 +481,10 @@ DoneFix: $isDate = 1;
|
|
|
479
481
|
}
|
|
480
482
|
} elsif ($param eq 'lat' or $param eq 'lon') {
|
|
481
483
|
$$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1);
|
|
484
|
+
} elsif ($param eq 'latref') {
|
|
485
|
+
$neg{lat} = 1 if $val =~ /^S/i;
|
|
486
|
+
} elsif ($param eq 'lonref') {
|
|
487
|
+
$neg{lon} = 1 if $val =~ /^W/i;
|
|
482
488
|
} elsif ($param eq 'runtime') {
|
|
483
489
|
$date = $trackTime;
|
|
484
490
|
$secs = $val;
|
|
@@ -486,6 +492,11 @@ DoneFix: $isDate = 1;
|
|
|
486
492
|
$$fix{$param} = $val;
|
|
487
493
|
}
|
|
488
494
|
}
|
|
495
|
+
# make coordinate negative according to reference direction if necessary
|
|
496
|
+
foreach $param (keys %neg) {
|
|
497
|
+
next unless defined $$fix{$param};
|
|
498
|
+
$$fix{$param} = -abs($$fix{$param});
|
|
499
|
+
}
|
|
489
500
|
if ($date and defined $secs and defined $$fix{lat} and defined $$fix{lon}) {
|
|
490
501
|
$time = $date + $secs;
|
|
491
502
|
$$has{alt} = 1 if defined $$fix{alt};
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
use Image::ExifTool::QuickTime;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.07';
|
|
20
20
|
|
|
21
21
|
sub ProcessGoPro($$$);
|
|
22
22
|
sub ProcessString($$$);
|
|
@@ -386,6 +386,21 @@ my %addUnits = (
|
|
|
386
386
|
Binary => 1,
|
|
387
387
|
},
|
|
388
388
|
# ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
|
|
389
|
+
# the following ref forum12825
|
|
390
|
+
MUID => {
|
|
391
|
+
Name => 'MediaUniqueID',
|
|
392
|
+
PrintConv => q{
|
|
393
|
+
my @a = split ' ', $val;
|
|
394
|
+
$_ = sprintf('%.8x',$_) foreach @a;
|
|
395
|
+
return join('', @a);
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
EXPT => 'MaximumShutterAngle',
|
|
399
|
+
MTRX => 'AccelerometerMatrix',
|
|
400
|
+
ORIN => 'InputOrientation',
|
|
401
|
+
ORIO => 'OutputOrientation',
|
|
402
|
+
UNIF => 'InputUniformity',
|
|
403
|
+
SROT => 'SensorReadoutTime',
|
|
389
404
|
);
|
|
390
405
|
|
|
391
406
|
# GoPro GPS5 tags (ref 2) (Hero5,Hero6)
|
|
@@ -18,11 +18,12 @@ use strict;
|
|
|
18
18
|
use vars qw($VERSION);
|
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
20
20
|
|
|
21
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.57';
|
|
22
22
|
|
|
23
23
|
sub ProcessID3v2($$$);
|
|
24
24
|
sub ProcessPrivate($$$);
|
|
25
25
|
sub ProcessSynText($$$);
|
|
26
|
+
sub ProcessID3Dir($$$);
|
|
26
27
|
sub ConvertID3v1Text($$);
|
|
27
28
|
sub ConvertTimeStamp($);
|
|
28
29
|
|
|
@@ -69,9 +70,10 @@ my %dateTimeConv = (
|
|
|
69
70
|
# This table is just for documentation purposes
|
|
70
71
|
%Image::ExifTool::ID3::Main = (
|
|
71
72
|
VARS => { NO_ID => 1 },
|
|
73
|
+
PROCESS_PROC => \&ProcessID3Dir, # (used to process 'id3 ' chunk in WAV files)
|
|
72
74
|
NOTES => q{
|
|
73
|
-
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG,
|
|
74
|
-
FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
|
75
|
+
ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
|
|
76
|
+
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
|
75
77
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
|
76
78
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
|
77
79
|
"Comment-spa"). See L<http://www.id3.org/> for the official ID3
|
|
@@ -1570,6 +1572,16 @@ sub ProcessID3($$)
|
|
|
1570
1572
|
return $rtnVal;
|
|
1571
1573
|
}
|
|
1572
1574
|
|
|
1575
|
+
#------------------------------------------------------------------------------
|
|
1576
|
+
# Process ID3 directory
|
|
1577
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) dummy tag table ref
|
|
1578
|
+
sub ProcessID3Dir($$$)
|
|
1579
|
+
{
|
|
1580
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
1581
|
+
$et->VerboseDir('ID3', undef, length ${$$dirInfo{DataPt}});
|
|
1582
|
+
return ProcessID3($et, $dirInfo);
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1573
1585
|
#------------------------------------------------------------------------------
|
|
1574
1586
|
# Extract ID3 information from an MP3 audio file
|
|
1575
1587
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
|
@@ -14,7 +14,7 @@ use vars qw($VERSION);
|
|
|
14
14
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
15
15
|
use Image::ExifTool::Import;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.05';
|
|
18
18
|
|
|
19
19
|
sub ProcessJSON($$);
|
|
20
20
|
sub ProcessTag($$$$%);
|
|
@@ -83,8 +83,12 @@ sub ProcessTag($$$$%)
|
|
|
83
83
|
FoundTag($et, $tagTablePtr, $tag, $val, %flags, Struct => 1);
|
|
84
84
|
return unless $et->Options('Struct') > 1;
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
# support hashes with ordered keys
|
|
87
|
+
my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val;
|
|
88
|
+
foreach (@keys) {
|
|
89
|
+
my $tg = $tag . ((/^\d/ and $tag =~ /\d$/) ? '_' : '') . ucfirst;
|
|
90
|
+
$tg =~ s/([^a-zA-Z])([a-z])/$1\U$2/g;
|
|
91
|
+
ProcessTag($et, $tagTablePtr, $tg, $$val{$_}, %flags, Flat => 1);
|
|
88
92
|
}
|
|
89
93
|
} elsif (ref $val eq 'ARRAY') {
|
|
90
94
|
foreach (@$val) {
|