exiftool_vendored 13.10.0 → 13.14.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.
- checksums.yaml +4 -4
- data/bin/Changes +82 -19
- data/bin/MANIFEST +6 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -3
- data/bin/arg_files/exif2xmp.args +4 -0
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/build_geolocation +1 -1
- data/bin/exiftool +208 -150
- data/bin/lib/File/RandomAccess.pm +1 -1
- data/bin/lib/File/RandomAccess.pod +2 -2
- data/bin/lib/Image/ExifTool/AAC.pm +1 -1
- data/bin/lib/Image/ExifTool/AES.pm +1 -1
- data/bin/lib/Image/ExifTool/AFCP.pm +6 -6
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/APP12.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +1 -1
- data/bin/lib/Image/ExifTool/Audible.pm +1 -1
- data/bin/lib/Image/ExifTool/BMP.pm +1 -1
- data/bin/lib/Image/ExifTool/BPG.pm +1 -1
- data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +29 -18
- data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
- data/bin/lib/Image/ExifTool/Canon.pm +8 -4
- data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- data/bin/lib/Image/ExifTool/Casio.pm +1 -1
- data/bin/lib/Image/ExifTool/Charset.pm +1 -1
- data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- data/bin/lib/Image/ExifTool/DJI.pm +150 -46
- data/bin/lib/Image/ExifTool/DNG.pm +1 -1
- data/bin/lib/Image/ExifTool/DPX.pm +1 -1
- data/bin/lib/Image/ExifTool/DV.pm +1 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- data/bin/lib/Image/ExifTool/EXE.pm +123 -32
- data/bin/lib/Image/ExifTool/Exif.pm +7 -4
- data/bin/lib/Image/ExifTool/FITS.pm +1 -1
- data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- data/bin/lib/Image/ExifTool/Flash.pm +1 -1
- data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- data/bin/lib/Image/ExifTool/GE.pm +1 -1
- data/bin/lib/Image/ExifTool/GIF.pm +1 -1
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- data/bin/lib/Image/ExifTool/GM.pm +1 -1
- data/bin/lib/Image/ExifTool/GPS.pm +1 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- data/bin/lib/Image/ExifTool/Geolocation.pm +17 -8
- data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/HTML.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- data/bin/lib/Image/ExifTool/ICO.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +1 -1
- data/bin/lib/Image/ExifTool/IPTC.pm +8 -5
- data/bin/lib/Image/ExifTool/ISO.pm +1 -1
- data/bin/lib/Image/ExifTool/ITC.pm +1 -1
- data/bin/lib/Image/ExifTool/Import.pm +5 -4
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
- data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- data/bin/lib/Image/ExifTool/JSON.pm +1 -1
- data/bin/lib/Image/ExifTool/JVC.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
- data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/LIF.pm +1 -1
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- data/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
- data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +22 -13
- data/bin/lib/Image/ExifTool/MIE.pm +1 -1
- data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/MISB.pm +1 -1
- data/bin/lib/Image/ExifTool/MNG.pm +1 -1
- data/bin/lib/Image/ExifTool/MOI.pm +1 -1
- data/bin/lib/Image/ExifTool/MPC.pm +1 -1
- data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/MPF.pm +1 -1
- data/bin/lib/Image/ExifTool/MRC.pm +1 -1
- data/bin/lib/Image/ExifTool/MWG.pm +1 -1
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +12 -4
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +166 -35
- data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
- data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
- data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- data/bin/lib/Image/ExifTool/Opus.pm +1 -1
- data/bin/lib/Image/ExifTool/Other.pm +1 -1
- data/bin/lib/Image/ExifTool/PCX.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +1 -1
- data/bin/lib/Image/ExifTool/PGF.pm +1 -1
- data/bin/lib/Image/ExifTool/PICT.pm +1 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +1 -1
- data/bin/lib/Image/ExifTool/PPM.pm +1 -1
- data/bin/lib/Image/ExifTool/PSP.pm +1 -1
- data/bin/lib/Image/ExifTool/Palm.pm +1 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +20 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- data/bin/lib/Image/ExifTool/Protobuf.pm +48 -20
- data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +206 -66
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +21 -303
- data/bin/lib/Image/ExifTool/README +4 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- data/bin/lib/Image/ExifTool/Real.pm +1 -1
- data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- data/bin/lib/Image/ExifTool/Red.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
- data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -1
- data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- data/bin/lib/Image/ExifTool/Stim.pm +1 -1
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +3449 -3435
- data/bin/lib/Image/ExifTool/TagNames.pod +164 -47
- data/bin/lib/Image/ExifTool/Text.pm +1 -1
- data/bin/lib/Image/ExifTool/Theora.pm +1 -1
- data/bin/lib/Image/ExifTool/Torrent.pm +3 -3
- data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- data/bin/lib/Image/ExifTool/VCard.pm +1 -1
- data/bin/lib/Image/ExifTool/Validate.pm +1 -1
- data/bin/lib/Image/ExifTool/Vivo.pm +124 -0
- data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- data/bin/lib/Image/ExifTool/WPG.pm +1 -1
- data/bin/lib/Image/ExifTool/WTV.pm +1 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +74 -43
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +21 -16
- data/bin/lib/Image/ExifTool/XISF.pm +1 -1
- data/bin/lib/Image/ExifTool/XMP.pm +1 -1
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- data/bin/lib/Image/ExifTool/iWork.pm +1 -1
- data/bin/lib/Image/ExifTool.pm +34 -12
- data/bin/lib/Image/ExifTool.pod +57 -46
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +4 -2
@@ -5,22 +5,30 @@
|
|
5
5
|
#
|
6
6
|
# Revisions: 2016-07-25 - P. Harvey Created
|
7
7
|
# 2017-06-23 - PH Added XMP tags
|
8
|
+
# 2024-12-04 - PH Added protobuf tags
|
8
9
|
#------------------------------------------------------------------------------
|
9
10
|
|
10
11
|
package Image::ExifTool::DJI;
|
11
12
|
|
12
13
|
use strict;
|
13
|
-
use vars qw($VERSION);
|
14
|
+
use vars qw($VERSION %knownProtocol);
|
14
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
15
16
|
use Image::ExifTool::Exif;
|
16
17
|
use Image::ExifTool::XMP;
|
17
18
|
use Image::ExifTool::GPS;
|
18
19
|
use Image::ExifTool::Protobuf;
|
19
20
|
|
20
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.12';
|
21
22
|
|
22
23
|
sub ProcessDJIInfo($$$);
|
23
24
|
|
25
|
+
%knownProtocol = (
|
26
|
+
'dvtm_ac203.proto' => 1, # Osmo Action 4
|
27
|
+
'dvtm_ac204.proto' => 1, # Osmo Action 5
|
28
|
+
'dvtm_AVATA2.proto' => 1, # Avanta 2
|
29
|
+
'dvtm_wm265e.proto' => 1, # Mavic 3
|
30
|
+
);
|
31
|
+
|
24
32
|
my %convFloat2 = (
|
25
33
|
PrintConv => 'sprintf("%+.2f", $val)',
|
26
34
|
PrintConvInv => '$val',
|
@@ -189,47 +197,50 @@ my %convFloat2 = (
|
|
189
197
|
|
190
198
|
# metadata in protobuf format (djmd and dbgi meta types, ref PH)
|
191
199
|
%Image::ExifTool::DJI::Protobuf = (
|
192
|
-
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => '
|
200
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
193
201
|
TAG_PREFIX => '',
|
194
202
|
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
195
203
|
NOTES => q{
|
196
|
-
Tags found in protobuf-format DJI
|
197
|
-
|
198
|
-
setting the Unknown option to 1
|
199
|
-
tags
|
200
|
-
with the hierarchical protobuf field numbers.
|
201
|
-
|
204
|
+
Tags found in protobuf-format DJI djmd and dbgi timed metadata. The known
|
205
|
+
tags listed below are extracted by default, but unknown djmd tags may be
|
206
|
+
extracted as well by setting the Unknown option to 1, or 2 to also extract
|
207
|
+
unknown dbgi debug tags. Tag ID's are composed of the corresponding .proto
|
208
|
+
file name combined with the hierarchical protobuf field numbers.
|
209
|
+
|
210
|
+
ExifTool currently extracts timed GPS plus a few other tags from DJI devices
|
211
|
+
which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
|
212
|
+
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
|
213
|
+
dvtm_wm265e.proto (Mavic 3).
|
214
|
+
|
215
|
+
Note that with the protobuf format, numerical tags missing from the output
|
216
|
+
for a given protocol should be considered to have the default value of 0.
|
217
|
+
},
|
218
|
+
Protocol => {
|
219
|
+
RawConv => q{
|
220
|
+
unless ($Image::ExifTool::DJI::knownProtocol{$val}) {
|
221
|
+
$self->Warn("Unknown protocol $val (please submit sample for testing)");
|
222
|
+
}
|
223
|
+
return $val;
|
224
|
+
},
|
202
225
|
},
|
203
|
-
|
226
|
+
#
|
227
|
+
# Osmo Action 4
|
228
|
+
#
|
229
|
+
'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
|
204
230
|
# dvtm_ac203_1-1-6 - some version number
|
205
231
|
'dvtm_ac203_1-1-10' => 'Model',
|
206
|
-
'dvtm_ac203_2-3
|
207
|
-
|
208
|
-
|
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")',
|
232
|
+
'dvtm_ac203_2-3' => {
|
233
|
+
Name => 'FrameInfo',
|
234
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
224
235
|
},
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
236
|
+
# dvtm_ac203_3-4-1-4 - model code?
|
237
|
+
'dvtm_ac203_3-4-2-1' => {
|
238
|
+
Name => 'GPSInfo',
|
239
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
230
240
|
},
|
231
241
|
'dvtm_ac203_3-4-2-2' => {
|
232
242
|
Name => 'GPSAltitude',
|
243
|
+
Groups => { 2 => 'Location' },
|
233
244
|
Format => 'unsigned',
|
234
245
|
ValueConv => '$val / 1000',
|
235
246
|
},
|
@@ -241,38 +252,131 @@ my %convFloat2 = (
|
|
241
252
|
ValueConv => '$val =~ tr/-/:/; $val',
|
242
253
|
PrintConv => '$self->ConvertDateTime($val)',
|
243
254
|
},
|
255
|
+
#
|
256
|
+
# Osmo Action 5
|
257
|
+
#
|
258
|
+
'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
|
259
|
+
# dvtm_ac204_1-1-6 - some version number
|
260
|
+
'dvtm_ac204_1-1-10' => 'Model',
|
261
|
+
'dvtm_ac204_2-3' => {
|
262
|
+
Name => 'FrameInfo',
|
263
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
264
|
+
},
|
265
|
+
# dvtm_ac204_3-4-1-4 - model code?
|
266
|
+
'dvtm_ac204_3-4-2-1' => {
|
267
|
+
Name => 'GPSInfo',
|
268
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
269
|
+
},
|
270
|
+
# dvtm_ac204_3-2-4-1 - shutter speed? (rational)
|
271
|
+
'dvtm_ac204_3-4-2-2' => {
|
272
|
+
Name => 'GPSAltitude',
|
273
|
+
Groups => { 2 => 'Location' },
|
274
|
+
Format => 'unsigned',
|
275
|
+
ValueConv => '$val / 1000',
|
276
|
+
},
|
277
|
+
'dvtm_ac204_3-4-2-6-1' => {
|
278
|
+
Name => 'GPSDateTime',
|
279
|
+
Format => 'string',
|
280
|
+
Groups => { 2 => 'Time' },
|
281
|
+
RawConv => '$$self{GPSDateTime} = $val',
|
282
|
+
ValueConv => '$val =~ tr/-/:/; $val',
|
283
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
284
|
+
},
|
285
|
+
#
|
286
|
+
# Avanta 2
|
287
|
+
#
|
244
288
|
# dvtm_AVATA2_1-1-2 - some version number
|
245
289
|
# dvtm_AVATA2_1-1-3 - some version number
|
290
|
+
'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
|
246
291
|
'dvtm_AVATA2_1-1-10' => 'Model',
|
247
|
-
|
248
|
-
'dvtm_AVATA2_2-3-1' =>
|
249
|
-
'dvtm_AVATA2_2-3
|
250
|
-
|
292
|
+
# dvtm_AVATA2_2-2-1-4 - model code?
|
293
|
+
'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
|
294
|
+
'dvtm_AVATA2_2-3' => {
|
295
|
+
Name => 'FrameInfo',
|
296
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
297
|
+
},
|
251
298
|
# dvtm_AVATA2_3-1-1 - frame number (starting at 1)
|
252
299
|
'dvtm_AVATA2_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
|
253
300
|
Name => 'TimeStamp',
|
301
|
+
Groups => { 2 => 'Time' },
|
254
302
|
Format => 'unsigned',
|
255
303
|
# milliseconds, but I don't know what the zero is
|
256
304
|
ValueConv => '$val / 1e6',
|
257
305
|
},
|
258
306
|
# dvtm_AVATA2_3-2-1-4 - model code?
|
307
|
+
# dvtm_AVATA2_3-2-1-5 - frame rate?
|
308
|
+
# dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
|
259
309
|
# dvtm_AVATA2_3-4-1-4 - model code?
|
260
|
-
|
261
|
-
|
310
|
+
# dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
|
311
|
+
'dvtm_AVATA2_3-4-4-1' => {
|
312
|
+
Name => 'GPSInfo',
|
313
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
314
|
+
},
|
315
|
+
#
|
316
|
+
# Mavic 3
|
317
|
+
#
|
318
|
+
'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
|
319
|
+
'dvtm_wm265e_1-1-10' => 'Model',
|
320
|
+
'dvtm_wm265e_2-2' => {
|
321
|
+
Name => 'FrameInfo',
|
322
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
323
|
+
},
|
324
|
+
# dvtm_wm265e_3-2-1-4 - model code?
|
325
|
+
'dvtm_wm265e_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
326
|
+
'dvtm_wm265e_3-2-3-1' => {
|
327
|
+
Name => 'ShutterSpeed',
|
328
|
+
Format => 'rational',
|
329
|
+
ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
|
330
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
331
|
+
},
|
332
|
+
# dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
|
333
|
+
'dvtm_wm265e_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
|
334
|
+
'dvtm_wm265e_3-3-4-1' => {
|
335
|
+
Name => 'GPSInfo',
|
336
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
337
|
+
},
|
338
|
+
'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
|
339
|
+
'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
|
340
|
+
'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
|
341
|
+
'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
|
342
|
+
'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
343
|
+
'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
|
344
|
+
'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
|
345
|
+
'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
346
|
+
);
|
347
|
+
|
348
|
+
%Image::ExifTool::DJI::FrameInfo = (
|
349
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
|
350
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
351
|
+
VARS => { HEX_ID => 0 },
|
352
|
+
1 => { Name => 'FrameWidth', Format => 'unsigned' },
|
353
|
+
2 => { Name => 'FrameHeight', Format => 'unsigned' },
|
354
|
+
3 => { Name => 'FrameRate', Format => 'float' },
|
355
|
+
);
|
356
|
+
|
357
|
+
%Image::ExifTool::DJI::GPSInfo = (
|
358
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
|
359
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
360
|
+
VARS => { HEX_ID => 0 },
|
361
|
+
1 => {
|
362
|
+
Name => 'CoordinateUnits',
|
262
363
|
Format => 'unsigned',
|
263
|
-
|
264
|
-
|
364
|
+
Notes => 'not extracted, but used internally to convert coordinates to degrees',
|
365
|
+
# don't extract this -- just convert to degrees
|
366
|
+
RawConv => '$$self{CoordUnits} = $val; undef',
|
367
|
+
# PrintConv => { 0 => 'Radians', 1 => 'Degrees' },
|
265
368
|
},
|
266
|
-
|
369
|
+
2 => {
|
267
370
|
Name => 'GPSLatitude',
|
268
371
|
Format => 'double',
|
269
|
-
|
372
|
+
# set ExifTool GPSLatitude/GPSLongitude members so GPSDateTime will be generated if necessary
|
373
|
+
RawConv => '$$self{GPSLatitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
270
374
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
271
375
|
},
|
272
|
-
|
376
|
+
3 => {
|
273
377
|
Name => 'GPSLongitude',
|
274
378
|
Format => 'double',
|
275
|
-
RawConv => '$$self{GPSLongitude} = $$self{
|
379
|
+
RawConv => '$$self{GPSLongitude} = $$self{CoordUnits} ? $val : $val * 180 / 3.141592653589793', # (NC)
|
276
380
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
277
381
|
},
|
278
382
|
);
|
@@ -328,7 +432,7 @@ the maker notes in images from some DJI Phantom drones.
|
|
328
432
|
|
329
433
|
=head1 AUTHOR
|
330
434
|
|
331
|
-
Copyright 2003-
|
435
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
332
436
|
|
333
437
|
This library is free software; you can redistribute it and/or modify it
|
334
438
|
under the same terms as Perl itself.
|
@@ -849,7 +849,7 @@ information in DNG (Digital Negative) images.
|
|
849
849
|
|
850
850
|
=head1 AUTHOR
|
851
851
|
|
852
|
-
Copyright 2003-
|
852
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
853
853
|
|
854
854
|
This library is free software; you can redistribute it and/or modify it
|
855
855
|
under the same terms as Perl itself.
|
@@ -225,7 +225,7 @@ metadata from DPX (Digital Picture Exchange) images.
|
|
225
225
|
|
226
226
|
=head1 AUTHOR
|
227
227
|
|
228
|
-
Copyright 2003-
|
228
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
229
229
|
|
230
230
|
This library is free software; you can redistribute it and/or modify it
|
231
231
|
under the same terms as Perl itself.
|
@@ -291,7 +291,7 @@ information from DV (raw Digital Video) files.
|
|
291
291
|
|
292
292
|
=head1 AUTHOR
|
293
293
|
|
294
|
-
Copyright 2003-
|
294
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
295
295
|
|
296
296
|
This library is free software; you can redistribute it and/or modify it
|
297
297
|
under the same terms as Perl itself.
|
@@ -372,7 +372,7 @@ This file contains tag definitions for the Darwin Core XMP namespace.
|
|
372
372
|
|
373
373
|
=head1 AUTHOR
|
374
374
|
|
375
|
-
Copyright 2003-
|
375
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
376
376
|
|
377
377
|
This library is free software; you can redistribute it and/or modify it
|
378
378
|
under the same terms as Perl itself.
|
@@ -353,7 +353,7 @@ Image::ExifTool::AIFF.
|
|
353
353
|
|
354
354
|
=head1 AUTHOR
|
355
355
|
|
356
|
-
Copyright 2003-
|
356
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
357
357
|
|
358
358
|
This library is free software; you can redistribute it and/or modify it
|
359
359
|
under the same terms as Perl itself.
|
@@ -13,6 +13,7 @@
|
|
13
13
|
# 5) http://msdn.microsoft.com/en-us/library/ms809762.aspx
|
14
14
|
# 6) http://code.google.com/p/pefile/
|
15
15
|
# 7) http://www.codeproject.com/KB/DLL/showver.aspx
|
16
|
+
# 8) https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
|
16
17
|
#------------------------------------------------------------------------------
|
17
18
|
|
18
19
|
package Image::ExifTool::EXE;
|
@@ -21,7 +22,7 @@ use strict;
|
|
21
22
|
use vars qw($VERSION);
|
22
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
23
24
|
|
24
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.21';
|
25
26
|
|
26
27
|
sub ProcessPEResources($$);
|
27
28
|
sub ProcessPEVersion($$);
|
@@ -171,6 +172,13 @@ my %languageCode = (
|
|
171
172
|
'100C' => 'French (Swiss)',
|
172
173
|
);
|
173
174
|
|
175
|
+
my %int32uTime = (
|
176
|
+
Format => 'int32u',
|
177
|
+
Groups => { 0 => 'EXE', 1 => 'EXE', 2 => 'Time' },
|
178
|
+
ValueConv => 'ConvertUnixTime($val,1)',
|
179
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
180
|
+
);
|
181
|
+
|
174
182
|
# Information extracted from PE COFF (Windows EXE) file header
|
175
183
|
%Image::ExifTool::EXE::Main = (
|
176
184
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -215,13 +223,7 @@ my %languageCode = (
|
|
215
223
|
0xc0ee => 'clr pure MSIL',
|
216
224
|
},
|
217
225
|
},
|
218
|
-
2 => {
|
219
|
-
Name => 'TimeStamp',
|
220
|
-
Format => 'int32u',
|
221
|
-
Groups => { 2 => 'Time' },
|
222
|
-
ValueConv => 'ConvertUnixTime($val,1)',
|
223
|
-
PrintConv => '$self->ConvertDateTime($val)',
|
224
|
-
},
|
226
|
+
2 => { Name => 'TimeStamp', %int32uTime },
|
225
227
|
9 => {
|
226
228
|
Name => 'ImageFileCharacteristics',
|
227
229
|
# ref https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_file_header
|
@@ -243,6 +245,10 @@ my %languageCode = (
|
|
243
245
|
15 => 'Bytes reversed hi',
|
244
246
|
}},
|
245
247
|
},
|
248
|
+
#
|
249
|
+
# optional header starts at index 10
|
250
|
+
# (note: all extracted tags are the same for 32 and 64-bit versions of the optional header)
|
251
|
+
#
|
246
252
|
10 => {
|
247
253
|
Name => 'PEType',
|
248
254
|
PrintHex => 1,
|
@@ -308,6 +314,42 @@ my %languageCode = (
|
|
308
314
|
},
|
309
315
|
);
|
310
316
|
|
317
|
+
# information extracted from newer CodeView PDB70 ("RSDS") debug entry
|
318
|
+
%Image::ExifTool::EXE::DebugRSDS = (
|
319
|
+
GROUPS => { 2 => 'Other' },
|
320
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
321
|
+
NOTES => 'CodeView RSDS debug information found in some Windows EXE files.',
|
322
|
+
0 => {
|
323
|
+
Name => 'PDBModifyDate',
|
324
|
+
Notes => 'Taken from debug directory entry pointing to RSDS record.',
|
325
|
+
%int32uTime,
|
326
|
+
},
|
327
|
+
20 => { Name => 'PDBAge', Format => 'int32u' },
|
328
|
+
24 => { Name => 'PDBFileName', Format => 'string' },
|
329
|
+
);
|
330
|
+
|
331
|
+
# information extracted from older CodeView PDB20 ("NB10") debug entry
|
332
|
+
%Image::ExifTool::EXE::DebugNB10 = (
|
333
|
+
GROUPS => { 2 => 'Other' },
|
334
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
335
|
+
NOTES => 'CodeView NB10 debug information found in some Windows EXE files.',
|
336
|
+
0 => {
|
337
|
+
Name => 'PDBModifyDate',
|
338
|
+
Notes => 'Taken from debug directory entry pointing to NB10 record.',
|
339
|
+
%int32uTime,
|
340
|
+
},
|
341
|
+
8 => { Name => 'PDBCreateDate',%int32uTime },
|
342
|
+
12 => { Name => 'PDBAge', Format => 'int32u' },
|
343
|
+
16 => { Name => 'PDBFileName', Format => 'string' },
|
344
|
+
);
|
345
|
+
|
346
|
+
%Image::ExifTool::EXE::Misc = (
|
347
|
+
GROUPS => { 2 => 'Other' },
|
348
|
+
VARS => { ID_LABEL => 'Index1' },
|
349
|
+
NOTES => 'Miscellaneous CodeView debug information in Windows EXE files.',
|
350
|
+
12 => 'EXEFileName',
|
351
|
+
);
|
352
|
+
|
311
353
|
# PE file version information (ref 6)
|
312
354
|
%Image::ExifTool::EXE::PEVersion = (
|
313
355
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -974,6 +1016,22 @@ sub ProcessPEVersion($$)
|
|
974
1016
|
return 1;
|
975
1017
|
}
|
976
1018
|
|
1019
|
+
#------------------------------------------------------------------------------
|
1020
|
+
# Get actual file offset given a virtual address in a PE file
|
1021
|
+
# Inputs: 0) virtual address, 1) section list ref
|
1022
|
+
# Returns: absolute file offset or undef on error
|
1023
|
+
sub GetFileOffset($$)
|
1024
|
+
{
|
1025
|
+
my ($addr, $sections) = @_;
|
1026
|
+
my $section;
|
1027
|
+
foreach $section (@$sections) {
|
1028
|
+
next unless $addr >= $$section{VirtualAddress} and
|
1029
|
+
$addr < $$section{VirtualAddress} + $$section{Size};
|
1030
|
+
return $addr + $$section{Base} - $$section{VirtualAddress};
|
1031
|
+
}
|
1032
|
+
return undef;
|
1033
|
+
}
|
1034
|
+
|
977
1035
|
#------------------------------------------------------------------------------
|
978
1036
|
# Process Windows PE Resources
|
979
1037
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref
|
@@ -994,6 +1052,7 @@ sub ProcessPEResources($$)
|
|
994
1052
|
my $nameEntries = Get16u(\$buff, 12);
|
995
1053
|
my $idEntries = Get16u(\$buff, 14);
|
996
1054
|
my $count = $nameEntries + $idEntries;
|
1055
|
+
return 0 if $count > 10000;
|
997
1056
|
$raf->Read($buff, $count * 8) == $count * 8 or return 0;
|
998
1057
|
# loop through all resource entries
|
999
1058
|
for ($item=0; $item<$count; ++$item) {
|
@@ -1023,18 +1082,12 @@ sub ProcessPEResources($$)
|
|
1023
1082
|
# get position of this resource in the file
|
1024
1083
|
my $buf2;
|
1025
1084
|
$raf->Seek($entryPos + $base, 0) and $raf->Read($buf2, 16) == 16 or return 0;
|
1026
|
-
my $
|
1085
|
+
my $addr = Get32u(\$buf2, 0);
|
1027
1086
|
my $len = Get32u(\$buf2, 4);
|
1028
1087
|
# determine which section this is in so we can convert the virtual address
|
1029
|
-
my ($
|
1030
|
-
|
1031
|
-
|
1032
|
-
$off < $$section{VirtualAddress} + $$section{Size};
|
1033
|
-
$filePos = $off + $$section{Base} - $$section{VirtualAddress};
|
1034
|
-
last;
|
1035
|
-
}
|
1036
|
-
return 0 unless $filePos;
|
1037
|
-
$raf->Seek($filePos, 0) and $raf->Read($buf2, $len) == $len or return 0;
|
1088
|
+
my $fileOff = GetFileOffset($addr, $$dirInfo{Sections});
|
1089
|
+
return 0 unless $fileOff;
|
1090
|
+
$raf->Seek($fileOff, 0) and $raf->Read($buf2, $len) == $len or return 0;
|
1038
1091
|
ProcessPEVersion($et, {
|
1039
1092
|
DataPt => \$buf2,
|
1040
1093
|
DataLen => $len,
|
@@ -1050,7 +1103,8 @@ sub ProcessPEResources($$)
|
|
1050
1103
|
#------------------------------------------------------------------------------
|
1051
1104
|
# Process Windows PE file data dictionary
|
1052
1105
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref
|
1053
|
-
# Returns: true on success
|
1106
|
+
# Returns: true on success or if the PE resources didn't exist, or false on error
|
1107
|
+
# processing the PE resources
|
1054
1108
|
sub ProcessPEDict($$)
|
1055
1109
|
{
|
1056
1110
|
my ($et, $dirInfo) = @_;
|
@@ -1078,6 +1132,7 @@ sub ProcessPEDict($$)
|
|
1078
1132
|
Sections => \@sections,
|
1079
1133
|
);
|
1080
1134
|
}
|
1135
|
+
$$dirInfo{Sections} = \@sections; # return section information
|
1081
1136
|
# process the first resource section
|
1082
1137
|
ProcessPEResources($et, \%dirInfo) or return 0 if %dirInfo;
|
1083
1138
|
return 1;
|
@@ -1228,11 +1283,12 @@ sub ProcessEXE($$)
|
|
1228
1283
|
# read the rest of the optional header if necessary
|
1229
1284
|
my $optSize = Get16u(\$buff, 20);
|
1230
1285
|
my $more = $optSize + 24 - $size;
|
1286
|
+
my $magic = 0;
|
1231
1287
|
if ($more > 0) {
|
1232
1288
|
if ($raf->Read($buf2, $more) == $more) {
|
1233
1289
|
$buff .= $buf2;
|
1234
1290
|
$size += $more;
|
1235
|
-
|
1291
|
+
$magic = Get16u(\$buff, 24);
|
1236
1292
|
# verify PE magic number
|
1237
1293
|
unless ($magic == 0x107 or $magic == 0x10b or $magic == 0x20b) {
|
1238
1294
|
$et->Warn('Unknown PE magic number');
|
@@ -1246,21 +1302,54 @@ sub ProcessEXE($$)
|
|
1246
1302
|
# process PE COFF file header
|
1247
1303
|
$tagTablePtr = GetTagTable('Image::ExifTool::EXE::Main');
|
1248
1304
|
%dirInfo = (
|
1249
|
-
DataPt
|
1250
|
-
DataPos
|
1251
|
-
DataLen
|
1305
|
+
DataPt => \$buff,
|
1306
|
+
DataPos => $raf->Tell() - $size,
|
1307
|
+
DataLen => $size,
|
1252
1308
|
DirStart => 4,
|
1253
|
-
DirLen
|
1309
|
+
DirLen => $size - 4,
|
1254
1310
|
);
|
1255
1311
|
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
1256
|
-
# process data dictionary
|
1257
1312
|
my $num = Get16u(\$buff, 6); # NumberOfSections
|
1258
|
-
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1313
|
+
# image data directory entry for debug info is index 6,
|
1314
|
+
# so offset is 4 bytes + 20 byte header + 96 bytes into PE32 optional
|
1315
|
+
# header (or 112 bytes for PE32+) + 6 * 8 bytes into data directory
|
1316
|
+
my $dirEntry = $magic == 0x20b ? 184 : 168;
|
1317
|
+
my ($addr, $len, $pos, $buf2); # virtual address/size of debug section
|
1318
|
+
if (length($buff) >= $dirEntry + 8) {
|
1319
|
+
$addr = Get32u(\$buff, $dirEntry);
|
1320
|
+
$len = Get32u(\$buff, $dirEntry+4);
|
1321
|
+
}
|
1322
|
+
# process data dictionary
|
1323
|
+
# (ref https://www.debuginfo.com/articles/debuginfomatch.html)
|
1324
|
+
return 1 unless $raf->Read($buff, 40 * $num) == 40 * $num;
|
1325
|
+
%dirInfo = ( RAF => $raf, DataPt => \$buff );
|
1326
|
+
ProcessPEDict($et, \%dirInfo) or $et->Warn('Error processing PE resources');
|
1327
|
+
# dive into debug section to extract pdb info if available
|
1328
|
+
return 1 unless $addr and $len < 2800 and $dirInfo{Sections} and
|
1329
|
+
($magic == 0x10b or $magic == 0x20b);
|
1330
|
+
# get file offset for debug section
|
1331
|
+
my $off = GetFileOffset($addr, $dirInfo{Sections});
|
1332
|
+
return 1 unless $off and $raf->Seek($off,0) and
|
1333
|
+
$raf->Read($buff,$len) == $len;
|
1334
|
+
for ($pos=0; $pos+28<=$len; $pos+=28) {
|
1335
|
+
my $type = Get32u(\$buff,$pos+12);
|
1336
|
+
next unless $type == 2 or $type == 4; # (CodeView debug data)
|
1337
|
+
my ($n, $of) = (Get32u(\$buff,$pos+16), Get32u(\$buff,$pos+24));
|
1338
|
+
next unless $n < 1e4 and $raf->Seek($of,0) and $raf->Read($buf2,$n) == $n;
|
1339
|
+
if ($type == 2) { # CodeView debug info
|
1340
|
+
next unless $buf2 =~ /^(RSDS|NB10)/;
|
1341
|
+
$tagTablePtr = GetTagTable("Image::ExifTool::EXE::Debug$1");
|
1342
|
+
substr($buf2,0,4) = substr($buff,$pos+4,4); # use timestamp from debug dir
|
1343
|
+
%dirInfo = ( DataPt => \$buf2, DataPos => $of );
|
1344
|
+
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
1345
|
+
} else { # misc debug info
|
1346
|
+
next unless $n > 12;
|
1347
|
+
my $exe = substr($buf2,12);
|
1348
|
+
$exe = $et->Decode($exe, 'UCS2') if Get32u(\$buf2,8);
|
1349
|
+
$exe =~ s/\0.*//; # truncate at null
|
1350
|
+
$tagTablePtr = GetTagTable('Image::ExifTool::EXE::Misc');
|
1351
|
+
$et->HandleTag($tagTablePtr, 12, $exe, DataPt => \$buf2, DataPos => $of);
|
1352
|
+
}
|
1264
1353
|
}
|
1265
1354
|
return 1;
|
1266
1355
|
}
|
@@ -1454,7 +1543,7 @@ library files.
|
|
1454
1543
|
|
1455
1544
|
=head1 AUTHOR
|
1456
1545
|
|
1457
|
-
Copyright 2003-
|
1546
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
1458
1547
|
|
1459
1548
|
This library is free software; you can redistribute it and/or modify it
|
1460
1549
|
under the same terms as Perl itself.
|
@@ -1477,6 +1566,8 @@ under the same terms as Perl itself.
|
|
1477
1566
|
|
1478
1567
|
=item L<http://www.codeproject.com/KB/DLL/showver.aspx>
|
1479
1568
|
|
1569
|
+
=item L<https://learn.microsoft.com/en-us/windows/win32/debug/pe-format>
|
1570
|
+
|
1480
1571
|
=back
|
1481
1572
|
|
1482
1573
|
=head1 SEE ALSO
|
@@ -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.56';
|
61
61
|
|
62
62
|
sub ProcessExif($$$);
|
63
63
|
sub WriteExif($$$);
|
@@ -246,10 +246,13 @@ $formatName[129] = 'utf8'; # (Exif 3.0)
|
|
246
246
|
# 34888,34889 - ESRI reserved
|
247
247
|
34892 => 'Lossy JPEG', # (DNG 1.4)
|
248
248
|
34925 => 'LZMA2', #LibTiff
|
249
|
-
34926 => 'Zstd', #LibTiff
|
250
|
-
34927 => 'WebP', #LibTiff
|
249
|
+
34926 => 'Zstd (old)', #LibTiff
|
250
|
+
34927 => 'WebP (old)', #LibTiff
|
251
251
|
34933 => 'PNG', # (TIFF mail list)
|
252
252
|
34934 => 'JPEG XR', # (TIFF mail list)
|
253
|
+
50000 => 'Zstd', #LibTiff 4.7
|
254
|
+
50001 => 'WebP', #LibTiff 4.7
|
255
|
+
50002 => 'JPEG XL (old)', #LibTiff 4.7
|
253
256
|
52546 => 'JPEG XL', # (DNG 1.7)
|
254
257
|
65000 => 'Kodak DCR Compressed', #PH
|
255
258
|
65535 => 'Pentax PEF Compressed', #Jens
|
@@ -7140,7 +7143,7 @@ EXIF and TIFF meta information.
|
|
7140
7143
|
|
7141
7144
|
=head1 AUTHOR
|
7142
7145
|
|
7143
|
-
Copyright 2003-
|
7146
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
7144
7147
|
|
7145
7148
|
This library is free software; you can redistribute it and/or modify it
|
7146
7149
|
under the same terms as Perl itself.
|
@@ -137,7 +137,7 @@ information from FITS (Flexible Image Transport System) images.
|
|
137
137
|
|
138
138
|
=head1 AUTHOR
|
139
139
|
|
140
|
-
Copyright 2003-
|
140
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
141
141
|
|
142
142
|
This library is free software; you can redistribute it and/or modify it
|
143
143
|
under the same terms as Perl itself.
|
@@ -298,7 +298,7 @@ information from Free Lossless Audio Codec (FLAC) audio files.
|
|
298
298
|
|
299
299
|
=head1 AUTHOR
|
300
300
|
|
301
|
-
Copyright 2003-
|
301
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
302
302
|
|
303
303
|
This library is free software; you can redistribute it and/or modify it
|
304
304
|
under the same terms as Perl itself.
|
@@ -329,7 +329,7 @@ meta information in FLIF (Free Lossless Image Format) images.
|
|
329
329
|
|
330
330
|
=head1 AUTHOR
|
331
331
|
|
332
|
-
Copyright 2003-
|
332
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
333
333
|
|
334
334
|
This library is free software; you can redistribute it and/or modify it
|
335
335
|
under the same terms as Perl itself.
|
@@ -1633,7 +1633,7 @@ Systems Inc. thermal image files (FFF, FPF and JPEG format).
|
|
1633
1633
|
|
1634
1634
|
=head1 AUTHOR
|
1635
1635
|
|
1636
|
-
Copyright 2003-
|
1636
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
1637
1637
|
|
1638
1638
|
This library is free software; you can redistribute it and/or modify it
|
1639
1639
|
under the same terms as Perl itself.
|