exiftool-vendored.pl 12.44.0 → 12.49.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 +112 -3
- package/bin/MANIFEST +9 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +45 -44
- package/bin/config_files/acdsee.config +2 -1
- package/bin/config_files/frameCount.config +56 -0
- package/bin/config_files/tiff_version.config +1 -1
- package/bin/exiftool +85 -73
- package/bin/fmt_files/gpx.fmt +3 -0
- package/bin/fmt_files/gpx_wpt.fmt +3 -0
- package/bin/lib/Image/ExifTool/Apple.pm +6 -2
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +17 -9
- package/bin/lib/Image/ExifTool/Canon.pm +33 -15
- package/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- package/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- package/bin/lib/Image/ExifTool/EXE.pm +9 -1
- package/bin/lib/Image/ExifTool/Exif.pm +11 -7
- package/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- package/bin/lib/Image/ExifTool/FLIR.pm +4 -3
- package/bin/lib/Image/ExifTool/FlashPix.pm +4 -2
- package/bin/lib/Image/ExifTool/FujiFilm.pm +31 -5
- package/bin/lib/Image/ExifTool/GPS.pm +2 -2
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
- package/bin/lib/Image/ExifTool/ICO.pm +141 -0
- package/bin/lib/Image/ExifTool/ID3.pm +6 -6
- package/bin/lib/Image/ExifTool/M2TS.pm +55 -8
- package/bin/lib/Image/ExifTool/MIE.pm +9 -3
- package/bin/lib/Image/ExifTool/MISB.pm +494 -0
- package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +24 -16
- package/bin/lib/Image/ExifTool/Nikon.pm +39 -31
- package/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- package/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- package/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
- package/bin/lib/Image/ExifTool/QuickTime.pm +113 -8
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +44 -6
- package/bin/lib/Image/ExifTool/README +1 -1
- package/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
- package/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- package/bin/lib/Image/ExifTool/Sony.pm +8 -3
- package/bin/lib/Image/ExifTool/TagLookup.pm +188 -7
- package/bin/lib/Image/ExifTool/TagNames.pod +3051 -2732
- package/bin/lib/Image/ExifTool/Text.pm +3 -4
- package/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- package/bin/lib/Image/ExifTool/Validate.pm +3 -3
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- package/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- package/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- package/bin/lib/Image/ExifTool/Writer.pl +10 -3
- package/bin/lib/Image/ExifTool/XMP.pm +76 -58
- package/bin/lib/Image/ExifTool/XMP2.pl +11 -4
- package/bin/lib/Image/ExifTool.pm +75 -15
- package/bin/lib/Image/ExifTool.pod +61 -57
- package/bin/perl-Image-ExifTool.spec +43 -43
- package/bin/pp_build_exe.args +7 -4
- package/package.json +2 -2
|
@@ -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.12';
|
|
67
67
|
|
|
68
68
|
sub LensIDConv($$$);
|
|
69
69
|
sub ProcessNikonAVI($$$);
|
|
@@ -363,6 +363,7 @@ sub GetAFPointGrid($$;$);
|
|
|
363
363
|
'26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
|
|
364
364
|
'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
|
|
365
365
|
'02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
|
|
366
|
+
'7E 54 37 37 0C 0C 4B 06' => 'Sigma 24mm F1.4 DG HSM | A', #30
|
|
366
367
|
'26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
|
|
367
368
|
'48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
|
|
368
369
|
'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
|
|
@@ -669,6 +670,7 @@ sub GetAFPointGrid($$;$);
|
|
|
669
670
|
'00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
|
|
670
671
|
'07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
|
|
671
672
|
'71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
|
|
673
|
+
'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
|
|
672
674
|
#
|
|
673
675
|
'00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
|
|
674
676
|
'00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
|
|
@@ -1624,6 +1626,11 @@ my %base64coord = (
|
|
|
1624
1626
|
3 => 'Small',
|
|
1625
1627
|
},
|
|
1626
1628
|
},
|
|
1629
|
+
0x003f => { #https://github.com/darktable-org/darktable/issues/12282
|
|
1630
|
+
Name => 'WhiteBalanceFineTune',
|
|
1631
|
+
Writable => 'rational64s',
|
|
1632
|
+
Count => 2,
|
|
1633
|
+
},
|
|
1627
1634
|
0x0045 => { #IB
|
|
1628
1635
|
Name => 'CropArea',
|
|
1629
1636
|
Notes => 'left, top, width, height',
|
|
@@ -2081,7 +2088,7 @@ my %base64coord = (
|
|
|
2081
2088
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
|
|
2082
2089
|
DecryptStart => 4,
|
|
2083
2090
|
# TODO: eventually set the length dynamically according to actual offsets!
|
|
2084
|
-
DecryptLen => 0xec4b +
|
|
2091
|
+
DecryptLen => 0xec4b + 2105, # decoded thru end of Offset26
|
|
2085
2092
|
ByteOrder => 'LittleEndian',
|
|
2086
2093
|
},
|
|
2087
2094
|
},
|
|
@@ -4175,7 +4182,7 @@ my %base64coord = (
|
|
|
4175
4182
|
},
|
|
4176
4183
|
);
|
|
4177
4184
|
|
|
4178
|
-
%Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c'
|
|
4185
|
+
%Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' (Z9)
|
|
4179
4186
|
%binaryDataAttrs,
|
|
4180
4187
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4181
4188
|
DATAMEMBER => [ 0 ],
|
|
@@ -4219,9 +4226,13 @@ my %base64coord = (
|
|
|
4219
4226
|
Name => 'AFAreaHeight',
|
|
4220
4227
|
Format => 'int16u',
|
|
4221
4228
|
RawConv => '$val ? $val : undef',
|
|
4222
|
-
}
|
|
4223
|
-
|
|
4224
|
-
|
|
4229
|
+
},
|
|
4230
|
+
0x4a => {
|
|
4231
|
+
Name => 'FocusResult',
|
|
4232
|
+
# in Manual Foucs mode, reflects the state of viewfinder focus indicator.
|
|
4233
|
+
# In AF-C or AF-S, reflects the result of the last AF operation.
|
|
4234
|
+
PrintConv => { 0=> "Out of Focus", 1=>"Focus"},
|
|
4235
|
+
},
|
|
4225
4236
|
);
|
|
4226
4237
|
|
|
4227
4238
|
# Nikon AF fine-tune information (ref 28)
|
|
@@ -5038,31 +5049,31 @@ my %nikonFocalConversions = (
|
|
|
5038
5049
|
0x4c => { #28
|
|
5039
5050
|
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.
|
|
5040
5051
|
Format => 'int8u',
|
|
5041
|
-
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5052
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
|
|
5042
5053
|
RawConv => '$$self{FocusDistanceRangeWidth} = $val',
|
|
5043
5054
|
Unknown => 1,
|
|
5044
5055
|
},
|
|
5045
5056
|
0x4e => { #28
|
|
5046
5057
|
Name => 'FocusDistance',
|
|
5047
5058
|
Format => 'int16u',
|
|
5048
|
-
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5059
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
|
|
5049
5060
|
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
|
|
5050
5061
|
ValueConv => '0.01 * 10**($val/40)', # in m
|
|
5051
5062
|
ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
|
|
5052
5063
|
PrintConv => q{
|
|
5053
|
-
$$self{FocusDistanceRangeWidth}
|
|
5064
|
+
(defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) ? "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
|
|
5054
5065
|
},
|
|
5055
5066
|
},
|
|
5056
5067
|
0x56 => { #28
|
|
5057
5068
|
Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
|
|
5058
|
-
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5069
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
|
|
5059
5070
|
Format => 'int8u',
|
|
5060
|
-
RawConv => 'unless ($$self{FocusDistanceRangeWidth}
|
|
5071
|
+
RawConv => 'unless (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
|
|
5061
5072
|
Unknown => 1,
|
|
5062
5073
|
},
|
|
5063
5074
|
0x5a => { #28
|
|
5064
5075
|
Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
|
|
5065
|
-
Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
|
|
5076
|
+
Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
|
|
5066
5077
|
Format => 'int32s',
|
|
5067
5078
|
Unknown => 1,
|
|
5068
5079
|
},
|
|
@@ -8036,8 +8047,8 @@ my %nikonFocalConversions = (
|
|
|
8036
8047
|
WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
|
|
8037
8048
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
8038
8049
|
VARS => { ID_LABEL => 'Index' },
|
|
8039
|
-
DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
|
|
8040
|
-
0x6c9a,
|
|
8050
|
+
DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
|
|
8051
|
+
0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
|
|
8041
8052
|
IS_SUBDIR => [ 0xec4b ],
|
|
8042
8053
|
WRITABLE => 1,
|
|
8043
8054
|
FIRST_ENTRY => 0,
|
|
@@ -8114,6 +8125,15 @@ my %nikonFocalConversions = (
|
|
|
8114
8125
|
# account for variable location of Offset3 data
|
|
8115
8126
|
Hook => '$varSize = $$self{Offset3} - 0x6c70',
|
|
8116
8127
|
},
|
|
8128
|
+
0x6c90 => {
|
|
8129
|
+
Name => 'FocusShiftShooting',
|
|
8130
|
+
RawConv => '$$self{FocusShiftShooting} = $val',
|
|
8131
|
+
PrintConv => q{
|
|
8132
|
+
return 'Off' if $val == 0 ;
|
|
8133
|
+
my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
|
|
8134
|
+
return "On: $i"
|
|
8135
|
+
},
|
|
8136
|
+
},
|
|
8117
8137
|
0x6c98 => {
|
|
8118
8138
|
Name => 'IntervalShooting',
|
|
8119
8139
|
RawConv => '$$self{IntervalShooting} = $val',
|
|
@@ -8133,23 +8153,6 @@ my %nikonFocalConversions = (
|
|
|
8133
8153
|
Format => 'int16u',
|
|
8134
8154
|
Hidden => 1,
|
|
8135
8155
|
},
|
|
8136
|
-
### 0x7718 - Offset5 info start (Z9 firmware 1.00)
|
|
8137
|
-
0x7717 => {
|
|
8138
|
-
Name => 'Offsset5Hook',
|
|
8139
|
-
Hidden => 1,
|
|
8140
|
-
RawConv => 'undef',
|
|
8141
|
-
# account for variable location of Offset5 data
|
|
8142
|
-
Hook => '$varSize = $$self{Offset5} - 0x7718',
|
|
8143
|
-
},
|
|
8144
|
-
0x7844 => {
|
|
8145
|
-
Name => 'FocusShiftShooting',
|
|
8146
|
-
RawConv => '$$self{FocusShiftShooting} = $val',
|
|
8147
|
-
PrintConv => q{
|
|
8148
|
-
return 'Off' if $val == 0 ;
|
|
8149
|
-
my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
|
|
8150
|
-
return "On: $i"
|
|
8151
|
-
},
|
|
8152
|
-
},
|
|
8153
8156
|
### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
|
|
8154
8157
|
0xeaea => {
|
|
8155
8158
|
Name => 'OrientationHook',
|
|
@@ -10897,9 +10900,14 @@ my %nikonFocalConversions = (
|
|
|
10897
10900
|
Name => 'LocationInfo',
|
|
10898
10901
|
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
|
|
10899
10902
|
},
|
|
10903
|
+
0x200003f => 'WhiteBalanceFineTune',
|
|
10900
10904
|
# 0x200003f - rational64s[2]: "0 0"
|
|
10901
10905
|
# 0x2000042 - undef[6]: "0100\x03\0"
|
|
10902
10906
|
# 0x2000043 - undef[12]: all zeros
|
|
10907
|
+
0x200004e => {
|
|
10908
|
+
Name => 'NikonSettings',
|
|
10909
|
+
SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
|
|
10910
|
+
},
|
|
10903
10911
|
0x2000083 => {
|
|
10904
10912
|
Name => 'LensType',
|
|
10905
10913
|
# credit to Tom Christiansen (ref 7) for figuring this out...
|
|
@@ -2036,11 +2036,13 @@ sub ProcessNikonSettings($$$)
|
|
|
2036
2036
|
for ($i=0; $i<$num; ++$i) {
|
|
2037
2037
|
my $entry = $start + 0x18 + $i * 8;
|
|
2038
2038
|
my $tag = Get16u($dataPt, $entry);
|
|
2039
|
-
|
|
2039
|
+
# this is odd, but either the format is 16-bit and always big-endian,
|
|
2040
|
+
# or it is 8-bit and we have an unknown byte in the entry...
|
|
2041
|
+
my $fmt = Get8u($dataPt, $entry + 3);
|
|
2040
2042
|
my $val = Get32u($dataPt, $entry + 4);
|
|
2041
2043
|
# abort if the tag has a format that we haven't yet seen
|
|
2042
|
-
# (assuming this is a size/format code. So far we have only seen
|
|
2043
|
-
$fmt ==
|
|
2044
|
+
# (assuming this is a size/format code. So far we have only seen a code of 4)
|
|
2045
|
+
$fmt == 4 or $et->Warn(sprintf('Unknown format $fmt for NikonSettings tag 0x%.4x',$tag)), last;
|
|
2044
2046
|
$et->HandleTag($tagTablePtr, $tag, $val,
|
|
2045
2047
|
DataPt => $dataPt,
|
|
2046
2048
|
DataPos => $$dirInfo{DataPos},
|
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
use Image::ExifTool::Exif;
|
|
39
39
|
|
|
40
|
-
$VERSION = '2.
|
|
40
|
+
$VERSION = '2.18';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -543,7 +543,11 @@ my %shootingMode = (
|
|
|
543
543
|
0x2c => [
|
|
544
544
|
{
|
|
545
545
|
Name => 'ContrastMode',
|
|
546
|
-
Condition =>
|
|
546
|
+
Condition => q{
|
|
547
|
+
$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/ and
|
|
548
|
+
# tested for DC-GH6, but rule out other DC- models just in case - PH
|
|
549
|
+
$$self{Model} !~ /^DC-/
|
|
550
|
+
},
|
|
547
551
|
Flags => 'PrintHex',
|
|
548
552
|
Writable => 'int16u',
|
|
549
553
|
Notes => q{
|
|
@@ -1129,7 +1133,10 @@ my %shootingMode = (
|
|
|
1129
1133
|
8 => 'Cinelike D', #forum11194
|
|
1130
1134
|
9 => 'Cinelike V', #forum11194
|
|
1131
1135
|
11 => 'L. Monochrome', #forum11194
|
|
1136
|
+
12 => 'Like709', #forum14033
|
|
1132
1137
|
15 => 'L. Monochrome D', #forum11194
|
|
1138
|
+
17 => 'V-Log', #forum14033
|
|
1139
|
+
18 => 'Cinelike D2', #forum14033
|
|
1133
1140
|
},
|
|
1134
1141
|
},
|
|
1135
1142
|
0x8a => { #18
|
|
@@ -1255,8 +1262,9 @@ my %shootingMode = (
|
|
|
1255
1262
|
Writable => 'rational64u',
|
|
1256
1263
|
Format => 'int32u',
|
|
1257
1264
|
PrintConv => {
|
|
1258
|
-
'0 0' => 'Expressive',
|
|
1259
|
-
|
|
1265
|
+
# '0 0' => 'Expressive', #forum11194
|
|
1266
|
+
'0 0' => 'Off', #forum14033 (GH6)
|
|
1267
|
+
'0 1' => 'Expressive', #forum14033 (GH6) (have also seen this for XS1)
|
|
1260
1268
|
'0 2' => 'Retro',
|
|
1261
1269
|
'0 4' => 'High Key',
|
|
1262
1270
|
'0 8' => 'Sepia',
|
|
@@ -1435,6 +1443,15 @@ my %shootingMode = (
|
|
|
1435
1443
|
ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_',
|
|
1436
1444
|
ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)',
|
|
1437
1445
|
},
|
|
1446
|
+
0xe8 => { #PH (DC-GH6)
|
|
1447
|
+
Name => 'MinimumISO',
|
|
1448
|
+
Writable => 'int32u',
|
|
1449
|
+
},
|
|
1450
|
+
0xee => { #PH (DC-GH6)
|
|
1451
|
+
Name => 'DynamicRangeBoost',
|
|
1452
|
+
Writable => 'int16u',
|
|
1453
|
+
PrintConv => { 0 => 'Off', 1 => 'On' },
|
|
1454
|
+
},
|
|
1438
1455
|
0x0e00 => {
|
|
1439
1456
|
Name => 'PrintIM',
|
|
1440
1457
|
Description => 'Print Image Matching',
|
|
@@ -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.27';
|
|
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,8 @@ 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)
|
|
742
|
+
# 6 - flag set if this is a fixed offset (Panasonic GH6 fixed-offset hack)
|
|
740
743
|
sub PatchRawDataOffset($$$)
|
|
741
744
|
{
|
|
742
745
|
my ($offsetInfo, $raf, $ifd) = @_;
|
|
@@ -745,15 +748,32 @@ sub PatchRawDataOffset($$$)
|
|
|
745
748
|
my $rawDataOffset = $$offsetInfo{0x118};
|
|
746
749
|
my $err;
|
|
747
750
|
$err = 1 unless $ifd == 0;
|
|
748
|
-
|
|
749
|
-
|
|
751
|
+
if ($stripOffsets or $stripByteCounts) {
|
|
752
|
+
$err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
|
|
753
|
+
} else {
|
|
754
|
+
# the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
|
|
755
|
+
# to create fake StripByteCounts information for copying the data
|
|
756
|
+
if ($$offsetInfo{0x118}) { # (just to be safe)
|
|
757
|
+
$stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
|
|
758
|
+
# set flag so the offset will be fixed (GH6 hack, see https://exiftool.org/forum/index.php?topic=13861.0)
|
|
759
|
+
# (of course, fixing up the offset is now unnecessary, but continue to do this even
|
|
760
|
+
# though the fixup adjustment will be 0 because this allows us to delete the following
|
|
761
|
+
# line to remove the fix-offset restriction if Panasonic ever sees the light, but note
|
|
762
|
+
# that in this case we should investigate the purpose of the seemily-duplicate raw
|
|
763
|
+
# data offset contained within PanasonicRaw_0x0044)
|
|
764
|
+
$$offsetInfo{0x118}[6] = 1;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
if ($rawDataOffset and not $err) {
|
|
750
768
|
$err = 1 unless $$rawDataOffset[2] == 1;
|
|
751
|
-
$
|
|
769
|
+
if ($stripOffsets) {
|
|
770
|
+
$err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
|
|
771
|
+
}
|
|
752
772
|
}
|
|
753
773
|
$err and return 'Unsupported Panasonic/Leica RAW variant';
|
|
754
774
|
if ($rawDataOffset) {
|
|
755
775
|
# update StripOffsets along with this tag if it contains a reasonable value
|
|
756
|
-
|
|
776
|
+
if ($stripOffsets and $$stripOffsets[3][0] != 0xffffffff) {
|
|
757
777
|
# save pointer to StripOffsets value for updating later
|
|
758
778
|
push @$rawDataOffset, $$stripOffsets[1];
|
|
759
779
|
}
|
|
@@ -25,15 +25,28 @@
|
|
|
25
25
|
package Image::ExifTool::Photoshop;
|
|
26
26
|
|
|
27
27
|
use strict;
|
|
28
|
-
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
|
|
28
|
+
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
|
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
30
30
|
|
|
31
|
-
$VERSION = '1.
|
|
31
|
+
$VERSION = '1.67';
|
|
32
32
|
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
|
34
34
|
sub WritePhotoshop($$$);
|
|
35
35
|
sub ProcessLayers($$$);
|
|
36
36
|
|
|
37
|
+
# PrintFlags bit definitions (ref forum13785)
|
|
38
|
+
%printFlags = (
|
|
39
|
+
0 => 'Labels',
|
|
40
|
+
1 => 'Corner crop marks',
|
|
41
|
+
2 => 'Color bars', # (deprecated)
|
|
42
|
+
3 => 'Registration marks',
|
|
43
|
+
4 => 'Negative',
|
|
44
|
+
5 => 'Emulsion down',
|
|
45
|
+
6 => 'Interpolate', # (deprecated)
|
|
46
|
+
7 => 'Description',
|
|
47
|
+
8 => 'Print flags',
|
|
48
|
+
);
|
|
49
|
+
|
|
37
50
|
# map of where information is stored in PSD image
|
|
38
51
|
my %psdMap = (
|
|
39
52
|
IPTC => 'Photoshop',
|
|
@@ -106,7 +119,17 @@ my %unicodeString = (
|
|
|
106
119
|
0x03f0 => { Unknown => 1, Name => 'PStringCaption' },
|
|
107
120
|
0x03f1 => { Unknown => 1, Name => 'BorderInformation' },
|
|
108
121
|
0x03f2 => { Unknown => 1, Name => 'BackgroundColor' },
|
|
109
|
-
0x03f3 => {
|
|
122
|
+
0x03f3 => {
|
|
123
|
+
Unknown => 1,
|
|
124
|
+
Name => 'PrintFlags',
|
|
125
|
+
Format => 'int8u',
|
|
126
|
+
PrintConv => q{
|
|
127
|
+
my $byte = 0;
|
|
128
|
+
my @bits = $val =~ /\d+/g;
|
|
129
|
+
$byte = ($byte << 1) | ($_ ? 1 : 0) foreach reverse @bits;
|
|
130
|
+
return DecodeBits($byte, \%Image::ExifTool::Photoshop::printFlags);
|
|
131
|
+
},
|
|
132
|
+
},
|
|
110
133
|
0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' },
|
|
111
134
|
0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' },
|
|
112
135
|
0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' },
|
|
@@ -332,6 +355,7 @@ my %unicodeString = (
|
|
|
332
355
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
333
356
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
|
|
334
357
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
358
|
+
DATAMEMBER => [ 1 ],
|
|
335
359
|
FORMAT => 'int16s',
|
|
336
360
|
GROUPS => { 2 => 'Image' },
|
|
337
361
|
0 => {
|
|
@@ -342,6 +366,7 @@ my %unicodeString = (
|
|
|
342
366
|
},
|
|
343
367
|
1 => {
|
|
344
368
|
Name => 'PhotoshopFormat',
|
|
369
|
+
RawConv => '$$self{PhotoshopFormat} = $val',
|
|
345
370
|
PrintConv => {
|
|
346
371
|
0x0000 => 'Standard',
|
|
347
372
|
0x0001 => 'Optimized',
|
|
@@ -350,6 +375,7 @@ my %unicodeString = (
|
|
|
350
375
|
},
|
|
351
376
|
2 => {
|
|
352
377
|
Name => 'ProgressiveScans',
|
|
378
|
+
Condition => '$$self{PhotoshopFormat} == 0x0101',
|
|
353
379
|
PrintConv => {
|
|
354
380
|
1 => '3 Scans',
|
|
355
381
|
2 => '4 Scans',
|
|
@@ -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.79';
|
|
51
51
|
|
|
52
52
|
sub ProcessMOV($$;$);
|
|
53
53
|
sub ProcessKeys($$$);
|
|
@@ -66,6 +66,7 @@ sub ProcessRIFFTrailer($$$);
|
|
|
66
66
|
sub ProcessTTAD($$$);
|
|
67
67
|
sub ProcessNMEA($$$);
|
|
68
68
|
sub ProcessGPSLog($$$);
|
|
69
|
+
sub ProcessGarminGPS($$$);
|
|
69
70
|
sub SaveMetaKeys($$$);
|
|
70
71
|
# ++^^^^^^^^^^^^++
|
|
71
72
|
sub ParseItemLocation($$);
|
|
@@ -556,12 +557,16 @@ my %eeBox2 = (
|
|
|
556
557
|
mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
|
|
557
558
|
'mdat-size' => {
|
|
558
559
|
Name => 'MediaDataSize',
|
|
560
|
+
RawConv => '$$self{MediaDataSize} = $val',
|
|
559
561
|
Notes => q{
|
|
560
562
|
not a real tag ID, this tag represents the size of the 'mdat' data in bytes
|
|
561
563
|
and is used in the AvgBitrate calculation
|
|
562
564
|
},
|
|
563
565
|
},
|
|
564
|
-
'mdat-offset' =>
|
|
566
|
+
'mdat-offset' => {
|
|
567
|
+
Name => 'MediaDataOffset',
|
|
568
|
+
RawConv => '$$self{MediaDataOffset} = $val',
|
|
569
|
+
},
|
|
565
570
|
junk => { Unknown => 1, Binary => 1 }, #8
|
|
566
571
|
uuid => [
|
|
567
572
|
{ #9 (MP4 files)
|
|
@@ -897,7 +902,7 @@ my %eeBox2 = (
|
|
|
897
902
|
},
|
|
898
903
|
colr => {
|
|
899
904
|
Name => 'ColorRepresentation',
|
|
900
|
-
|
|
905
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
901
906
|
},
|
|
902
907
|
pasp => {
|
|
903
908
|
Name => 'PixelAspectRatio',
|
|
@@ -1118,6 +1123,23 @@ my %eeBox2 = (
|
|
|
1118
1123
|
Start => 16,
|
|
1119
1124
|
},
|
|
1120
1125
|
},
|
|
1126
|
+
{
|
|
1127
|
+
Name => 'GarminGPS',
|
|
1128
|
+
Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/ and $$self{OPTIONS}{ExtractEmbedded}',
|
|
1129
|
+
SubDirectory => {
|
|
1130
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
1131
|
+
ProcessProc => \&ProcessGarminGPS,
|
|
1132
|
+
},
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
Name => 'GarminGPS',
|
|
1136
|
+
Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/',
|
|
1137
|
+
Notes => 'Garmin GPS sensor data',
|
|
1138
|
+
RawConv => q{
|
|
1139
|
+
$self->WarnOnce('Use the ExtractEmbedded option to decode timed Garmin GPS',3);
|
|
1140
|
+
return \$val;
|
|
1141
|
+
},
|
|
1142
|
+
},
|
|
1121
1143
|
{
|
|
1122
1144
|
Name => 'UUID-Unknown',
|
|
1123
1145
|
%unknownInfo,
|
|
@@ -2732,7 +2754,7 @@ my %eeBox2 = (
|
|
|
2732
2754
|
},
|
|
2733
2755
|
},{
|
|
2734
2756
|
Name => 'ColorRepresentation',
|
|
2735
|
-
|
|
2757
|
+
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
|
|
2736
2758
|
}],
|
|
2737
2759
|
irot => {
|
|
2738
2760
|
Name => 'Rotation',
|
|
@@ -2792,6 +2814,78 @@ my %eeBox2 = (
|
|
|
2792
2814
|
},
|
|
2793
2815
|
);
|
|
2794
2816
|
|
|
2817
|
+
# ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
|
|
2818
|
+
%Image::ExifTool::QuickTime::ColorRep = (
|
|
2819
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
2820
|
+
GROUPS => { 2 => 'Video' },
|
|
2821
|
+
FIRST_ENTRY => 0,
|
|
2822
|
+
0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
|
|
2823
|
+
4 => {
|
|
2824
|
+
Name => 'ColorPrimaries',
|
|
2825
|
+
Format => 'int16u',
|
|
2826
|
+
PrintConv => {
|
|
2827
|
+
1 => 'BT.709',
|
|
2828
|
+
2 => 'Unspecified',
|
|
2829
|
+
4 => 'BT.470 System M (historical)',
|
|
2830
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2831
|
+
6 => 'BT.601',
|
|
2832
|
+
7 => 'SMPTE 240',
|
|
2833
|
+
8 => 'Generic film (color filters using illuminant C)',
|
|
2834
|
+
9 => 'BT.2020, BT.2100',
|
|
2835
|
+
10 => 'SMPTE 428 (CIE 1921 XYZ)',
|
|
2836
|
+
11 => 'SMPTE RP 431-2',
|
|
2837
|
+
12 => 'SMPTE EG 432-1',
|
|
2838
|
+
22 => 'EBU Tech. 3213-E',
|
|
2839
|
+
},
|
|
2840
|
+
},
|
|
2841
|
+
6 => {
|
|
2842
|
+
Name => 'TransferCharacteristics',
|
|
2843
|
+
Format => 'int16u',
|
|
2844
|
+
PrintConv => {
|
|
2845
|
+
0 => 'For future use (0)',
|
|
2846
|
+
1 => 'BT.709',
|
|
2847
|
+
2 => 'Unspecified',
|
|
2848
|
+
3 => 'For future use (3)',
|
|
2849
|
+
4 => 'BT.470 System M (historical)',
|
|
2850
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2851
|
+
6 => 'BT.601',
|
|
2852
|
+
7 => 'SMPTE 240 M',
|
|
2853
|
+
8 => 'Linear',
|
|
2854
|
+
9 => 'Logarithmic (100 : 1 range)',
|
|
2855
|
+
10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
|
|
2856
|
+
11 => 'IEC 61966-2-4',
|
|
2857
|
+
12 => 'BT.1361',
|
|
2858
|
+
13 => 'sRGB or sYCC',
|
|
2859
|
+
14 => 'BT.2020 10-bit systems',
|
|
2860
|
+
15 => 'BT.2020 12-bit systems',
|
|
2861
|
+
16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
|
|
2862
|
+
17 => 'SMPTE ST 428',
|
|
2863
|
+
18 => 'BT.2100 HLG, ARIB STD-B67',
|
|
2864
|
+
},
|
|
2865
|
+
},
|
|
2866
|
+
8 => {
|
|
2867
|
+
Name => 'MatrixCoefficients',
|
|
2868
|
+
Format => 'int16u',
|
|
2869
|
+
PrintConv => {
|
|
2870
|
+
0 => 'Identity matrix',
|
|
2871
|
+
1 => 'BT.709',
|
|
2872
|
+
2 => 'Unspecified',
|
|
2873
|
+
3 => 'For future use (3)',
|
|
2874
|
+
4 => 'US FCC 73.628',
|
|
2875
|
+
5 => 'BT.470 System B, G (historical)',
|
|
2876
|
+
6 => 'BT.601',
|
|
2877
|
+
7 => 'SMPTE 240 M',
|
|
2878
|
+
8 => 'YCgCo',
|
|
2879
|
+
9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
|
|
2880
|
+
10 => 'BT.2020 constant luminance',
|
|
2881
|
+
11 => 'SMPTE ST 2085 YDzDx',
|
|
2882
|
+
12 => 'Chromaticity-derived non-constant luminance',
|
|
2883
|
+
13 => 'Chromaticity-derived constant luminance',
|
|
2884
|
+
14 => 'BT.2100 ICtCp',
|
|
2885
|
+
},
|
|
2886
|
+
},
|
|
2887
|
+
);
|
|
2888
|
+
|
|
2795
2889
|
# HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
|
|
2796
2890
|
%Image::ExifTool::QuickTime::HEVCConfig = (
|
|
2797
2891
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -7554,6 +7648,11 @@ my %eeBox2 = (
|
|
|
7554
7648
|
Format => 'undef[4]',
|
|
7555
7649
|
RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
|
|
7556
7650
|
},
|
|
7651
|
+
24 => {
|
|
7652
|
+
Condition => '$$self{MetaFormat} eq "tmcd"',
|
|
7653
|
+
Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
|
|
7654
|
+
Format => 'rational64u',
|
|
7655
|
+
},
|
|
7557
7656
|
#
|
|
7558
7657
|
# Observed offsets for child atoms of various OtherFormat types:
|
|
7559
7658
|
#
|
|
@@ -8006,9 +8105,12 @@ sub AUTOLOAD
|
|
|
8006
8105
|
# Returns: 9-element rotation matrix as a string (with 0 x/y offsets)
|
|
8007
8106
|
sub GetRotationMatrix($)
|
|
8008
8107
|
{
|
|
8009
|
-
my $ang = 3.
|
|
8108
|
+
my $ang = 3.14159265358979323846264 * shift() / 180;
|
|
8010
8109
|
my $cos = cos $ang;
|
|
8011
8110
|
my $sin = sin $ang;
|
|
8111
|
+
# round to zero
|
|
8112
|
+
$cos = 0 if abs($cos) < 1e-12;
|
|
8113
|
+
$sin = 0 if abs($sin) < 1e-12;
|
|
8012
8114
|
my $msn = -$sin;
|
|
8013
8115
|
return "$cos $sin 0 $msn $cos 0 0 0 1";
|
|
8014
8116
|
}
|
|
@@ -9561,10 +9663,14 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9561
9663
|
require Image::ExifTool::Font;
|
|
9562
9664
|
$lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
|
|
9563
9665
|
}
|
|
9666
|
+
} else {
|
|
9667
|
+
# for the default language code of 0x0000, use UTF-8 instead
|
|
9668
|
+
# of the CharsetQuickTime setting if obviously UTF8
|
|
9669
|
+
$enc = 'UTF8' if Image::ExifTool::IsUTF8(\$str) > 0;
|
|
9564
9670
|
}
|
|
9565
9671
|
# the spec says only "Macintosh text encoding", but
|
|
9566
9672
|
# allow this to be configured by the user
|
|
9567
|
-
$enc = $charsetQuickTime;
|
|
9673
|
+
$enc = $charsetQuickTime unless $enc;
|
|
9568
9674
|
} else {
|
|
9569
9675
|
# convert language code to ASCII (ignore read-only bit)
|
|
9570
9676
|
$lang = UnpackLang($lang);
|
|
@@ -9605,8 +9711,7 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9605
9711
|
if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
|
|
9606
9712
|
# the encoding of this is not specified, so use CharsetQuickTime
|
|
9607
9713
|
# unless the string is valid UTF-8
|
|
9608
|
-
|
|
9609
|
-
my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
|
|
9714
|
+
my $enc = Image::ExifTool::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
|
|
9610
9715
|
$$vp = $et->Decode($$vp, $enc);
|
|
9611
9716
|
}
|
|
9612
9717
|
}
|