exiftool_vendored 13.18.0 → 13.19.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 +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
|
);
|