exiftool_vendored 13.18.0 → 13.19.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 +17 -3
- 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 +2 -2
- data/bin/lib/Image/ExifTool/DJI.pm +99 -11
- data/bin/lib/Image/ExifTool/ICO.pm +2 -2
- data/bin/lib/Image/ExifTool/Kodak.pm +3 -2
- data/bin/lib/Image/ExifTool/PDF.pm +10 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +42 -4
- data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +18 -11
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +19 -5
- data/bin/lib/Image/ExifTool/Sony.pm +16 -10
- data/bin/lib/Image/ExifTool/TagLookup.pm +676 -661
- data/bin/lib/Image/ExifTool/TagNames.pod +115 -58
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +45 -2
- data/bin/lib/Image/ExifTool/XMP.pm +17 -3
- data/bin/lib/Image/ExifTool.pm +5 -5
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19b270f0ce5b43c0bc65a0cf0f71fdea7426079ce467cb9e79a42ae9a5909c12
|
4
|
+
data.tar.gz: d989e4609455211361660c40fdec7c81ac3809d35030fd08ee0406fcf220be1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4f5c17319320481c245bf7009a86055da882a2374fb4e5c4f59b5ac31b82dba1f094e54adc442759fe3758ceeeab2e1d8f75b73efbdff57e1214ef871b8d12e
|
7
|
+
data.tar.gz: c657963e15956834d70bde5bf04c64446e1361a5e170eaef59a1d42b54acaeef54428654dd96c2d18ffef7548752fcd757e345d6a130076684f70ec1095eb033
|
data/bin/Changes
CHANGED
@@ -7,6 +7,20 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 13.10. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Feb. 10, 2025 - Version 13.19
|
11
|
+
|
12
|
+
- Added read/write support for PDF and XMP-pdfx SourceModified
|
13
|
+
- Decode GPS from two more DJI protobuf formats (Matrice 30 and Mini 4 Pro)
|
14
|
+
- Decode timed GPS from Rexing V1-4k dashcam
|
15
|
+
- Decode more information from AAE files
|
16
|
+
- Made a new icon for the Windows EXE application
|
17
|
+
- Changed family 3 groups for ICO files so the first icon is in the Doc1
|
18
|
+
instead of the Main group
|
19
|
+
- Improved handling of ICC_Profile in HEIC images:
|
20
|
+
- Profiles for sub-images are extracted as sub-documents
|
21
|
+
- Allow only the profile of the main image to be written
|
22
|
+
- Updated Sony decoding for ILCE-1M2 (thanks Jos Roost)
|
23
|
+
|
10
24
|
Feb. 3, 2025 - Version 13.18
|
11
25
|
|
12
26
|
- Decode a number of new GoPro tags
|
@@ -72,7 +86,7 @@ Jan. 20, 2025 - Version 13.13
|
|
72
86
|
|
73
87
|
- Added ability to write tags to the audio/video tracks of MOV/MP4 videos
|
74
88
|
using the new AudioKeys and VideoKeys group names
|
75
|
-
-
|
89
|
+
- Decode GPS from another DJI protobuf format (Mavic 3)
|
76
90
|
- Decode yet another type of LIGOGPSINFO timed GPS from a dashcam video
|
77
91
|
- Extract some proprietary information from JPEG images of Vivo phones
|
78
92
|
- Enhanced Geolocation feature to allow the nearest cities to a specified city
|
@@ -410,8 +424,8 @@ July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
|
|
410
424
|
- Tweaked API Geolocation option recognized space-separated lat/lon even when
|
411
425
|
there is no decimal point in the numbers
|
412
426
|
- API Changes:
|
413
|
-
- Changed LargeFileSupport default to
|
414
|
-
chunk is encountered
|
427
|
+
- Changed LargeFileSupport default to 1 and added a setting of 2 to warn
|
428
|
+
if a large chunk is encountered
|
415
429
|
|
416
430
|
June 13, 2024 - Version 12.87
|
417
431
|
|
data/bin/MANIFEST
CHANGED
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.19.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-13.19
|
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.19';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -5986,7 +5986,7 @@ with this command:
|
|
5986
5986
|
|
5987
5987
|
produces output like this:
|
5988
5988
|
|
5989
|
-
-- Generated by ExifTool 13.
|
5989
|
+
-- Generated by ExifTool 13.19 --
|
5990
5990
|
File: a.jpg - 2003:10:31 15:44:19
|
5991
5991
|
(f/5.6, 1/60s, ISO 100)
|
5992
5992
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
|
|
18
18
|
use Image::ExifTool::GPS;
|
19
19
|
use Image::ExifTool::Protobuf;
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.13';
|
22
22
|
|
23
23
|
sub ProcessDJIInfo($$$);
|
24
24
|
|
@@ -27,6 +27,8 @@ sub ProcessDJIInfo($$$);
|
|
27
27
|
'dvtm_ac204.proto' => 1, # Osmo Action 5
|
28
28
|
'dvtm_AVATA2.proto' => 1, # Avanta 2
|
29
29
|
'dvtm_wm265e.proto' => 1, # Mavic 3
|
30
|
+
'dvtm_pm320.proto' => 1, # Matrice 30
|
31
|
+
'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
|
30
32
|
);
|
31
33
|
|
32
34
|
my %convFloat2 = (
|
@@ -209,8 +211,9 @@ my %convFloat2 = (
|
|
209
211
|
|
210
212
|
ExifTool currently extracts timed GPS plus a few other tags from DJI devices
|
211
213
|
which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
|
212
|
-
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5)
|
213
|
-
dvtm_wm265e.proto (Mavic 3).
|
214
|
+
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
|
215
|
+
dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
|
216
|
+
dvtm_pm320.proto (Mini 4 Pro).
|
214
217
|
|
215
218
|
Note that with the protobuf format, numerical tags missing from the output
|
216
219
|
for a given protocol should be considered to have the default value of 0.
|
@@ -326,7 +329,6 @@ my %convFloat2 = (
|
|
326
329
|
'dvtm_wm265e_3-2-3-1' => {
|
327
330
|
Name => 'ShutterSpeed',
|
328
331
|
Format => 'rational',
|
329
|
-
ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
|
330
332
|
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
331
333
|
},
|
332
334
|
# dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
|
@@ -335,14 +337,100 @@ my %convFloat2 = (
|
|
335
337
|
Name => 'GPSInfo',
|
336
338
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
337
339
|
},
|
338
|
-
'dvtm_wm265e_3-3-3
|
339
|
-
|
340
|
-
|
341
|
-
|
340
|
+
'dvtm_wm265e_3-3-3' => {
|
341
|
+
Name => 'DroneInfo',
|
342
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
343
|
+
},
|
344
|
+
'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
342
345
|
'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
343
|
-
'dvtm_wm265e_3-4-3
|
344
|
-
|
345
|
-
|
346
|
+
'dvtm_wm265e_3-4-3' => {
|
347
|
+
Name => 'GimbalInfo',
|
348
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
349
|
+
},
|
350
|
+
#
|
351
|
+
# Matrice 30
|
352
|
+
#
|
353
|
+
'dvtm_pm320_1-1-5' => 'SerialNumber',
|
354
|
+
'dvtm_pm320_1-1-10' => 'Model',
|
355
|
+
'dvtm_pm320_2-2' => {
|
356
|
+
Name => 'FrameInfo',
|
357
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
358
|
+
},
|
359
|
+
'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
360
|
+
'dvtm_pm320_3-2-3-1' => {
|
361
|
+
Name => 'ShutterSpeed',
|
362
|
+
Format => 'rational',
|
363
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
364
|
+
},
|
365
|
+
'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
|
366
|
+
'dvtm_pm320_3-3-4-1' => {
|
367
|
+
Name => 'GPSInfo',
|
368
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
369
|
+
},
|
370
|
+
'dvtm_pm320_3-3-3' => {
|
371
|
+
Name => 'DroneInfo',
|
372
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
373
|
+
},
|
374
|
+
'dvtm_pm320_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
375
|
+
'dvtm_pm320_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
376
|
+
'dvtm_pm320_3-4-3' => {
|
377
|
+
Name => 'GimbalInfo',
|
378
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
379
|
+
},
|
380
|
+
#
|
381
|
+
# Mini 4 Pro
|
382
|
+
#
|
383
|
+
'dvtm_Mini4_Pro_1-1-5' => 'SerialNumber',
|
384
|
+
'dvtm_Mini4_Pro_1-1-10' => 'Model',
|
385
|
+
'dvtm_Mini4_Pro_2-3' => {
|
386
|
+
Name => 'FrameInfo',
|
387
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
388
|
+
},
|
389
|
+
'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
|
390
|
+
'dvtm_Mini4_Pro_3-2-10-1' => {
|
391
|
+
Name => 'ShutterSpeed',
|
392
|
+
Format => 'rational',
|
393
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
394
|
+
},
|
395
|
+
'dvtm_Mini4_Pro_3-2-11-1' => {
|
396
|
+
Name => 'FNumber',
|
397
|
+
Format => 'rational',
|
398
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
399
|
+
},
|
400
|
+
'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
|
401
|
+
# dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
|
402
|
+
'dvtm_Mini4_Pro_3-3-4-1' => {
|
403
|
+
Name => 'GPSInfo',
|
404
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
405
|
+
},
|
406
|
+
'dvtm_Mini4_Pro_3-3-3' => {
|
407
|
+
Name => 'DroneInfo',
|
408
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
409
|
+
},
|
410
|
+
'dvtm_Mini4_Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
411
|
+
'dvtm_Mini4_Pro_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
|
412
|
+
'dvtm_Mini4_Pro_3-4-3' => {
|
413
|
+
Name => 'GimbalInfo',
|
414
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
415
|
+
},
|
416
|
+
);
|
417
|
+
|
418
|
+
%Image::ExifTool::DJI::DroneInfo = (
|
419
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
420
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
421
|
+
VARS => { HEX_ID => 0 },
|
422
|
+
1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
|
423
|
+
2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
|
424
|
+
3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
425
|
+
);
|
426
|
+
|
427
|
+
%Image::ExifTool::DJI::GimbalInfo = (
|
428
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
429
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
430
|
+
VARS => { HEX_ID => 0 },
|
431
|
+
1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
|
432
|
+
2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
|
433
|
+
3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
346
434
|
);
|
347
435
|
|
348
436
|
%Image::ExifTool::DJI::FrameInfo = (
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.01';
|
18
18
|
|
19
19
|
%Image::ExifTool::ICO::Main = (
|
20
20
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -95,7 +95,7 @@ sub ProcessICO($$$)
|
|
95
95
|
$et->HandleTag($tagTbl, 4, $num);
|
96
96
|
for ($i=0; $i<$num; ++$i) {
|
97
97
|
$raf->Read($buff, 16) == 16 or $et->Warn('Truncated file'), last;
|
98
|
-
$$et{DOC_NUM} = ++$$et{DOC_COUNT}
|
98
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
99
99
|
$et->HandleTag($tagTbl, 6, $buff);
|
100
100
|
}
|
101
101
|
delete $$et{DOC_NUM};
|
@@ -25,7 +25,7 @@ use vars qw($VERSION);
|
|
25
25
|
use Image::ExifTool qw(:DataAccess :Utils);
|
26
26
|
use Image::ExifTool::Exif;
|
27
27
|
|
28
|
-
$VERSION = '1.
|
28
|
+
$VERSION = '1.48';
|
29
29
|
|
30
30
|
sub ProcessKodakIFD($$$);
|
31
31
|
sub ProcessKodakText($$$);
|
@@ -2983,7 +2983,8 @@ my %sceneModeUsed = (
|
|
2983
2983
|
Priority => 0, # (only integer seconds)
|
2984
2984
|
PrintConv => 'ConvertDuration($val)',
|
2985
2985
|
},
|
2986
|
-
|
2986
|
+
# (save KodakVersion to recognize Rexing Dashcam video for GPS scaling)
|
2987
|
+
'ver '=> { Name => 'KodakVersion', RawConv => '$$self{KodakVersion} = $val' },
|
2987
2988
|
thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 },
|
2988
2989
|
scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 },
|
2989
2990
|
);
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
22
22
|
require Exporter;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.61';
|
25
25
|
|
26
26
|
sub FetchObject($$$$);
|
27
27
|
sub ExtractObject($$;$$);
|
@@ -141,6 +141,15 @@ my %supportedFilter = (
|
|
141
141
|
PrintConv => '$self->ConvertDateTime($val)',
|
142
142
|
PrintConvInv => '$self->InverseDateTime($val)',
|
143
143
|
},
|
144
|
+
SourceModified => {
|
145
|
+
Name => 'SourceModified',
|
146
|
+
Writable => 'date',
|
147
|
+
PDF2 => 1,
|
148
|
+
Groups => { 2 => 'Time' },
|
149
|
+
Shift => 'Time',
|
150
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
151
|
+
PrintConvInv => '$self->InverseDateTime($val)',
|
152
|
+
},
|
144
153
|
Trapped => {
|
145
154
|
Protected => 1,
|
146
155
|
# remove leading '/' from '/True' or '/False'
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::XMP;
|
22
22
|
use Image::ExifTool::GPS;
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.14';
|
25
25
|
|
26
26
|
sub ExtractObject($$;$);
|
27
27
|
sub Get24u($$);
|
@@ -46,7 +46,7 @@ my %plistType = (
|
|
46
46
|
%Image::ExifTool::PLIST::Main = (
|
47
47
|
PROCESS_PROC => \&ProcessPLIST,
|
48
48
|
GROUPS => { 0 => 'PLIST', 1 => 'XML', 2 => 'Document' },
|
49
|
-
VARS => { LONG_TAGS =>
|
49
|
+
VARS => { LONG_TAGS => 12 },
|
50
50
|
NOTES => q{
|
51
51
|
Apple Property List tags. ExifTool reads both XML and binary-format PLIST
|
52
52
|
files, and will extract any existing tags even if they aren't listed below.
|
@@ -92,6 +92,35 @@ my %plistType = (
|
|
92
92
|
Name => 'GPSMapDatum',
|
93
93
|
Groups => { 2 => 'Location' },
|
94
94
|
},
|
95
|
+
# slow motion stuff found in AAE files
|
96
|
+
'slowMotion/regions/timeRange/start/flags' => {
|
97
|
+
Name => 'SlowMotionRegionsStartTimeFlags',
|
98
|
+
PrintConv => { BITMASK => {
|
99
|
+
0 => 'Valid',
|
100
|
+
1 => 'Has been rounded',
|
101
|
+
2 => 'Positive infinity',
|
102
|
+
3 => 'Negative infinity',
|
103
|
+
4 => 'Indefinite',
|
104
|
+
}},
|
105
|
+
},
|
106
|
+
'slowMotion/regions/timeRange/start/value' => 'SlowMotionRegionsStartTimeValue',
|
107
|
+
'slowMotion/regions/timeRange/start/timescale' => 'SlowMotionRegionsStartTimeScale',
|
108
|
+
'slowMotion/regions/timeRange/start/epoch' => 'SlowMotionRegionsStartTimeEpoch',
|
109
|
+
'slowMotion/regions/timeRange/duration/flags' => {
|
110
|
+
Name => 'SlowMotionRegionsDurationFlags',
|
111
|
+
PrintConv => { BITMASK => {
|
112
|
+
0 => 'Valid',
|
113
|
+
1 => 'Has been rounded',
|
114
|
+
2 => 'Positive infinity',
|
115
|
+
3 => 'Negative infinity',
|
116
|
+
4 => 'Indefinite',
|
117
|
+
}},
|
118
|
+
},
|
119
|
+
'slowMotion/regions/timeRange/duration/value' => 'SlowMotionRegionsDurationValue',
|
120
|
+
'slowMotion/regions/timeRange/duration/timescale' => 'SlowMotionRegionsDurationTimeScale',
|
121
|
+
'slowMotion/regions/timeRange/duration/epoch' => 'SlowMotionRegionsDurationEpoch',
|
122
|
+
'slowMotion/regions' => 'SlowMotionRegions',
|
123
|
+
'slowMotion/rate' => 'SlowMotionRate',
|
95
124
|
XMLFileType => {
|
96
125
|
# recognize MODD files by their content
|
97
126
|
RawConv => q{
|
@@ -101,6 +130,10 @@ my %plistType = (
|
|
101
130
|
return $val;
|
102
131
|
},
|
103
132
|
},
|
133
|
+
adjustmentData => { # AAE file
|
134
|
+
Name => 'AdjustmentData',
|
135
|
+
SubDirectory => { TagTable => 'Image::ExifTool::PLIST::Main' },
|
136
|
+
},
|
104
137
|
);
|
105
138
|
|
106
139
|
#------------------------------------------------------------------------------
|
@@ -404,8 +437,13 @@ sub ProcessPLIST($$;$)
|
|
404
437
|
|
405
438
|
unless ($result) {
|
406
439
|
my $buff;
|
407
|
-
my $raf = $$dirInfo{RAF}
|
408
|
-
|
440
|
+
my $raf = $$dirInfo{RAF};
|
441
|
+
if ($raf) {
|
442
|
+
$raf->Seek(0,0) and $raf->Read($buff, 64) or return 0;
|
443
|
+
} else {
|
444
|
+
return 0 unless $$dirInfo{DataPt};
|
445
|
+
$buff = ${$$dirInfo{DataPt}};
|
446
|
+
}
|
409
447
|
if ($buff =~ /^bplist0/) {
|
410
448
|
# binary PLIST file
|
411
449
|
my $tagTablePtr = GetTagTable('Image::ExifTool::PLIST::Main');
|
@@ -174,7 +174,7 @@ sub ProcessProtobuf($$$;$)
|
|
174
174
|
my $dir = { DataPt => \$buff, Pos => 0 };
|
175
175
|
my $num = VarInt($dir);
|
176
176
|
my $den = VarInt($dir);
|
177
|
-
$val = (defined $num and $den) ?
|
177
|
+
$val = (defined $num and $den) ? $num/$den : 'err';
|
178
178
|
} else {
|
179
179
|
$val = ReadValue(\$buff, 0, $$tagInfo{Format}, undef, length($buff));
|
180
180
|
}
|
@@ -43,7 +43,7 @@
|
|
43
43
|
package Image::ExifTool::QuickTime;
|
44
44
|
|
45
45
|
use strict;
|
46
|
-
use vars qw($VERSION $AUTOLOAD %stringEncoding %avType);
|
46
|
+
use vars qw($VERSION $AUTOLOAD %stringEncoding %avType %dontInherit);
|
47
47
|
use Image::ExifTool qw(:DataAccess :Utils);
|
48
48
|
use Image::ExifTool::Exif;
|
49
49
|
use Image::ExifTool::GPS;
|
@@ -487,9 +487,13 @@ my %qtFlags = ( #12
|
|
487
487
|
);
|
488
488
|
|
489
489
|
# properties which don't get inherited from the parent
|
490
|
-
|
491
|
-
|
492
|
-
|
490
|
+
# 1 = parent doesn't inherit this property
|
491
|
+
# 2 = parent doesn't inherit, but child does
|
492
|
+
%dontInherit = (
|
493
|
+
ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
|
494
|
+
pixi => 1,
|
495
|
+
hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
|
496
|
+
colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
|
493
497
|
);
|
494
498
|
|
495
499
|
# tags that may be duplicated and directories that may contain duplicate tags
|
@@ -2835,7 +2839,8 @@ my %userDefined = (
|
|
2835
2839
|
ipma => {
|
2836
2840
|
Name => 'ItemPropertyAssociation',
|
2837
2841
|
RawConv => \&ParseItemPropAssoc,
|
2838
|
-
|
2842
|
+
# (comment out because we do this manually _before_ ipco when writing)
|
2843
|
+
# WriteHook => \&ParseItemPropAssoc,
|
2839
2844
|
Notes => 'parsed, but not extracted as a tag',
|
2840
2845
|
},
|
2841
2846
|
);
|
@@ -9982,17 +9987,19 @@ sub ProcessMOV($$;$)
|
|
9982
9987
|
my $items = $$et{ItemInfo};
|
9983
9988
|
my ($id, $prop, $docNum, $lowest);
|
9984
9989
|
my $primary = $$et{PrimaryItem} || 0;
|
9990
|
+
my $pitem = $$items{$primary} || { };
|
9991
|
+
$$pitem{RefersTo} or $$pitem{RefersTo} = { };
|
9985
9992
|
ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
9986
9993
|
next unless $$items{$id}{Association};
|
9987
9994
|
my $item = $$items{$id};
|
9988
9995
|
foreach $prop (@{$$item{Association}}) {
|
9989
9996
|
next unless $prop == $index;
|
9990
|
-
|
9991
|
-
|
9992
|
-
|
9993
|
-
# to
|
9994
|
-
#
|
9995
|
-
(
|
9997
|
+
my $dont = $dontInherit{$tag} || 0;
|
9998
|
+
if ($id == $primary or (not $dont and
|
9999
|
+
($$item{RefersTo} and $$item{RefersTo}{$primary})) or
|
10000
|
+
# special case to assume this property belongs to the primary
|
10001
|
+
# image if it belongs to an item referred to by the primary
|
10002
|
+
($dont != 1 and $$pitem{RefersTo}{$id}))
|
9996
10003
|
{
|
9997
10004
|
# this is associated with the primary item or an item describing
|
9998
10005
|
# the primary item, so consider this part of the main document
|
@@ -111,7 +111,7 @@ my %insvLimit = (
|
|
111
111
|
The tags below are extracted from timed metadata in QuickTime and other
|
112
112
|
formats of video files when the ExtractEmbedded option is used. Although
|
113
113
|
most of these tags are combined into the single table below, ExifTool
|
114
|
-
currently reads
|
114
|
+
currently reads 103 different types of timed GPS metadata from video files.
|
115
115
|
},
|
116
116
|
VARS => { NO_ID => 1 },
|
117
117
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
@@ -2208,7 +2208,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2208
2208
|
unpack('x48V6a1a1a1x1V4', $$dataPt);
|
2209
2209
|
if (substr($$dataPt, 16, 3) eq 'IQS') {
|
2210
2210
|
$debug and $et->FoundTag(GPSType => 16);
|
2211
|
-
#
|
2211
|
+
# IQS variant (ref PH)
|
2212
2212
|
# header looks like this in my sample:
|
2213
2213
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
2214
2214
|
# 0010: 49 51 53 5f 41 37 5f 32 30 31 35 30 34 31 37 00 [IQS_A7_20150417.]
|
@@ -2219,12 +2219,26 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2219
2219
|
$spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
|
2220
2220
|
$alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
|
2221
2221
|
} else {
|
2222
|
-
$debug and $et->FoundTag(GPSType => 17);
|
2223
2222
|
$lat = GetFloat($dataPt, 0x4c);
|
2224
2223
|
$lon = GetFloat($dataPt, 0x50);
|
2225
2224
|
$spd = GetFloat($dataPt, 0x54) * $knotsToKph;
|
2226
|
-
$trk = GetFloat($dataPt, 0x58);
|
2227
|
-
#
|
2225
|
+
$trk = GetFloat($dataPt, 0x58); # (NC, may be GPSImageDirection)
|
2226
|
+
# Rexing V1-4k dashcam scales the lat/lon
|
2227
|
+
# (recognize this dashcam by the KodakVersion, "3.01.054" for my sample)
|
2228
|
+
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
2229
|
+
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2230
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2231
|
+
# 0030: 0e 00 00 00 22 00 00 00 28 00 00 00 14 00 00 00 [...."...(.......]
|
2232
|
+
# 0040: 02 00 00 00 16 00 00 00 41 4e 57 00 e9 7e 90 43 [........ANW..~.C]
|
2233
|
+
# 0050: 48 76 17 45 0c 02 48 42 14 6e 85 43 00 00 00 00 [Hv.E..HB.n.C....]
|
2234
|
+
if ($$et{KodakVersion} and $$et{KodakVersion} eq '3.01.054') {
|
2235
|
+
$debug and $et->FoundTag(GPSType => '17b');
|
2236
|
+
$lat = ($lat - 187.982162849635) / 3;
|
2237
|
+
$lon = ($lon - 2199.19873715495) / 2;
|
2238
|
+
$ddd = 1;
|
2239
|
+
} else {
|
2240
|
+
$debug and $et->FoundTag(GPSType => 17);
|
2241
|
+
}
|
2228
2242
|
}
|
2229
2243
|
if ($dirLen >= 0xb0) {
|
2230
2244
|
# lat/lon also stored as doubles by Transcend Driver Pro 230 (ref PH)
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
34
34
|
use Image::ExifTool::Exif;
|
35
35
|
use Image::ExifTool::Minolta;
|
36
36
|
|
37
|
-
$VERSION = '3.
|
37
|
+
$VERSION = '3.72';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -171,6 +171,7 @@ sub PrintInvLensSpec($;$$);
|
|
171
171
|
32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
|
172
172
|
32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR
|
173
173
|
32888 => 'Sony FE 85mm F1.4 GM II', #JR
|
174
|
+
32889 => 'Sony FE 28-70mm F2 GM',
|
174
175
|
|
175
176
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
176
177
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
@@ -1226,6 +1227,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1226
1227
|
9 => 'Center (LA-EA4)', # seen for ILCE-7RM2 with LA-EA4
|
1227
1228
|
11 => 'Zone',
|
1228
1229
|
12 => 'Expanded Flexible Spot',
|
1230
|
+
13 => 'Custom AF Area', # NC, new AFArea option for ILCE-9M3, ILCE-1M2
|
1229
1231
|
},
|
1230
1232
|
},{
|
1231
1233
|
Name => 'AFAreaModeSetting',
|
@@ -1726,7 +1728,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
1726
1728
|
},
|
1727
1729
|
},{
|
1728
1730
|
Name => 'Tag9050d',
|
1729
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/',
|
1731
|
+
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/ or ($$self{Model} =~ /^(ILCE-1M2)/ and $$valPt =~ /^\x00/)',
|
1730
1732
|
SubDirectory => {
|
1731
1733
|
TagTable => 'Image::ExifTool::Sony::Tag9050d',
|
1732
1734
|
ByteOrder => 'LittleEndian',
|
@@ -8208,14 +8210,17 @@ my %isoSetting2010 = (
|
|
8208
8210
|
WRITE_PROC => \&WriteEnciphered,
|
8209
8211
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
8210
8212
|
FORMAT => 'int8u',
|
8211
|
-
NOTES =>
|
8213
|
+
NOTES => q{
|
8214
|
+
Valid for ILCE-6700/7CM2/7CR/ZV-E1. Also for ILCE-1M2 when using mechanical
|
8215
|
+
shutter.
|
8216
|
+
},
|
8212
8217
|
WRITABLE => 1,
|
8213
8218
|
FIRST_ENTRY => 0,
|
8214
8219
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
8215
8220
|
0x000a => {
|
8216
8221
|
Name => 'ShutterCount',
|
8217
8222
|
# number of mechanical shutter actuations, does not increase during electronic shutter / Silent Shooting
|
8218
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR))/',
|
8223
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR))/',
|
8219
8224
|
Format => 'int32u',
|
8220
8225
|
Notes => 'total number of mechanical shutter actuations',
|
8221
8226
|
RawConv => '$val & 0x00ffffff',
|
@@ -8451,7 +8456,7 @@ my %isoSetting2010 = (
|
|
8451
8456
|
200 => 'Continuous - Sweep Panorama',
|
8452
8457
|
},
|
8453
8458
|
},
|
8454
|
-
0x001a => { %sequenceFileNumber },
|
8459
|
+
0x001a => { %sequenceFileNumber }, # ILCE-9M3/1M2 have sometimes deviating values.
|
8455
8460
|
0x001e => {
|
8456
8461
|
Name => 'SequenceLength',
|
8457
8462
|
PrintConv => {
|
@@ -8476,7 +8481,7 @@ my %isoSetting2010 = (
|
|
8476
8481
|
},
|
8477
8482
|
0x002a => [{
|
8478
8483
|
Name => 'Quality2',
|
8479
|
-
Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
|
8484
|
+
Condition => '$$self{Model} !~ /^(ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
|
8480
8485
|
PrintConv => {
|
8481
8486
|
0 => 'JPEG',
|
8482
8487
|
1 => 'RAW',
|
@@ -8544,7 +8549,7 @@ my %isoSetting2010 = (
|
|
8544
8549
|
0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
|
8545
8550
|
|
8546
8551
|
0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8547
|
-
0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401}
|
8552
|
+
0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(185|186)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8548
8553
|
0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8549
8554
|
0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
8550
8555
|
0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} !~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
@@ -8619,6 +8624,7 @@ my %isoSetting2010 = (
|
|
8619
8624
|
10 => 'Selective (for Miniature effect)', # seen for DSC-HX30V,TX30,WX60,WX100
|
8620
8625
|
11 => 'Zone', #JR (ILCE-7 series)
|
8621
8626
|
12 => 'Expanded Flexible Spot', #JR (HX90V, ILCE-7 series)
|
8627
|
+
13 => 'Custom AF Area', # NC, new AFArea option for ILCE-9M3, ILCE-1M2
|
8622
8628
|
14 => 'Tracking',
|
8623
8629
|
15 => 'Face Tracking',
|
8624
8630
|
20 => 'Animal Eye Tracking',
|
@@ -10034,7 +10040,7 @@ my %isoSetting2010 = (
|
|
10034
10040
|
},
|
10035
10041
|
0x089d => { # Note: 32 values for these newer models, and 32 non-zero values present for new lenses like SEL2470GM2 and SEL2070G
|
10036
10042
|
Name => 'VignettingCorrParams',
|
10037
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10043
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10038
10044
|
Format => 'int16s[32]',
|
10039
10045
|
},
|
10040
10046
|
0x08b5 => {
|
@@ -10055,7 +10061,7 @@ my %isoSetting2010 = (
|
|
10055
10061
|
},
|
10056
10062
|
0x08e5 => {
|
10057
10063
|
Name => 'APS-CSizeCapture',
|
10058
|
-
Condition => '$$self{Model} =~ /^(ILCE-(7CM2|7CR|7RM5)|ZV-E1)\b/',
|
10064
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1M2|7CM2|7CR|7RM5)|ZV-E1)\b/',
|
10059
10065
|
PrintConv => {
|
10060
10066
|
0 => 'Off',
|
10061
10067
|
1 => 'On',
|
@@ -10073,7 +10079,7 @@ my %isoSetting2010 = (
|
|
10073
10079
|
},
|
10074
10080
|
0x0945 => {
|
10075
10081
|
Name => 'ChromaticAberrationCorrParams',
|
10076
|
-
Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10082
|
+
Condition => '$$self{Model} =~ /^(ILCE-(1M2|6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
|
10077
10083
|
Format => 'int16s[32]',
|
10078
10084
|
},
|
10079
10085
|
);
|