exiftool-vendored.pl 12.43.0 → 12.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/Changes +45 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +2 -2
- package/bin/exiftool +26 -22
- package/bin/fmt_files/gpx.fmt +3 -0
- package/bin/fmt_files/gpx_wpt.fmt +3 -0
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -4
- package/bin/lib/Image/ExifTool/Canon.pm +17 -11
- package/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -0
- package/bin/lib/Image/ExifTool/EXE.pm +9 -1
- package/bin/lib/Image/ExifTool/Exif.pm +5 -5
- package/bin/lib/Image/ExifTool/FLIR.pm +4 -3
- package/bin/lib/Image/ExifTool/FlashPix.pm +9 -1
- package/bin/lib/Image/ExifTool/FujiFilm.pm +3 -1
- package/bin/lib/Image/ExifTool/GPS.pm +21 -1
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -1
- package/bin/lib/Image/ExifTool/ID3.pm +1 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +24 -16
- package/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +70 -24
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +18 -5
- package/bin/lib/Image/ExifTool/Parrot.pm +95 -2
- package/bin/lib/Image/ExifTool/QuickTime.pm +86 -4
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +7 -4
- package/bin/lib/Image/ExifTool/README +3 -1
- package/bin/lib/Image/ExifTool/Sony.pm +8 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +34 -8
- package/bin/lib/Image/ExifTool/TagNames.pod +94 -25
- package/bin/lib/Image/ExifTool/Validate.pm +3 -3
- package/bin/lib/Image/ExifTool/WriteExif.pl +81 -22
- package/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- package/bin/lib/Image/ExifTool/Writer.pl +7 -4
- package/bin/lib/Image/ExifTool/XMP.pm +7 -3
- package/bin/lib/Image/ExifTool/XMP2.pl +11 -4
- package/bin/lib/Image/ExifTool.pm +1 -1
- package/bin/lib/Image/ExifTool.pod +6 -5
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/pp_build_exe.args +4 -4
- package/package.json +1 -1
|
@@ -14,7 +14,7 @@ use strict;
|
|
|
14
14
|
use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool::Exif;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.02';
|
|
18
18
|
|
|
19
19
|
# Motorola makernotes tags (ref PH)
|
|
20
20
|
%Image::ExifTool::Motorola::Main = (
|
|
@@ -54,7 +54,12 @@ $VERSION = '1.01';
|
|
|
54
54
|
# 0x6400 - string: 'AUTO','ON','OFF'
|
|
55
55
|
# 0x6401 - string: 'HDR'
|
|
56
56
|
# 0x6410 - string: 'NO','YES'
|
|
57
|
-
# 0x6420 - int32s: 0 (only exists in HDR images?)
|
|
57
|
+
# 0x6420 - int32s for some models: 0 (only exists in HDR images?)
|
|
58
|
+
0x6420 => { #forum13731
|
|
59
|
+
Condition => '$format eq "string"',
|
|
60
|
+
Name => 'CustomRendered',
|
|
61
|
+
Writable => 'string',
|
|
62
|
+
},
|
|
58
63
|
# 0x6430 - float
|
|
59
64
|
# 0x6431 - int8u: 0,1
|
|
60
65
|
# 0x6432 - int8u: 0,79,100
|
|
@@ -89,6 +94,7 @@ $VERSION = '1.01';
|
|
|
89
94
|
# 0x64c2,0x64c3 - int32s
|
|
90
95
|
# 0x64c4 - int32s
|
|
91
96
|
# 0x64c5 - int32u
|
|
97
|
+
0x64d0 => { Name => 'DriveMode', Writable => 'string' }, #forum13731
|
|
92
98
|
# 0x6500 - int8u: 1
|
|
93
99
|
# 0x6501 - string: 'Luma-Chroma Plane','Chroma only' or int8u: 0
|
|
94
100
|
# 0x6502 - string: 'Luma-Chroma Plane','Chroma only','' or int8u: 1,255
|
|
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
|
|
|
63
63
|
use Image::ExifTool::GPS;
|
|
64
64
|
use Image::ExifTool::XMP;
|
|
65
65
|
|
|
66
|
-
$VERSION = '4.
|
|
66
|
+
$VERSION = '4.09';
|
|
67
67
|
|
|
68
68
|
sub LensIDConv($$$);
|
|
69
69
|
sub ProcessNikonAVI($$$);
|
|
@@ -1624,6 +1624,11 @@ my %base64coord = (
|
|
|
1624
1624
|
3 => 'Small',
|
|
1625
1625
|
},
|
|
1626
1626
|
},
|
|
1627
|
+
0x003f => { #https://github.com/darktable-org/darktable/issues/12282
|
|
1628
|
+
Name => 'WhiteBalanceFineTune',
|
|
1629
|
+
Writable => 'rational64s',
|
|
1630
|
+
Count => 2,
|
|
1631
|
+
},
|
|
1627
1632
|
0x0045 => { #IB
|
|
1628
1633
|
Name => 'CropArea',
|
|
1629
1634
|
Notes => 'left, top, width, height',
|
|
@@ -2081,7 +2086,7 @@ my %base64coord = (
|
|
|
2081
2086
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
|
|
2082
2087
|
DecryptStart => 4,
|
|
2083
2088
|
# TODO: eventually set the length dynamically according to actual offsets!
|
|
2084
|
-
DecryptLen => 0xec4b +
|
|
2089
|
+
DecryptLen => 0xec4b + 1907, # decoded thru end of Offset26
|
|
2085
2090
|
ByteOrder => 'LittleEndian',
|
|
2086
2091
|
},
|
|
2087
2092
|
},
|
|
@@ -4867,7 +4872,7 @@ my %nikonFocalConversions = (
|
|
|
4867
4872
|
%binaryDataAttrs,
|
|
4868
4873
|
NOTES => 'Tags found in the encrypted LensData from cameras such as the Z6 and Z7.',
|
|
4869
4874
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4870
|
-
DATAMEMBER => [ 0x03, 0x2f ],
|
|
4875
|
+
DATAMEMBER => [ 0x03, 0x2f, 0x35, 0x4c, 0x56 ],
|
|
4871
4876
|
0x00 => {
|
|
4872
4877
|
Name => 'LensDataVersion',
|
|
4873
4878
|
Format => 'string[4]',
|
|
@@ -4893,12 +4898,12 @@ my %nikonFocalConversions = (
|
|
|
4893
4898
|
%nikonApertureConversions,
|
|
4894
4899
|
},
|
|
4895
4900
|
# --> another extra byte at position 0x08 in this version of LensData (PH)
|
|
4896
|
-
0x09 => {
|
|
4897
|
-
|
|
4898
|
-
|
|
4899
|
-
|
|
4900
|
-
|
|
4901
|
-
},
|
|
4901
|
+
#0x09 => {
|
|
4902
|
+
# Name => 'FocusPosition', #28 - this appears to be copied from an older version of LensData and is no longer valid. Text with Z9 and Z7_2 with a variety of lenses
|
|
4903
|
+
# Condition => '$$self{OldLensData}',
|
|
4904
|
+
# PrintConv => 'sprintf("0x%02x", $val)',
|
|
4905
|
+
# PrintConvInv => '$val',
|
|
4906
|
+
#},
|
|
4902
4907
|
0x0b => {
|
|
4903
4908
|
Notes => 'this focus distance is approximate, and not very accurate for some lenses',
|
|
4904
4909
|
Name => 'FocusDistance',
|
|
@@ -4957,7 +4962,8 @@ my %nikonFocalConversions = (
|
|
|
4957
4962
|
%nikonApertureConversions,
|
|
4958
4963
|
},
|
|
4959
4964
|
#
|
|
4960
|
-
# ---- new LensData tags used by Nikkor Z
|
|
4965
|
+
# ---- new LensData tags used by Nikkor Z cameras (ref PH/28). ----
|
|
4966
|
+
# (some fields are strictly for Z-series lenses, others apply to legacy F-mount as well, ref 28)
|
|
4961
4967
|
#
|
|
4962
4968
|
0x2f => { # look forward to see if new lens data exists...
|
|
4963
4969
|
Name => 'NewLensData',
|
|
@@ -4965,7 +4971,7 @@ my %nikonFocalConversions = (
|
|
|
4965
4971
|
RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
|
|
4966
4972
|
Hidden => 1,
|
|
4967
4973
|
},
|
|
4968
|
-
0x30 => {
|
|
4974
|
+
0x30 => { #PH
|
|
4969
4975
|
Name => 'LensID',
|
|
4970
4976
|
Condition => '$$self{NewLensData}',
|
|
4971
4977
|
Notes => 'tags from here onward used for Nikkor Z lenses only',
|
|
@@ -4991,9 +4997,22 @@ my %nikonFocalConversions = (
|
|
|
4991
4997
|
27 => 'Nikkor Z MC 50mm f/2.8', #IB
|
|
4992
4998
|
28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
|
|
4993
4999
|
29 => 'Nikkor Z 28mm f/2.8', #IB
|
|
5000
|
+
30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
|
|
5001
|
+
31 => 'Nikkor Z 24-120 f/4', #28
|
|
5002
|
+
32 => 'Nikkor Z 800mm f/6.3 VR S', #28
|
|
4994
5003
|
},
|
|
4995
5004
|
},
|
|
4996
|
-
|
|
5005
|
+
0x35 => { #28
|
|
5006
|
+
Name => 'LensMountType',
|
|
5007
|
+
RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
|
|
5008
|
+
Format => 'int8u',
|
|
5009
|
+
Unknown => 1,
|
|
5010
|
+
PrintConv => {
|
|
5011
|
+
0 => 'F-mount Lens',
|
|
5012
|
+
1 => 'Z-mount Lens',
|
|
5013
|
+
},
|
|
5014
|
+
},
|
|
5015
|
+
0x36 => { #PH
|
|
4997
5016
|
Name => 'MaxAperture',
|
|
4998
5017
|
Condition => '$$self{NewLensData}',
|
|
4999
5018
|
Format => 'int16u',
|
|
@@ -5003,7 +5022,7 @@ my %nikonFocalConversions = (
|
|
|
5003
5022
|
PrintConv => 'sprintf("%.1f",$val)',
|
|
5004
5023
|
PrintConvInv => '$val',
|
|
5005
5024
|
},
|
|
5006
|
-
0x38 => {
|
|
5025
|
+
0x38 => { #PH
|
|
5007
5026
|
Name => 'FNumber',
|
|
5008
5027
|
Condition => '$$self{NewLensData}',
|
|
5009
5028
|
Format => 'int16u',
|
|
@@ -5013,7 +5032,7 @@ my %nikonFocalConversions = (
|
|
|
5013
5032
|
PrintConv => 'sprintf("%.1f",$val)',
|
|
5014
5033
|
PrintConvInv => '$val',
|
|
5015
5034
|
},
|
|
5016
|
-
0x3c => {
|
|
5035
|
+
0x3c => { #PH
|
|
5017
5036
|
Name => 'FocalLength',
|
|
5018
5037
|
Condition => '$$self{NewLensData}',
|
|
5019
5038
|
Format => 'int16u',
|
|
@@ -5021,14 +5040,36 @@ my %nikonFocalConversions = (
|
|
|
5021
5040
|
PrintConv => '"$val mm"',
|
|
5022
5041
|
PrintConvInv => '$val=~s/\s*mm$//;$val',
|
|
5023
5042
|
},
|
|
5024
|
-
|
|
5025
|
-
Name => '
|
|
5026
|
-
|
|
5027
|
-
|
|
5043
|
+
0x4c => { #28
|
|
5044
|
+
Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity.
|
|
5045
|
+
Format => 'int8u',
|
|
5046
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5047
|
+
RawConv => '$$self{FocusDistanceRangeWidth} = $val',
|
|
5048
|
+
Unknown => 1,
|
|
5049
|
+
},
|
|
5050
|
+
0x4e => { #28
|
|
5051
|
+
Name => 'FocusDistance',
|
|
5052
|
+
Format => 'int16u',
|
|
5053
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5054
|
+
RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter
|
|
5028
5055
|
ValueConv => '0.01 * 10**($val/40)', # in m
|
|
5029
5056
|
ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
|
|
5030
|
-
PrintConv =>
|
|
5031
|
-
|
|
5057
|
+
PrintConv => q{
|
|
5058
|
+
$$self{FocusDistanceRangeWidth} == 0 ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
|
|
5059
|
+
},
|
|
5060
|
+
},
|
|
5061
|
+
0x56 => { #28
|
|
5062
|
+
Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
|
|
5063
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5064
|
+
Format => 'int8u',
|
|
5065
|
+
RawConv => 'unless ($$self{FocusDistanceRangeWidth} == 0 ) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
|
|
5066
|
+
Unknown => 1,
|
|
5067
|
+
},
|
|
5068
|
+
0x5a => { #28
|
|
5069
|
+
Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
|
|
5070
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5071
|
+
Format => 'int32s',
|
|
5072
|
+
Unknown => 1,
|
|
5032
5073
|
},
|
|
5033
5074
|
);
|
|
5034
5075
|
|
|
@@ -8753,13 +8794,18 @@ my %nikonFocalConversions = (
|
|
|
8753
8794
|
6 => '+08:00 (Beijing, Honk Kong, Sinapore)',
|
|
8754
8795
|
10 => '+05:45 (Kathmandu)',
|
|
8755
8796
|
11 => '+05:30 (New Dehli)',
|
|
8797
|
+
12 => '+05:00 (Islamabad)',
|
|
8798
|
+
13 => '+04:30 (Kabul)',
|
|
8799
|
+
14 => '+04:00 (Abu Dhabi)',
|
|
8800
|
+
15 => '+03:30 (Tehran)',
|
|
8756
8801
|
16 => '+03:00 (Moscow, Nairobi)',
|
|
8757
|
-
15 => '+02:00 (Athens)',
|
|
8758
|
-
16 => '+01:00 (Madrid, Paris, Berlin)',
|
|
8759
8802
|
17 => '+02:00 (Athens, Helsinki)',
|
|
8760
|
-
18 => '+
|
|
8761
|
-
19 => '+00:00',
|
|
8803
|
+
18 => '+01:00 (Madrid, Paris, Berlin)',
|
|
8804
|
+
19 => '+00:00 (London)',
|
|
8805
|
+
20 => '-01:00 (Azores)',
|
|
8806
|
+
21 => '-02:00 (Fernando de Noronha)',
|
|
8762
8807
|
22 => '-03:00 (Buenos Aires, Sao Paulo)',
|
|
8808
|
+
23 => '-03:30 (Newfoundland)',
|
|
8763
8809
|
24 => '-04:00 (Manaus, Caracas)',
|
|
8764
8810
|
25 => '-05:00 (New York, Toronto, Lima)',
|
|
8765
8811
|
26 => '-06:00 (Chicago, Mexico City)',
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
use Image::ExifTool::Exif;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.26';
|
|
25
25
|
|
|
26
26
|
sub ProcessJpgFromRaw($$$);
|
|
27
27
|
sub WriteJpgFromRaw($$$);
|
|
@@ -218,6 +218,7 @@ my %panasonicWhiteBalance = ( #forum9396
|
|
|
218
218
|
0x30 => { Name => 'CropLeft', Writable => 'int16u' },
|
|
219
219
|
0x31 => { Name => 'CropBottom', Writable => 'int16u' },
|
|
220
220
|
0x32 => { Name => 'CropRight', Writable => 'int16u' },
|
|
221
|
+
# 0x44 - may contain another pointer to the raw data starting at byte 2 in this data (DC-GH6)
|
|
221
222
|
0x10f => {
|
|
222
223
|
Name => 'Make',
|
|
223
224
|
Groups => { 2 => 'Camera' },
|
|
@@ -737,6 +738,7 @@ sub WriteDistortionInfo($$$)
|
|
|
737
738
|
# 2 - value count
|
|
738
739
|
# 3 - reference to list of original offset values
|
|
739
740
|
# 4 - IFD format number
|
|
741
|
+
# 5 - (pointer to StripOffsets value added by this PatchRawDataOffset routine)
|
|
740
742
|
sub PatchRawDataOffset($$$)
|
|
741
743
|
{
|
|
742
744
|
my ($offsetInfo, $raf, $ifd) = @_;
|
|
@@ -745,15 +747,26 @@ sub PatchRawDataOffset($$$)
|
|
|
745
747
|
my $rawDataOffset = $$offsetInfo{0x118};
|
|
746
748
|
my $err;
|
|
747
749
|
$err = 1 unless $ifd == 0;
|
|
748
|
-
|
|
749
|
-
|
|
750
|
+
if ($stripOffsets or $stripByteCounts) {
|
|
751
|
+
$err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
|
|
752
|
+
} else {
|
|
753
|
+
# the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
|
|
754
|
+
# to create fake StripByteCounts information for copying the data
|
|
755
|
+
# (disable this until SilkyPix and Adobe utilities can deal with a variable
|
|
756
|
+
# RawDataOffset, see https://exiftool.org/forum/index.php?topic=13861.0 --
|
|
757
|
+
# so these files will continue to give a "No size tag" error when writing)
|
|
758
|
+
# $stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
|
|
759
|
+
}
|
|
760
|
+
if ($rawDataOffset and not $err) {
|
|
750
761
|
$err = 1 unless $$rawDataOffset[2] == 1;
|
|
751
|
-
$
|
|
762
|
+
if ($stripOffsets) {
|
|
763
|
+
$err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
|
|
764
|
+
}
|
|
752
765
|
}
|
|
753
766
|
$err and return 'Unsupported Panasonic/Leica RAW variant';
|
|
754
767
|
if ($rawDataOffset) {
|
|
755
768
|
# update StripOffsets along with this tag if it contains a reasonable value
|
|
756
|
-
|
|
769
|
+
if ($stripOffsets and $$stripOffsets[3][0] != 0xffffffff) {
|
|
757
770
|
# save pointer to StripOffsets value for updating later
|
|
758
771
|
push @$rawDataOffset, $$stripOffsets[1];
|
|
759
772
|
}
|
|
@@ -13,8 +13,9 @@ package Image::ExifTool::Parrot;
|
|
|
13
13
|
|
|
14
14
|
use strict;
|
|
15
15
|
use vars qw($VERSION);
|
|
16
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
|
16
17
|
|
|
17
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.02';
|
|
18
19
|
|
|
19
20
|
sub Process_mett($$$);
|
|
20
21
|
|
|
@@ -22,7 +23,10 @@ sub Process_mett($$$);
|
|
|
22
23
|
%Image::ExifTool::Parrot::mett = (
|
|
23
24
|
PROCESS_PROC => \&Process_mett,
|
|
24
25
|
# put the 'P' records first in the documentation
|
|
25
|
-
VARS => {
|
|
26
|
+
VARS => {
|
|
27
|
+
SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b },
|
|
28
|
+
LONG_TAGS => 1
|
|
29
|
+
},
|
|
26
30
|
NOTES => q{
|
|
27
31
|
Streaming metadata found in Parrot drone videos. See
|
|
28
32
|
L<https://developer.parrot.com/docs/pdraw/metadata.html> for the
|
|
@@ -52,6 +56,23 @@ sub Process_mett($$$);
|
|
|
52
56
|
Name => 'ParrotAutomation',
|
|
53
57
|
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::Automation' },
|
|
54
58
|
},
|
|
59
|
+
# timed metadata written by ARCore (see forum13653)
|
|
60
|
+
'application/arcore-accel' => {
|
|
61
|
+
Name => 'ARCoreAccel',
|
|
62
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel', ByteOrder => 'II' },
|
|
63
|
+
},
|
|
64
|
+
'application/arcore-gyro' => {
|
|
65
|
+
Name => 'ARCoreGyro',
|
|
66
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro', ByteOrder => 'II' },
|
|
67
|
+
},
|
|
68
|
+
'application/arcore-video-0' => {
|
|
69
|
+
Name => 'ARCoreVideo',
|
|
70
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreVideo', ByteOrder => 'II' },
|
|
71
|
+
},
|
|
72
|
+
'application/arcore-custom-event' => {
|
|
73
|
+
Name => 'ARCoreCustom',
|
|
74
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreCustom', ByteOrder => 'II' },
|
|
75
|
+
},
|
|
55
76
|
);
|
|
56
77
|
|
|
57
78
|
# tags found in the Parrot 'mett' V1 timed metadata (ref 1) [untested]
|
|
@@ -630,6 +651,69 @@ sub Process_mett($$$);
|
|
|
630
651
|
},
|
|
631
652
|
);
|
|
632
653
|
|
|
654
|
+
# ARCore Accel data (ref PH)
|
|
655
|
+
%Image::ExifTool::Parrot::ARCoreAccel = (
|
|
656
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
657
|
+
GROUPS => { 2 => 'Location' },
|
|
658
|
+
NOTES => 'ARCore accelerometer data.',
|
|
659
|
+
FIRST_ENTRY => 0,
|
|
660
|
+
# 00-04: always 10 34 16 1 29
|
|
661
|
+
4 => {
|
|
662
|
+
Name => 'AccelerometerUnknown',
|
|
663
|
+
Format => 'undef[16]',
|
|
664
|
+
Unknown => 1,
|
|
665
|
+
ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
|
|
666
|
+
},
|
|
667
|
+
5 => { # (NC)
|
|
668
|
+
Name => 'Accelerometer',
|
|
669
|
+
Format => 'undef[14]',
|
|
670
|
+
RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
|
|
671
|
+
},
|
|
672
|
+
# 05-08: float Accelerometer X
|
|
673
|
+
# 09: 37
|
|
674
|
+
# 10-13: float Accelerometer Y
|
|
675
|
+
# 14: 45
|
|
676
|
+
# 15-18: float Accelerometer Z
|
|
677
|
+
# 19: 48
|
|
678
|
+
# 20-24: 128-255
|
|
679
|
+
# 25: 246 then 247
|
|
680
|
+
# 26: 188
|
|
681
|
+
# 27: 2
|
|
682
|
+
# 28: 56
|
|
683
|
+
# 29-32: 128-255
|
|
684
|
+
# 33: increments slowly (about once every 56 samples or so)
|
|
685
|
+
);
|
|
686
|
+
|
|
687
|
+
# ARCore Gyro data (ref PH)
|
|
688
|
+
%Image::ExifTool::Parrot::ARCoreGyro = (
|
|
689
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
690
|
+
GROUPS => { 2 => 'Location' },
|
|
691
|
+
NOTES => 'ARCore accelerometer data.',
|
|
692
|
+
FIRST_ENTRY => 0,
|
|
693
|
+
# 00-04: always 10 34 16 3 29
|
|
694
|
+
4 => {
|
|
695
|
+
Name => 'GyroscopeUnknown',
|
|
696
|
+
Format => 'undef[16]',
|
|
697
|
+
Unknown => 1, # always "29 37 45 48" in my sample, just like AccelerometerUnknown
|
|
698
|
+
ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
|
|
699
|
+
},
|
|
700
|
+
5 => { # (NC)
|
|
701
|
+
Name => 'Gyroscope',
|
|
702
|
+
Format => 'undef[14]',
|
|
703
|
+
RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
|
|
704
|
+
},
|
|
705
|
+
);
|
|
706
|
+
|
|
707
|
+
%Image::ExifTool::Parrot::ARCoreVideo = (
|
|
708
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
709
|
+
FIRST_ENTRY => 0,
|
|
710
|
+
);
|
|
711
|
+
|
|
712
|
+
%Image::ExifTool::Parrot::ARCoreCustom = (
|
|
713
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
714
|
+
FIRST_ENTRY => 0,
|
|
715
|
+
);
|
|
716
|
+
|
|
633
717
|
%Image::ExifTool::Parrot::Composite = (
|
|
634
718
|
GPSDateTime => {
|
|
635
719
|
Description => 'GPS Date/Time',
|
|
@@ -677,9 +761,18 @@ sub Process_mett($$$)
|
|
|
677
761
|
my $dataPos = $$dirInfo{DataPos};
|
|
678
762
|
my $dirEnd = length $$dataPt;
|
|
679
763
|
my $pos = $$dirInfo{DirStart} || 0;
|
|
764
|
+
my $metaType = $$et{MetaType} || '';
|
|
680
765
|
|
|
681
766
|
$et->VerboseDir('Parrot mett', undef, $dirEnd);
|
|
682
767
|
|
|
768
|
+
if ($$tagTbl{$metaType}) {
|
|
769
|
+
$et->HandleTag($tagTbl, $metaType, undef,
|
|
770
|
+
DataPt => $dataPt,
|
|
771
|
+
DataPos => $dataPos,
|
|
772
|
+
Base => $$dirInfo{Base},
|
|
773
|
+
);
|
|
774
|
+
return 1;
|
|
775
|
+
}
|
|
683
776
|
while ($pos + 4 < $dirEnd) {
|
|
684
777
|
my ($id, $nwords) = unpack("x${pos}a2n", $$dataPt);
|
|
685
778
|
my $size;
|
|
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
47
47
|
use Image::ExifTool::Exif;
|
|
48
48
|
use Image::ExifTool::GPS;
|
|
49
49
|
|
|
50
|
-
$VERSION = '2.
|
|
50
|
+
$VERSION = '2.76';
|
|
51
51
|
|
|
52
52
|
sub ProcessMOV($$;$);
|
|
53
53
|
sub ProcessKeys($$$);
|
|
@@ -556,12 +556,16 @@ my %eeBox2 = (
|
|
|
556
556
|
mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
|
|
557
557
|
'mdat-size' => {
|
|
558
558
|
Name => 'MediaDataSize',
|
|
559
|
+
RawConv => '$$self{MediaDataSize} = $val',
|
|
559
560
|
Notes => q{
|
|
560
561
|
not a real tag ID, this tag represents the size of the 'mdat' data in bytes
|
|
561
562
|
and is used in the AvgBitrate calculation
|
|
562
563
|
},
|
|
563
564
|
},
|
|
564
|
-
'mdat-offset' =>
|
|
565
|
+
'mdat-offset' => {
|
|
566
|
+
Name => 'MediaDataOffset',
|
|
567
|
+
RawConv => '$$self{MediaDataOffset} = $val',
|
|
568
|
+
},
|
|
565
569
|
junk => { Unknown => 1, Binary => 1 }, #8
|
|
566
570
|
uuid => [
|
|
567
571
|
{ #9 (MP4 files)
|
|
@@ -897,7 +901,7 @@ my %eeBox2 = (
|
|
|
897
901
|
},
|
|
898
902
|
colr => {
|
|
899
903
|
Name => 'ColorRepresentation',
|
|
900
|
-
|
|
904
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
901
905
|
},
|
|
902
906
|
pasp => {
|
|
903
907
|
Name => 'PixelAspectRatio',
|
|
@@ -2732,7 +2736,7 @@ my %eeBox2 = (
|
|
|
2732
2736
|
},
|
|
2733
2737
|
},{
|
|
2734
2738
|
Name => 'ColorRepresentation',
|
|
2735
|
-
|
|
2739
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
2736
2740
|
}],
|
|
2737
2741
|
irot => {
|
|
2738
2742
|
Name => 'Rotation',
|
|
@@ -2792,6 +2796,78 @@ my %eeBox2 = (
|
|
|
2792
2796
|
},
|
|
2793
2797
|
);
|
|
2794
2798
|
|
|
2799
|
+
# ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
|
|
2800
|
+
%Image::ExifTool::QuickTime::ColorRep = (
|
|
2801
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
2802
|
+
GROUPS => { 2 => 'Video' },
|
|
2803
|
+
FIRST_ENTRY => 0,
|
|
2804
|
+
0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
|
|
2805
|
+
4 => {
|
|
2806
|
+
Name => 'ColorPrimaries',
|
|
2807
|
+
Format => 'int16u',
|
|
2808
|
+
PrintConv => {
|
|
2809
|
+
1 => 'BT.709',
|
|
2810
|
+
2 => 'Unspecified',
|
|
2811
|
+
4 => 'BT.470 System M (historical)',
|
|
2812
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2813
|
+
6 => 'BT.601',
|
|
2814
|
+
7 => 'SMPTE 240',
|
|
2815
|
+
8 => 'Generic film (color filters using illuminant C)',
|
|
2816
|
+
9 => 'BT.2020, BT.2100',
|
|
2817
|
+
10 => 'SMPTE 428 (CIE 1921 XYZ)',
|
|
2818
|
+
11 => 'SMPTE RP 431-2',
|
|
2819
|
+
12 => 'SMPTE EG 432-1',
|
|
2820
|
+
22 => 'EBU Tech. 3213-E',
|
|
2821
|
+
},
|
|
2822
|
+
},
|
|
2823
|
+
6 => {
|
|
2824
|
+
Name => 'TransferCharacteristics',
|
|
2825
|
+
Format => 'int16u',
|
|
2826
|
+
PrintConv => {
|
|
2827
|
+
0 => 'For future use (0)',
|
|
2828
|
+
1 => 'BT.709',
|
|
2829
|
+
2 => 'Unspecified',
|
|
2830
|
+
3 => 'For future use (3)',
|
|
2831
|
+
4 => 'BT.470 System M (historical)',
|
|
2832
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2833
|
+
6 => 'BT.601',
|
|
2834
|
+
7 => 'SMPTE 240 M',
|
|
2835
|
+
8 => 'Linear',
|
|
2836
|
+
9 => 'Logarithmic (100 : 1 range)',
|
|
2837
|
+
10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
|
|
2838
|
+
11 => 'IEC 61966-2-4',
|
|
2839
|
+
12 => 'BT.1361',
|
|
2840
|
+
13 => 'sRGB or sYCC',
|
|
2841
|
+
14 => 'BT.2020 10-bit systems',
|
|
2842
|
+
15 => 'BT.2020 12-bit systems',
|
|
2843
|
+
16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
|
|
2844
|
+
17 => 'SMPTE ST 428',
|
|
2845
|
+
18 => 'BT.2100 HLG, ARIB STD-B67',
|
|
2846
|
+
},
|
|
2847
|
+
},
|
|
2848
|
+
8 => {
|
|
2849
|
+
Name => 'MatrixCoefficients',
|
|
2850
|
+
Format => 'int16u',
|
|
2851
|
+
PrintConv => {
|
|
2852
|
+
0 => 'Identity matrix',
|
|
2853
|
+
1 => 'BT.709',
|
|
2854
|
+
2 => 'Unspecified',
|
|
2855
|
+
3 => 'For future use (3)',
|
|
2856
|
+
4 => 'US FCC 73.628',
|
|
2857
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2858
|
+
6 => 'BT.601',
|
|
2859
|
+
7 => 'SMPTE 240 M',
|
|
2860
|
+
8 => 'YCgCo',
|
|
2861
|
+
9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
|
|
2862
|
+
10 => 'BT.2020 constant luminance',
|
|
2863
|
+
11 => 'SMPTE ST 2085 YDzDx',
|
|
2864
|
+
12 => 'Chromaticity-derived non-constant luminance',
|
|
2865
|
+
13 => 'Chromaticity-derived constant luminance',
|
|
2866
|
+
14 => 'BT.2100 ICtCp',
|
|
2867
|
+
},
|
|
2868
|
+
},
|
|
2869
|
+
);
|
|
2870
|
+
|
|
2795
2871
|
# HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
|
|
2796
2872
|
%Image::ExifTool::QuickTime::HEVCConfig = (
|
|
2797
2873
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -7516,6 +7592,12 @@ my %eeBox2 = (
|
|
|
7516
7592
|
Format => 'undef[4]',
|
|
7517
7593
|
RawConv => '$$self{MetaFormat} = $val',
|
|
7518
7594
|
},
|
|
7595
|
+
8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett'
|
|
7596
|
+
Name => 'MetaType',
|
|
7597
|
+
Format => 'undef[$size-8]',
|
|
7598
|
+
# may start at various locations!
|
|
7599
|
+
RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)',
|
|
7600
|
+
},
|
|
7519
7601
|
#
|
|
7520
7602
|
# Observed offsets for child atoms of various MetaFormat types:
|
|
7521
7603
|
#
|
|
@@ -1527,7 +1527,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1527
1527
|
$spd = $9 * $knotsToKph if length $9;
|
|
1528
1528
|
$trk = $10 if length $10;
|
|
1529
1529
|
|
|
1530
|
-
} elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0/s) {
|
|
1530
|
+
} elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
|
|
1531
1531
|
|
|
1532
1532
|
# Akaso V1 dascham
|
|
1533
1533
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
|
|
@@ -1624,6 +1624,9 @@ sub ProcessFreeGPS($$$)
|
|
|
1624
1624
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
|
|
1625
1625
|
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1626
1626
|
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1627
|
+
# 0030: 10 00 00 00 2d 00 00 00 14 00 00 00 11 00 00 00 [....-...........]
|
|
1628
|
+
# 0040: 0c 00 00 00 1f 00 00 00 41 4e 45 00 5d 9a a9 45 [........ANE.]..E]
|
|
1629
|
+
# 0050: ab 1e e5 44 ec 51 f0 40 b8 5e a5 43 00 00 00 00 [...D.Q.@.^.C....]
|
|
1627
1630
|
# (records are same structure as Type 3 Novatek GPS in ProcessFreeGPS2() below)
|
|
1628
1631
|
($hr,$min,$sec,$yr,$mon,$day,$stat,$latRef,$lonRef,$lat,$lon,$spd,$trk) =
|
|
1629
1632
|
unpack('x48V6a1a1a1x1V4', $$dataPt);
|
|
@@ -2700,7 +2703,7 @@ sub ProcessInsta360($;$)
|
|
|
2700
2703
|
$a[$_] = GetDouble(\$a[$_], 0) foreach 4,6,8,9,10;
|
|
2701
2704
|
$a[4] = -abs($a[4]) if $a[5] eq 'S'; # (abs just in case it was already signed)
|
|
2702
2705
|
$a[6] = -abs($a[6]) if $a[7] ne 'E';
|
|
2703
|
-
$et->HandleTag($tagTbl,
|
|
2706
|
+
$et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($a[0]) . 'Z');
|
|
2704
2707
|
$et->HandleTag($tagTbl, GPSLatitude => $a[4]);
|
|
2705
2708
|
$et->HandleTag($tagTbl, GPSLongitude => $a[6]);
|
|
2706
2709
|
$et->HandleTag($tagTbl, GPSSpeed => $a[8] * $mpsToKph);
|
|
@@ -2808,9 +2811,9 @@ sub ScanMediaData($)
|
|
|
2808
2811
|
my ($pos, $buf2) = (0, '');
|
|
2809
2812
|
|
|
2810
2813
|
# don't rescan for freeGPS if we already found embedded metadata
|
|
2811
|
-
my $dataPos = $$et{
|
|
2814
|
+
my $dataPos = $$et{MediaDataOffset};
|
|
2812
2815
|
if ($dataPos and not $$et{DOC_COUNT}) {
|
|
2813
|
-
$dataLen = $$et{
|
|
2816
|
+
$dataLen = $$et{MediaDataSize};
|
|
2814
2817
|
if ($dataLen) {
|
|
2815
2818
|
if ($raf->Seek($dataPos, 0)) {
|
|
2816
2819
|
$$et{FreeGPS2} = { }; # initialize variable space for FreeGPS2()
|
|
@@ -395,7 +395,9 @@ numerical, and generated automatically otherwise.
|
|
|
395
395
|
be accessible.
|
|
396
396
|
|
|
397
397
|
'Hidden' - set to hide tag from the TagName documentation.
|
|
398
|
-
Also suppresses verbose output of a BinaryData tag.
|
|
398
|
+
Also suppresses verbose output of a BinaryData tag. The
|
|
399
|
+
RawConv of a Hidden tag should return undef so the tag value
|
|
400
|
+
is not seen by the user.
|
|
399
401
|
|
|
400
402
|
'IsComposite' - flag set for Composite tags
|
|
401
403
|
|
|
@@ -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.52';
|
|
38
38
|
|
|
39
39
|
sub ProcessSRF($$$);
|
|
40
40
|
sub ProcessSR2($$$);
|
|
@@ -154,7 +154,12 @@ sub PrintInvLensSpec($;$$);
|
|
|
154
154
|
32866 => 'Sony FE 24mm F2.8 G', #IB
|
|
155
155
|
32867 => 'Sony FE 40mm F2.5 G', #IB
|
|
156
156
|
32868 => 'Sony FE 50mm F2.5 G', #IB
|
|
157
|
+
32871 => 'Sony FE PZ 16-35mm F4 G', #JR
|
|
158
|
+
32873 => 'Sony E PZ 10-20mm F4 G', #JR
|
|
157
159
|
32874 => 'Sony FE 70-200mm F2.8 GM OSS II', #IB
|
|
160
|
+
32875 => 'Sony FE 24-70mm F2.8 GM II', #JR
|
|
161
|
+
32876 => 'Sony E 11mm F1.8', #JR
|
|
162
|
+
32877 => 'Sony E 15mm F1.4 G', #JR
|
|
158
163
|
|
|
159
164
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
|
160
165
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
|
@@ -200,6 +205,7 @@ sub PrintInvLensSpec($;$$);
|
|
|
200
205
|
49468 => 'Tamron 18-300mm F3.5-6.3 Di III-A VC VXD', #JR (Model B061)
|
|
201
206
|
49469 => 'Tamron 35-150mm F2-F2.8 Di III VXD', #JR (Model A058)
|
|
202
207
|
49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
|
|
208
|
+
49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
|
|
203
209
|
|
|
204
210
|
49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
|
|
205
211
|
49473.1 => 'Viltrox 23mm F1.4 E', #JR
|
|
@@ -245,6 +251,7 @@ sub PrintInvLensSpec($;$$);
|
|
|
245
251
|
50530 => 'Sigma 24mm F2 DG DN | C', #JR (021)
|
|
246
252
|
50531 => 'Sigma 18-50mm F2.8 DC DN | C', #IB/JR (021)
|
|
247
253
|
50532 => 'Sigma 20mm F2 DG DN | C', #JR (022)
|
|
254
|
+
50533 => 'Sigma 16-28mm F2.8 DG DN | C', #JR (022)
|
|
248
255
|
|
|
249
256
|
50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
|
|
250
257
|
50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
|