exiftool_vendored 13.25.0 → 13.27.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 +28 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -3
- data/bin/build_geolocation +1 -1
- data/bin/exiftool +8 -6
- data/bin/lib/Image/ExifTool/Canon.pm +3 -2
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -0
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- data/bin/lib/Image/ExifTool/PCAP.pm +5 -5
- data/bin/lib/Image/ExifTool/Pentax.pm +51 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +27 -9
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +61 -9
- data/bin/lib/Image/ExifTool/README +7 -2
- data/bin/lib/Image/ExifTool/RIFF.pm +15 -6
- data/bin/lib/Image/ExifTool/TagLookup.pm +16 -2
- data/bin/lib/Image/ExifTool/TagNames.pod +117 -90
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
- data/bin/lib/Image/ExifTool/XMP.pm +22 -15
- data/bin/lib/Image/ExifTool/XMP2.pl +5 -1
- data/bin/lib/Image/ExifTool.pm +7 -3
- data/bin/lib/Image/ExifTool.pod +2 -1
- 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: fb0a184eb27a7f2bd365b24473d079bf59c21bfb5d18e4322438164364218151
|
4
|
+
data.tar.gz: 39f8672fe231f2d0588920382a7cc7b5d36199a03c7a86f43d0a0161ec5ba2f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c618366df0c65fff73241fe27a143eacb46a64280866edc3ba23f1b7fc8a5765d605029afd58fce678e080bdbd951989ab460336623afebee96ed1e0c61d891
|
7
|
+
data.tar.gz: 93d27263a8c922cea0bef3eec89779517dd040539cf9fae2e3712823fe5d48148ca86663ed469300b3677c1a99a3c9ccfc7564bbdd57150894682424db23621f
|
data/bin/Changes
CHANGED
@@ -7,10 +7,35 @@ RSS feed: https://exiftool.org/rss.xml
|
|
7
7
|
Note: The most recent production release is Version 13.25. (Other versions are
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
9
9
|
|
10
|
+
Apr. 8, 2025 - Version 13.27
|
11
|
+
|
12
|
+
- Decode AF points for the Pentax K-3III
|
13
|
+
- Decode timed GPS from a variant of the Rove R2-4K dashcam
|
14
|
+
- Properly decode SensorTemperature for Pentax K3-III
|
15
|
+
- Patched PCAP test to avoid potential failure
|
16
|
+
- Patched to avoid potential "not a HASH reference" error when writing MOV/MP4
|
17
|
+
videos
|
18
|
+
- Fixed issue which could result in "uninitialized value" errors when reading
|
19
|
+
one type of timed GPS from MP4 videos
|
20
|
+
- Fixed problem writing MotionPhotoVideo in MP4 files
|
21
|
+
|
22
|
+
Mar. 31, 2025 - Version 13.26
|
23
|
+
|
24
|
+
- Added a new Olympus CameraType (thanks Herb)
|
25
|
+
- Added a new PentaxModelID (github #322)
|
26
|
+
- Added a new Nikon LensID
|
27
|
+
- Improved Duration calculation for some WAV files
|
28
|
+
- Changed a PCAP tag name and fixed typos in a few others (thanks blue-j)
|
29
|
+
- Patched to avoid VignettingCorr warning for images from some Canon cameras
|
30
|
+
- Patched to avoid some unnecessary duplicate tag warnings when -validate used
|
31
|
+
with HEIC images
|
32
|
+
- Fixed issue with XMP-xmpMM:Pantry items not exhibiting proper List-type
|
33
|
+
behaviour
|
34
|
+
|
10
35
|
Mar. 11, 2025 - Version 13.25 (production release)
|
11
36
|
|
12
37
|
- IMPORTANT: Fixed issue which could corrupt HEIC images from newer iPhones
|
13
|
-
when writing QuickTime:Rotation
|
38
|
+
under certain conditions when writing QuickTime:Rotation
|
14
39
|
- Decode more PLIST information from HEIC images
|
15
40
|
- Updated Geolocation databases from current geonames.org files
|
16
41
|
- Updated DarwinCore for the 2023 specification (thanks Herb)
|
@@ -25,7 +50,7 @@ Mar. 7, 2025 - Version 13.24
|
|
25
50
|
|
26
51
|
Mar. 7, 2025 - Version 13.23
|
27
52
|
|
28
|
-
- Added read support for CAP, PCAP and
|
53
|
+
- Added read support for CAP, PCAP and PCAPNG files (github #318)
|
29
54
|
- Added a number of new Sony LensType2 values (thanks Jos Roost)
|
30
55
|
- Added the 2 new GPSAltitudeRef values defined by EXIF 3.0
|
31
56
|
- Decode APP4 "Qualcomm Dual Camera Attributes" metadata
|
@@ -57,7 +82,7 @@ Feb. 20, 2025 - Version 13.21
|
|
57
82
|
- Patched issue that could result in runtime warning for some video files
|
58
83
|
- Fixed a bug with the new -plot option that could generate a compiler error
|
59
84
|
|
60
|
-
Feb. 20, 2025 - Version 13.20
|
85
|
+
Feb. 20, 2025 - Version 13.20 - "SVG Plot"
|
61
86
|
|
62
87
|
- Added new -plot option for generating SVG-format plots from tag values
|
63
88
|
- Added a new Olympus CameraType
|
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.27.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-13.27
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
@@ -170,7 +170,7 @@ COPYRIGHT AND LICENSE
|
|
170
170
|
Copyright 2003-2025, Phil Harvey
|
171
171
|
|
172
172
|
This is free software; you can redistribute it and/or modify it under the
|
173
|
-
same terms as Perl itself.
|
173
|
+
same terms as Perl itself (either the Perl Artistic License or GPL).
|
174
174
|
|
175
175
|
DISTRIBUTION FILES
|
176
176
|
|
data/bin/build_geolocation
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
# 6 int8u - 0xf0 = population E exponent (in format "N.Fe+0E"), 0x0f = population N digit
|
41
41
|
# 7 int16u - 0xf000 = population F digit, 0x0fff = index in region list (admin1)
|
42
42
|
# 9 int16u - v1.02: 0x7fff = index in subregion (admin2), 0x8000 = high bit of time zone
|
43
|
-
# 9 int16u - v1.03: index in subregion (admin2)
|
43
|
+
# 9 int16u - v1.03: index in subregion list (admin2)
|
44
44
|
# 11 int8u - low byte of time zone index
|
45
45
|
# 12 int8u - 0x3f = feature code index (see below), v1.03: 0x80 = high bit of time zone
|
46
46
|
# 13 string - UTF8 City name, terminated by newline
|
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.27';
|
15
15
|
|
16
16
|
$^W = 1; # enable global warnings
|
17
17
|
|
@@ -4289,6 +4289,7 @@ sub ScanDir($$;$)
|
|
4289
4289
|
next unless $recurse;
|
4290
4290
|
# ignore directories starting with "." by default
|
4291
4291
|
next if $file =~ /^\./ and $recurse == 1;
|
4292
|
+
# note: this doesn't work in Windows cmd (see forum17243)
|
4292
4293
|
next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
|
4293
4294
|
ScanDir($et, $path, $list);
|
4294
4295
|
last if $end;
|
@@ -5010,7 +5011,7 @@ B<exiftool> [I<OPTIONS>] [-I<TAG>...] [--I<TAG>...] I<FILE>...
|
|
5010
5011
|
|
5011
5012
|
=head2 Writing
|
5012
5013
|
|
5013
|
-
B<exiftool> [I<OPTIONS>] -I<TAG>[
|
5014
|
+
B<exiftool> [I<OPTIONS>] -I<TAG>[+-^E<lt>]=[I<VALUE>]... I<FILE>...
|
5014
5015
|
|
5015
5016
|
=head2 Copying
|
5016
5017
|
|
@@ -6053,7 +6054,7 @@ with this command:
|
|
6053
6054
|
|
6054
6055
|
produces output like this:
|
6055
6056
|
|
6056
|
-
-- Generated by ExifTool 13.
|
6057
|
+
-- Generated by ExifTool 13.27 --
|
6057
6058
|
File: a.jpg - 2003:10:31 15:44:19
|
6058
6059
|
(f/5.6, 1/60s, ISO 100)
|
6059
6060
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -6550,9 +6551,10 @@ name, or a full path, and is case sensitive. If a full path is specified,
|
|
6550
6551
|
it must match the Directory tag exactly to be ignored. Use multiple B<-i>
|
6551
6552
|
options to ignore more than one directory name. A special I<DIR> value of
|
6552
6553
|
C<SYMLINKS> may be specified to avoid recursing into directories which are
|
6553
|
-
symbolic links when the B<-r> option is used
|
6554
|
-
|
6555
|
-
files
|
6554
|
+
symbolic links when the B<-r> option is used (note this does not currently
|
6555
|
+
work under Windows). As well, a value of C<HIDDEN> may be used to ignore
|
6556
|
+
files with names that start with a "." (ie. hidden files on Unix systems)
|
6557
|
+
when scanning a directory.
|
6556
6558
|
|
6557
6559
|
=item B<-if>[I<NUM>] I<EXPR>
|
6558
6560
|
|
@@ -2053,7 +2053,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
2053
2053
|
# 0x4014 (similar to 0x83?)
|
2054
2054
|
0x4015 => [{
|
2055
2055
|
Name => 'VignettingCorr', # (LensPacket)
|
2056
|
-
Condition => '$$valPt =~ /^\0/ and $$valPt !~
|
2056
|
+
Condition => '$$valPt =~ /^\0/ and $$valPt !~ /^(\0\0\0\0|\x00\x40\xdc\x05)/', # (data may be all zeros for 60D)
|
2057
2057
|
SubDirectory => {
|
2058
2058
|
# (the size word is at byte 2 in this structure)
|
2059
2059
|
Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
|
@@ -2061,7 +2061,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
2061
2061
|
},
|
2062
2062
|
},{
|
2063
2063
|
Name => 'VignettingCorrUnknown1',
|
2064
|
-
Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~
|
2064
|
+
Condition => '$$valPt =~ /^[\x01\x02\x10\x20]/ and $$valPt !~ /^(\0\0\0\0|\x02\x50\x7c\x04)/',
|
2065
2065
|
SubDirectory => {
|
2066
2066
|
# (the size word is at byte 2 in this structure)
|
2067
2067
|
Validate => 'Image::ExifTool::Canon::Validate($dirData,$subdirStart+2,$size)',
|
@@ -4758,6 +4758,7 @@ my %ciMaxFocal = (
|
|
4758
4758
|
Format => 'int32u',
|
4759
4759
|
Notes => 'includes electronic + mechanical shutter',
|
4760
4760
|
},
|
4761
|
+
# 0x0b5a - related to image stabilization (ref forum17239) (R5)
|
4761
4762
|
# 0x0bb7 - counts down during focus stack (ref forum16111)
|
4762
4763
|
);
|
4763
4764
|
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.46';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -552,6 +552,7 @@ sub GetAFPointGrid($$;$);
|
|
552
552
|
'21 56 8E 8E 24 24 14 00' => 'Tamron SP AF 300mm f/2.8 LD-IF (60E)',
|
553
553
|
'27 54 8E 8E 24 24 1D 02' => 'Tamron SP AF 300mm f/2.8 LD-IF (360E)',
|
554
554
|
'E1 40 19 36 2C 35 DF 4E' => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)',
|
555
|
+
'E1 40 19 36 2C 35 DF 0E' => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #30
|
555
556
|
'F6 3F 18 37 2C 34 84 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)',
|
556
557
|
'F6 3F 18 37 2C 34 DF 06' => 'Tamron SP AF 10-24mm f/3.5-4.5 Di II LD Aspherical (IF) (B001)', #30
|
557
558
|
'00 36 1C 2D 34 3C 00 06' => 'Tamron SP AF 11-18mm f/4.5-5.6 Di II LD Aspherical (IF) (A13)',
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
40
40
|
use Image::ExifTool::Exif;
|
41
41
|
use Image::ExifTool::APP12;
|
42
42
|
|
43
|
-
$VERSION = '2.
|
43
|
+
$VERSION = '2.85';
|
44
44
|
|
45
45
|
sub PrintLensInfo($$$);
|
46
46
|
|
@@ -446,6 +446,7 @@ my %olympusCameraTypes = (
|
|
446
446
|
S0095 => 'OM-1', #IB
|
447
447
|
S0101 => 'OM-5', #IB
|
448
448
|
S0121 => 'OM-1MarkII', #forum15652
|
449
|
+
S0123 => 'OM-3', #forum17208
|
449
450
|
SR45 => 'D220',
|
450
451
|
SR55 => 'D320L',
|
451
452
|
SR83 => 'D340L',
|
@@ -16,7 +16,7 @@ use strict;
|
|
16
16
|
use vars qw($VERSION);
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
18
18
|
|
19
|
-
$VERSION = '1.
|
19
|
+
$VERSION = '1.01';
|
20
20
|
|
21
21
|
%Image::ExifTool::PCAP::Main = (
|
22
22
|
GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Other' },
|
@@ -261,14 +261,14 @@ $VERSION = '1.00';
|
|
261
261
|
},
|
262
262
|
},
|
263
263
|
19373 => {
|
264
|
-
Name => '
|
264
|
+
Name => 'CustomOption4',
|
265
265
|
Binary => 1,
|
266
266
|
},
|
267
267
|
#
|
268
268
|
# "options" tags in Section Header Block
|
269
269
|
#
|
270
270
|
'SHB-2' => 'Hardware',
|
271
|
-
'SHB-3' => '
|
271
|
+
'SHB-3' => 'OperatingSystem',
|
272
272
|
'SHB-4' => 'UserApplication',
|
273
273
|
#
|
274
274
|
# "options" tags in Interface Description Block
|
@@ -308,8 +308,8 @@ $VERSION = '1.00';
|
|
308
308
|
Name => 'Filter',
|
309
309
|
ValueConv => 'Get8u(\$val,0) . ": " . substr($val, 1)',
|
310
310
|
},
|
311
|
-
'IDB-12' => '
|
312
|
-
'IDB-13' => { Name => '
|
311
|
+
'IDB-12' => 'OperatingSystem',
|
312
|
+
'IDB-13' => { Name => 'FrameCheckSequenceLength', Format => 'int8u' },
|
313
313
|
'IDB-14' => {
|
314
314
|
Name => 'TimeStampOffset',
|
315
315
|
Format => 'int64u',
|
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
|
|
58
58
|
use Image::ExifTool::GPS;
|
59
59
|
use Image::ExifTool::HP;
|
60
60
|
|
61
|
-
$VERSION = '3.
|
61
|
+
$VERSION = '3.49';
|
62
62
|
|
63
63
|
sub CryptShutterCount($$);
|
64
64
|
sub PrintFilter($$$);
|
@@ -558,6 +558,7 @@ my %pentaxModelID = (
|
|
558
558
|
0x13254 => 'K-3 Mark III', #IB (Ricoh)
|
559
559
|
0x13290 => 'WG-70', # (Ricoh)
|
560
560
|
0x1329a => 'GR IIIx', # (Ricoh)
|
561
|
+
0x132b8 => 'KF', #github322 (Ricoh)
|
561
562
|
0x132d6 => 'K-3 Mark III Monochrome', #github226 (Ricoh)
|
562
563
|
);
|
563
564
|
|
@@ -736,6 +737,19 @@ my %filterSettings = (
|
|
736
737
|
52 => ['Toning2', '%+d'], #31 Extract Color (-3-+3)
|
737
738
|
);
|
738
739
|
|
740
|
+
# order of K-3iii AF points
|
741
|
+
my @k3iiiAF = qw(C3 C4 C5 C6 C7 D3 D4 D5 D6 D7 E3 E4 E5 E6 E7 F3 F4 F5 F6 F7
|
742
|
+
G3 G4 G5 G6 G7 E1 E9 D2 D8 E2 E8 F2 F8 C2 C8 G2 G8 D1 D9 F1 F9);
|
743
|
+
|
744
|
+
# print AF Point names
|
745
|
+
sub AFPointsK3iii($;$)
|
746
|
+
{
|
747
|
+
my @a = split ' ', shift;
|
748
|
+
my @pts;
|
749
|
+
$a[$_] and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
|
750
|
+
return @pts ? join '.', sort @pts : '(none)';
|
751
|
+
}
|
752
|
+
|
739
753
|
# decoding for Pentax Firmware ID tags - PH
|
740
754
|
my %pentaxFirmwareID = (
|
741
755
|
# the first 2 numbers are the firmware version, I'm not sure what the second 2 mean
|
@@ -5016,6 +5030,31 @@ my %binaryDataAttrs = (
|
|
5016
5030
|
20 => 'Mid-right',
|
5017
5031
|
},
|
5018
5032
|
},
|
5033
|
+
0x14 => {
|
5034
|
+
Name => 'AFPointValues',
|
5035
|
+
Format => 'int16uRev[61]',
|
5036
|
+
Unknown => 1,
|
5037
|
+
Notes => 'some unknown values related to each AFPoint',
|
5038
|
+
# order is the same as AFPoints below, but there is an additional value for the
|
5039
|
+
# following AFPoints in this order starting at index 28 in the array: C3 C4 C5 C6 C7
|
5040
|
+
# D3 D4 D5 D6 D7 E3 E4 E5 E6 E7 F3 F4 F5 F6 F7 G3 G4 G5 G6 G7 E1 E9 D2 D8 E2 E8 F2 F8
|
5041
|
+
# (values are int16s stored in reversed byte order)
|
5042
|
+
ValueConv => 'my @a=split " ",$val;$_>32767 and $_-=65536 foreach @a;join " ",@a',
|
5043
|
+
},
|
5044
|
+
0x12a => { # byte has a value of 2 if corresponding AF point is selected
|
5045
|
+
Name => 'AFPoints',
|
5046
|
+
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
|
5047
|
+
Format => 'int8u[41]',
|
5048
|
+
PrintConv => \&AFPointsK3iii,
|
5049
|
+
},
|
5050
|
+
0x18f => { # byte has a value of 1 if corresponding AF point is in focus maybe?
|
5051
|
+
# usually the same points as AFPoints above, but not always
|
5052
|
+
Name => 'AFPointsUnknown',
|
5053
|
+
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
|
5054
|
+
Unknown => 1,
|
5055
|
+
Format => 'int8u[41]',
|
5056
|
+
PrintConv => \&AFPointsK3iii,
|
5057
|
+
},
|
5019
5058
|
0x1fa => {
|
5020
5059
|
Name => 'LiveView',
|
5021
5060
|
Notes => 'decoded only for the K-3 III',
|
@@ -5739,6 +5778,7 @@ my %binaryDataAttrs = (
|
|
5739
5778
|
# more quickly than CameraTemperature when shooting video.)
|
5740
5779
|
0x0c => {
|
5741
5780
|
Name => 'SensorTemperature', #forum6677 (was CameraTemperature2)
|
5781
|
+
Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
|
5742
5782
|
Format => 'int16s',
|
5743
5783
|
ValueConv => '$val / 10',
|
5744
5784
|
ValueConvInv => '$val * 10',
|
@@ -5747,6 +5787,7 @@ my %binaryDataAttrs = (
|
|
5747
5787
|
},
|
5748
5788
|
0x0e => {
|
5749
5789
|
Name => 'SensorTemperature2', #forum6677 (was CameraTemperature3)
|
5790
|
+
Condition => '$$self{Model} ne "K-3 Mark III"', # (and maybe others?)
|
5750
5791
|
Format => 'int16s',
|
5751
5792
|
ValueConv => '$val / 10',
|
5752
5793
|
ValueConvInv => '$val * 10',
|
@@ -5768,6 +5809,15 @@ my %binaryDataAttrs = (
|
|
5768
5809
|
PrintConvInv => '$val=~s/ ?c$//i; $val',
|
5769
5810
|
},
|
5770
5811
|
# 0x18,0x1a,0x1c,0x1e = int16u[4] BlackPoint - PH
|
5812
|
+
0x2a => {
|
5813
|
+
Name => 'SensorTemperature',
|
5814
|
+
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5815
|
+
Format => 'int16s',
|
5816
|
+
ValueConv => '$val / 10',
|
5817
|
+
ValueConvInv => '$val * 10',
|
5818
|
+
PrintConv => 'sprintf("%.1f C", $val)',
|
5819
|
+
PrintConvInv => '$val=~s/ ?c$//i; $val',
|
5820
|
+
},
|
5771
5821
|
);
|
5772
5822
|
|
5773
5823
|
# currently unknown info
|
@@ -38,6 +38,7 @@
|
|
38
38
|
# 26) https://github.com/SamsungVR/android_upload_sdk/blob/master/SDKLib/src/main/java/com/samsung/msca/samsungvr/sdk/UserVideo.java
|
39
39
|
# 27) https://exiftool.org/forum/index.php?topic=11517.0
|
40
40
|
# 28) https://docs.mp3tag.de/mapping/
|
41
|
+
# 29) https://developer.apple.com/documentation/quicktime-file-format/media_data_reference_atom
|
41
42
|
#------------------------------------------------------------------------------
|
42
43
|
|
43
44
|
package Image::ExifTool::QuickTime;
|
@@ -48,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
48
49
|
use Image::ExifTool::Exif;
|
49
50
|
use Image::ExifTool::GPS;
|
50
51
|
|
51
|
-
$VERSION = '3.
|
52
|
+
$VERSION = '3.15';
|
52
53
|
|
53
54
|
sub ProcessMOV($$;$);
|
54
55
|
sub ProcessKeys($$$);
|
@@ -502,7 +503,7 @@ my %qtFlags = ( #12
|
|
502
503
|
# (used only to avoid warnings when Validate-ing)
|
503
504
|
my %dupTagOK = ( mdat => 1, trak => 1, free => 1, infe => 1, sgpd => 1, dimg => 1, CCDT => 1,
|
504
505
|
sbgp => 1, csgm => 1, uuid => 1, cdsc => 1, maxr => 1, '----' => 1 );
|
505
|
-
my %dupDirOK = ( ipco => 1, '----' => 1 );
|
506
|
+
my %dupDirOK = ( ipco => 1, iref => 1, '----' => 1 );
|
506
507
|
|
507
508
|
# the usual atoms required to decode timed metadata with the ExtractEmbedded option
|
508
509
|
my %eeStd = ( stco => 'stbl', co64 => 'stbl', stsz => 'stbl', stz2 => 'stbl',
|
@@ -944,7 +945,7 @@ my %userDefined = (
|
|
944
945
|
Notes => 'MP4-format video saved in Samsung motion-photo HEIC images.',
|
945
946
|
Binary => 1,
|
946
947
|
# note that this may be written and/or deleted, but can't currently be added back again
|
947
|
-
Writable =>
|
948
|
+
Writable => 'undef',
|
948
949
|
},
|
949
950
|
# '35AX'? - seen "AT" (Yada RoadCam Pro 4K dashcam)
|
950
951
|
cust => 'CustomInfo', # 70mai A810
|
@@ -1227,6 +1228,7 @@ my %userDefined = (
|
|
1227
1228
|
# clip - clipping --> contains crgn (clip region) (ref 12)
|
1228
1229
|
# mvex - movie extends --> contains mehd (movie extends header), trex (track extends) (ref 14)
|
1229
1230
|
# ICAT - 4 bytes: "6350" (Nikon CoolPix S6900), "6500" (Panasonic FT7)
|
1231
|
+
# ctab - color table (ref 29)
|
1230
1232
|
);
|
1231
1233
|
|
1232
1234
|
# (ref CFFMediaFormat-2_1.pdf)
|
@@ -1426,6 +1428,7 @@ my %userDefined = (
|
|
1426
1428
|
# load - track loading settings
|
1427
1429
|
# imap - track input map --> contains ' in' --> contains ' ty', obid
|
1428
1430
|
# prfl - Profile (ref 12)
|
1431
|
+
# txas - track exclude from autoselection (ref 29)
|
1429
1432
|
);
|
1430
1433
|
|
1431
1434
|
# track header data block
|
@@ -1630,6 +1633,10 @@ my %userDefined = (
|
|
1630
1633
|
Start => 4, # must skip 4-byte version number header
|
1631
1634
|
},
|
1632
1635
|
},
|
1636
|
+
tnam => { #29 (NC)
|
1637
|
+
Name => 'TrackName',
|
1638
|
+
IText => 4,
|
1639
|
+
},
|
1633
1640
|
'ptv '=> {
|
1634
1641
|
Name => 'PrintToVideo',
|
1635
1642
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Video' },
|
@@ -2801,6 +2808,8 @@ my %userDefined = (
|
|
2801
2808
|
Name => 'Unknown_grpl',
|
2802
2809
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::grpl' },
|
2803
2810
|
},
|
2811
|
+
# ctry - country list (ref 29)
|
2812
|
+
# lang - language list (ref 29)
|
2804
2813
|
);
|
2805
2814
|
|
2806
2815
|
# unknown grpl container
|
@@ -3279,21 +3288,28 @@ my %userDefined = (
|
|
3279
3288
|
%Image::ExifTool::QuickTime::TrackRef = (
|
3280
3289
|
PROCESS_PROC => \&ProcessMOV,
|
3281
3290
|
GROUPS => { 1 => 'Track#', 2 => 'Video' },
|
3282
|
-
chap => { Name => 'ChapterListTrackID',
|
3283
|
-
tmcd => { Name => '
|
3291
|
+
chap => { Name => 'ChapterListTrackID', Format => 'int32u' },
|
3292
|
+
tmcd => { Name => 'TimecodeTrack', Format => 'int32u' },
|
3284
3293
|
mpod => { #PH (FLIR MP4)
|
3285
3294
|
Name => 'ElementaryStreamTrack',
|
3286
3295
|
Format => 'int32u',
|
3287
3296
|
ValueConv => '$val =~ s/^1 //; $val', # (why 2 numbers? -- ignore the first if "1")
|
3288
3297
|
},
|
3289
|
-
# also:
|
3298
|
+
# also: iTunesInfo
|
3290
3299
|
cdsc => {
|
3291
3300
|
Name => 'ContentDescribes',
|
3292
3301
|
Format => 'int32u',
|
3293
3302
|
PrintConv => '"Track $val"',
|
3294
3303
|
},
|
3295
|
-
|
3296
|
-
|
3304
|
+
clcp => { Name => 'ClosedCaptionTrack', Format => 'int32u' }, #29
|
3305
|
+
fall => { Name => 'AlternateFormatTrack', Format => 'int32u' }, #29
|
3306
|
+
folw => { Name => 'SubtitleTrack', Format => 'int32u' }, #29
|
3307
|
+
forc => { Name => 'ForcedSubtitleTrack', Format => 'int32u' }, #29
|
3308
|
+
scpt => { Name => 'TranscriptTrack', Format => 'int32u' }, #29
|
3309
|
+
ssrc => { Name => 'Non-primarySourceTrack', Format => 'int32u' }, #29
|
3310
|
+
sync => { Name => 'SyncronizedTrack', Format => 'int32u' }, #29
|
3311
|
+
# hint - Original media for hint track (ref 29)
|
3312
|
+
# cdep (Structural Dependency QT tag?)
|
3297
3313
|
);
|
3298
3314
|
|
3299
3315
|
# track aperture mode dimensions atoms
|
@@ -6582,7 +6598,6 @@ my %userDefined = (
|
|
6582
6598
|
'apple.photos.variation-identifier' => { Name => 'ApplePhotosVariationIdentifier', Writable => 'int64s' },
|
6583
6599
|
'direction.facing' => { Name => 'CameraDirection', Groups => { 2 => 'Location' } },
|
6584
6600
|
'direction.motion' => { Name => 'CameraMotion', Groups => { 2 => 'Location' } },
|
6585
|
-
'location.body' => { Name => 'LocationBody', Groups => { 2 => 'Location' } },
|
6586
6601
|
'player.version' => 'PlayerVersion',
|
6587
6602
|
'player.movie.visual.brightness'=> 'Brightness',
|
6588
6603
|
'player.movie.visual.color' => 'Color',
|
@@ -7046,6 +7061,7 @@ my %userDefined = (
|
|
7046
7061
|
Name => 'MediaInfo',
|
7047
7062
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::MediaInfo' },
|
7048
7063
|
},
|
7064
|
+
elng => 'ExtendedLanguageTag', #29 (NC) eg. "zh-CN"
|
7049
7065
|
);
|
7050
7066
|
|
7051
7067
|
# MP4 media header box (ref 5)
|
@@ -7637,6 +7653,8 @@ my %userDefined = (
|
|
7637
7653
|
mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
|
7638
7654
|
mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
|
7639
7655
|
mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
|
7656
|
+
# tbox - text box (ref 29)
|
7657
|
+
# styl - subtitle style (ref 29)
|
7640
7658
|
);
|
7641
7659
|
|
7642
7660
|
# AMR decode config box (ref 3)
|
@@ -111,9 +111,8 @@ 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 104 different types of timed GPS metadata from video files.
|
115
115
|
},
|
116
|
-
VARS => { NO_ID => 1 },
|
117
116
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
118
117
|
GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
|
119
118
|
GPSLatitude2 => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")' },
|
@@ -336,11 +335,25 @@ my %insvLimit = (
|
|
336
335
|
Groups => { 0 => 'Trailer', 1 => 'Insta360' }, # (so these groups will appear in the -listg options)
|
337
336
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::INSV_MakerNotes' },
|
338
337
|
},
|
339
|
-
ssmd => {
|
340
|
-
Name => '
|
338
|
+
ssmd => [{
|
339
|
+
Name => 'RoveGPS', # Rove R2-4K new model
|
340
|
+
# double value of GPSLatitude is 4294967295 (00 00 e0 ff ff ff ef 41) for no GPS
|
341
|
+
Condition => 'length $$valPt == 32 and $$valPt !~ /^\0\0\xe0\xff\xff\xff\xef\x41/',
|
342
|
+
SubDirectory => {
|
343
|
+
TagTable => 'Image::ExifTool::QuickTime::RoveGPS',
|
344
|
+
ByteOrder => 'Little-Endian',
|
345
|
+
},
|
346
|
+
},{
|
347
|
+
Name => 'Accelerometer', # Rove R2-4K new model
|
348
|
+
Condition => 'length $$valPt == 12',
|
349
|
+
Format => 'float',
|
350
|
+
ByteOrder => 'Little-Endian',
|
351
|
+
},{
|
352
|
+
Name => 'PreviewImage', # Chigee AIO-5 dashcam
|
353
|
+
Condition => '$$valPt =~ /^\xff\xd8\xff/',
|
341
354
|
Groups => { 2 => 'Preview' },
|
342
355
|
RawConv => '$self->ValidateImage(\$val,$tag)',
|
343
|
-
},
|
356
|
+
}],
|
344
357
|
djmd => { # (DJI AC003 Osmo Action 4 cam)
|
345
358
|
Name => 'DJIMetadata',
|
346
359
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Protobuf' },
|
@@ -358,6 +371,45 @@ my %insvLimit = (
|
|
358
371
|
MagneticVariation => { }, # (from LIGOGPSINFO)
|
359
372
|
);
|
360
373
|
|
374
|
+
# accelerometer from newer Rove R2-4K cam
|
375
|
+
%Image::ExifTool::QuickTime::RoveGPS = (
|
376
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
377
|
+
GROUPS => { 2 => 'Location' },
|
378
|
+
FIRST_ENTRY => 0,
|
379
|
+
0 => {
|
380
|
+
Name => 'GPSLatitude',
|
381
|
+
Format => 'double',
|
382
|
+
ValueConv => 'my $deg = int($val/100); $val = $deg + ($val - $deg * 100) / 60',
|
383
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
384
|
+
},
|
385
|
+
8 => {
|
386
|
+
Name => 'GPSLongitude',
|
387
|
+
Format => 'double',
|
388
|
+
ValueConv => 'my $deg = int($val/100); $val = $deg + ($val - $deg * 100) / 60',
|
389
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
390
|
+
},
|
391
|
+
20 => {
|
392
|
+
Name => 'GPSSpeed',
|
393
|
+
Format => 'int16u',
|
394
|
+
ValueConv => '$val * 1.852', # convert from knots to km/h
|
395
|
+
},
|
396
|
+
22 => {
|
397
|
+
Name => 'GPSDateTime',
|
398
|
+
Description => 'GPS Date/Time',
|
399
|
+
Groups => { 2 => 'Time' },
|
400
|
+
Format => 'int8u[6]',
|
401
|
+
ValueConv => q{
|
402
|
+
my @v = split ' ', $val;
|
403
|
+
$v[0] += 2000;
|
404
|
+
sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @v);
|
405
|
+
},
|
406
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
407
|
+
},
|
408
|
+
# Seen this in the next 4 bytes:
|
409
|
+
# ff 01 01 00 - good GPS?
|
410
|
+
# ff 00 ff ff - no GPS?
|
411
|
+
);
|
412
|
+
|
361
413
|
# tags found in 'camm' type 0 timed metadata (ref 4)
|
362
414
|
%Image::ExifTool::QuickTime::camm0 = (
|
363
415
|
PROCESS_PROC => \&ProcessCAMM,
|
@@ -2351,12 +2403,12 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2351
2403
|
}
|
2352
2404
|
SetByteOrder($oldOrder);
|
2353
2405
|
return $$et{DOC_NUM} ? 1 : 0 if $done;
|
2354
|
-
return 0 if defined $yr and $mon < 1 or $mon > 12; # quick sanity check
|
2406
|
+
return 0 if defined $yr and ($mon < 1 or $mon > 12); # quick sanity check
|
2355
2407
|
#
|
2356
2408
|
# save tag values extracted by above code
|
2357
2409
|
#
|
2358
2410
|
FoundSomething($et, $tagTbl, $$dirInfo{SampleTime}, $$dirInfo{SampleDuration});
|
2359
|
-
$sec = '0' . $sec
|
2411
|
+
$sec = '0' . $sec if defined $sec and $sec !~ /^\d{2}/; # pad integer part of seconds to 2 digits
|
2360
2412
|
if (defined $yr) {
|
2361
2413
|
$yr += 2000 if $yr < 2000;
|
2362
2414
|
my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%sZ',$yr,$mon,$day,$hr,$min,$sec);
|
@@ -2368,8 +2420,8 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2368
2420
|
if (defined $lat and defined $lon) {
|
2369
2421
|
# lat/long are in DDDMM.MMMM format unless $ddd is set
|
2370
2422
|
ConvertLatLon($lat, $lon) unless $ddd;
|
2371
|
-
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
2372
|
-
$et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
|
2423
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat * (($latRef and $latRef eq 'S') ? -1 : 1));
|
2424
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon * (($lonRef and $lonRef eq 'W') ? -1 : 1));
|
2373
2425
|
}
|
2374
2426
|
$et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt;
|
2375
2427
|
$et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd;
|
@@ -982,6 +982,11 @@ numerical, and generated automatically otherwise.
|
|
982
982
|
for use when ExtractInfo is called with the ReEntry flag from
|
983
983
|
inside the RawConv of a tag.
|
984
984
|
|
985
|
+
ByteOrder : [Non-writable tags extracted with HandleTag and writable EXIF
|
986
|
+
offset-pair tags only] Specifies byte order if tag value is
|
987
|
+
stored with a constant byte order that is different from that
|
988
|
+
of the parent directory.
|
989
|
+
|
985
990
|
TagID : [reserved] Used internally to save the table key for this tag.
|
986
991
|
Note: For XMP tables this corresponds to the XMP property
|
987
992
|
name, but the table key may have a full XMP namespace prefix
|
@@ -1071,8 +1076,8 @@ numerical, and generated automatically otherwise.
|
|
1071
1076
|
ByteOrder : Specifies byte ordering if different than than the rest of the
|
1072
1077
|
file. Must be either BigEndian, LittleEndian or Unknown. If
|
1073
1078
|
Unknown is specified, the byte order will be determined from
|
1074
|
-
the directory count (however, this can not be done if
|
1075
|
-
is specified).
|
1079
|
+
the directory count for EXIF (however, this can not be done if
|
1080
|
+
OffsetPt is specified).
|
1076
1081
|
|
1077
1082
|
Validate : If given, specifies Perl expression which is used to validate
|
1078
1083
|
the subdirectory data (regardless of Validate option setting).
|