exiftool_vendored 12.56.0 → 12.58.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 +35 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +95 -47
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +19 -15
- data/bin/lib/Image/ExifTool/Canon.pm +26 -6
- data/bin/lib/Image/ExifTool/DJI.pm +28 -2
- data/bin/lib/Image/ExifTool/Exif.pm +24 -5
- data/bin/lib/Image/ExifTool/FlashPix.pm +6 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/GPS.pm +7 -2
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- data/bin/lib/Image/ExifTool/LNK.pm +5 -4
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
- data/bin/lib/Image/ExifTool/Nikon.pm +998 -903
- data/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
- data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
- data/bin/lib/Image/ExifTool/QuickTime.pm +23 -7
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +3 -1
- data/bin/lib/Image/ExifTool/README +19 -2
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +5 -4
- data/bin/lib/Image/ExifTool/Sony.pm +23 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4670 -4628
- data/bin/lib/Image/ExifTool/TagNames.pod +261 -89
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
- data/bin/lib/Image/ExifTool/Writer.pl +39 -17
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +94 -33
- data/bin/lib/Image/ExifTool.pod +4 -4
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
|
@@ -64,11 +64,12 @@ use Image::ExifTool::Exif;
|
|
|
64
64
|
use Image::ExifTool::GPS;
|
|
65
65
|
use Image::ExifTool::XMP;
|
|
66
66
|
|
|
67
|
-
$VERSION = '4.
|
|
67
|
+
$VERSION = '4.20';
|
|
68
68
|
|
|
69
69
|
sub LensIDConv($$$);
|
|
70
70
|
sub ProcessNikonAVI($$$);
|
|
71
71
|
sub ProcessNikonMOV($$$);
|
|
72
|
+
sub ProcessNikonEncrypted($$$);
|
|
72
73
|
sub FormatString($);
|
|
73
74
|
sub ProcessNikonCaptureEditVersions($$$);
|
|
74
75
|
sub PrintAFPoints($$);
|
|
@@ -83,9 +84,8 @@ sub GetAFPointGrid($$;$);
|
|
|
83
84
|
The Nikon LensID is constructed as a Composite tag from the raw hex values
|
|
84
85
|
of 8 other tags: LensIDNumber, LensFStops, MinFocalLength, MaxFocalLength,
|
|
85
86
|
MaxApertureAtMinFocal, MaxApertureAtMaxFocal, MCUVersion and LensType, in
|
|
86
|
-
that order.
|
|
87
|
-
|
|
88
|
-
used to specify the lens for ExifTool to choose in these cases (see the
|
|
87
|
+
that order. The user-defined "Lenses" list may be used to specify the lens
|
|
88
|
+
for ExifTool to choose in these cases (see the
|
|
89
89
|
L<sample config file|../config.html> for details).
|
|
90
90
|
},
|
|
91
91
|
OTHER => \&LensIDConv,
|
|
@@ -880,6 +880,12 @@ my %bracketProgramZ9 = (
|
|
|
880
880
|
9 => '9F',
|
|
881
881
|
);
|
|
882
882
|
|
|
883
|
+
my %dynamicAfAreaModesZ9 = (
|
|
884
|
+
0 => 'Small',
|
|
885
|
+
1 => 'Medium',
|
|
886
|
+
2 => 'Large',
|
|
887
|
+
);
|
|
888
|
+
|
|
883
889
|
my %flashControlModeZ7 = (
|
|
884
890
|
0 => 'TTL',
|
|
885
891
|
1 => 'Auto External Flash',
|
|
@@ -1112,6 +1118,14 @@ my %offLowNormalHighZ7 = (
|
|
|
1112
1118
|
3 => 'High',
|
|
1113
1119
|
);
|
|
1114
1120
|
|
|
1121
|
+
my %releaseModeZ7 = (
|
|
1122
|
+
0 => 'Continuous Low',
|
|
1123
|
+
1 => 'Continuous High',
|
|
1124
|
+
2 => 'Continuous High (Extended)',
|
|
1125
|
+
4 => 'Timer',
|
|
1126
|
+
5 => 'Single Frame',
|
|
1127
|
+
);
|
|
1128
|
+
|
|
1115
1129
|
my %secondarySlotFunctionZ9 = (
|
|
1116
1130
|
0 => 'Overflow',
|
|
1117
1131
|
1 => 'Backup',
|
|
@@ -1509,9 +1523,7 @@ my %base64coord = (
|
|
|
1509
1523
|
0x0006 => { Name => 'Sharpness', Writable => 'string' },
|
|
1510
1524
|
0x0007 => {
|
|
1511
1525
|
Name => 'FocusMode',
|
|
1512
|
-
DataMember => 'FocusMode',
|
|
1513
1526
|
Writable => 'string',
|
|
1514
|
-
RawConv => '$$self{FocusMode} = $val',
|
|
1515
1527
|
},
|
|
1516
1528
|
# FlashSetting (better named FlashSyncMode, ref 28) values:
|
|
1517
1529
|
# "Normal", "Slow", "Rear Slow", "RED-EYE", "RED-EYE SLOW"
|
|
@@ -1812,6 +1824,7 @@ my %base64coord = (
|
|
|
1812
1824
|
Name => 'ShutterMode',
|
|
1813
1825
|
Writable => 'int16u',
|
|
1814
1826
|
RawConv => '$$self{ShutterMode} = $val',
|
|
1827
|
+
DataMember => 'ShutterMode',
|
|
1815
1828
|
PrintConv => {
|
|
1816
1829
|
0 => 'Mechanical',
|
|
1817
1830
|
16 => 'Electronic',
|
|
@@ -2059,7 +2072,6 @@ my %base64coord = (
|
|
|
2059
2072
|
SubDirectory => {
|
|
2060
2073
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD40',
|
|
2061
2074
|
DecryptStart => 4,
|
|
2062
|
-
DecryptLen => 748,
|
|
2063
2075
|
ByteOrder => 'BigEndian',
|
|
2064
2076
|
},
|
|
2065
2077
|
},
|
|
@@ -2069,7 +2081,6 @@ my %base64coord = (
|
|
|
2069
2081
|
SubDirectory => {
|
|
2070
2082
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD80',
|
|
2071
2083
|
DecryptStart => 4,
|
|
2072
|
-
DecryptLen => 765,
|
|
2073
2084
|
# (Capture NX can change the makernote byte order, but this stays big-endian)
|
|
2074
2085
|
ByteOrder => 'BigEndian',
|
|
2075
2086
|
},
|
|
@@ -2080,7 +2091,6 @@ my %base64coord = (
|
|
|
2080
2091
|
SubDirectory => {
|
|
2081
2092
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD90',
|
|
2082
2093
|
DecryptStart => 4,
|
|
2083
|
-
DecryptLen => 0x398,
|
|
2084
2094
|
ByteOrder => 'BigEndian',
|
|
2085
2095
|
},
|
|
2086
2096
|
},
|
|
@@ -2090,7 +2100,6 @@ my %base64coord = (
|
|
|
2090
2100
|
SubDirectory => {
|
|
2091
2101
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD3a',
|
|
2092
2102
|
DecryptStart => 4,
|
|
2093
|
-
DecryptLen => 0x318,
|
|
2094
2103
|
ByteOrder => 'BigEndian',
|
|
2095
2104
|
},
|
|
2096
2105
|
},
|
|
@@ -2100,7 +2109,6 @@ my %base64coord = (
|
|
|
2100
2109
|
SubDirectory => {
|
|
2101
2110
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD3b',
|
|
2102
2111
|
DecryptStart => 4,
|
|
2103
|
-
DecryptLen => 0x321,
|
|
2104
2112
|
ByteOrder => 'BigEndian',
|
|
2105
2113
|
},
|
|
2106
2114
|
},
|
|
@@ -2110,7 +2118,6 @@ my %base64coord = (
|
|
|
2110
2118
|
SubDirectory => {
|
|
2111
2119
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD3X',
|
|
2112
2120
|
DecryptStart => 4,
|
|
2113
|
-
DecryptLen => 0x323,
|
|
2114
2121
|
ByteOrder => 'BigEndian',
|
|
2115
2122
|
},
|
|
2116
2123
|
},
|
|
@@ -2120,7 +2127,6 @@ my %base64coord = (
|
|
|
2120
2127
|
SubDirectory => {
|
|
2121
2128
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD3S',
|
|
2122
2129
|
DecryptStart => 4,
|
|
2123
|
-
DecryptLen => 0x2e9,
|
|
2124
2130
|
ByteOrder => 'BigEndian',
|
|
2125
2131
|
},
|
|
2126
2132
|
},
|
|
@@ -2131,7 +2137,6 @@ my %base64coord = (
|
|
|
2131
2137
|
SubDirectory => {
|
|
2132
2138
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD300a',
|
|
2133
2139
|
DecryptStart => 4,
|
|
2134
|
-
DecryptLen => 813,
|
|
2135
2140
|
ByteOrder => 'BigEndian',
|
|
2136
2141
|
},
|
|
2137
2142
|
},
|
|
@@ -2142,7 +2147,6 @@ my %base64coord = (
|
|
|
2142
2147
|
SubDirectory => {
|
|
2143
2148
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD300b',
|
|
2144
2149
|
DecryptStart => 4,
|
|
2145
|
-
DecryptLen => 825,
|
|
2146
2150
|
ByteOrder => 'BigEndian',
|
|
2147
2151
|
},
|
|
2148
2152
|
},
|
|
@@ -2153,7 +2157,6 @@ my %base64coord = (
|
|
|
2153
2157
|
SubDirectory => {
|
|
2154
2158
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD300S',
|
|
2155
2159
|
DecryptStart => 4,
|
|
2156
|
-
DecryptLen => 827,
|
|
2157
2160
|
ByteOrder => 'BigEndian',
|
|
2158
2161
|
},
|
|
2159
2162
|
},
|
|
@@ -2164,17 +2167,33 @@ my %base64coord = (
|
|
|
2164
2167
|
SubDirectory => {
|
|
2165
2168
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD700',
|
|
2166
2169
|
DecryptStart => 4,
|
|
2167
|
-
DecryptLen => 0x358,
|
|
2168
2170
|
ByteOrder => 'BigEndian',
|
|
2169
2171
|
},
|
|
2170
2172
|
},
|
|
2173
|
+
{ #28 (D780 firmware version 1.00)
|
|
2174
|
+
Condition => '$$valPt =~ /^0245/',
|
|
2175
|
+
Name => 'ShotInfoD780',
|
|
2176
|
+
SubDirectory => {
|
|
2177
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfoD780',
|
|
2178
|
+
DecryptStart => 4,
|
|
2179
|
+
ByteOrder => 'LittleEndian',
|
|
2180
|
+
},
|
|
2181
|
+
},
|
|
2182
|
+
{ #28 (D7500 firmware version 1.00h)
|
|
2183
|
+
Condition => '$$valPt =~ /^0242/',
|
|
2184
|
+
Name => 'ShotInfoD7500',
|
|
2185
|
+
SubDirectory => {
|
|
2186
|
+
TagTable => 'Image::ExifTool::Nikon::ShotInfoD7500',
|
|
2187
|
+
DecryptStart => 4,
|
|
2188
|
+
ByteOrder => 'LittleEndian',
|
|
2189
|
+
},
|
|
2190
|
+
},
|
|
2171
2191
|
{ #PH (D800 firmware 1.01a)
|
|
2172
2192
|
Condition => '$$valPt =~ /^0222/',
|
|
2173
2193
|
Name => 'ShotInfoD800',
|
|
2174
2194
|
SubDirectory => {
|
|
2175
2195
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD800',
|
|
2176
2196
|
DecryptStart => 4,
|
|
2177
|
-
DecryptLen => 0x720,
|
|
2178
2197
|
ByteOrder => 'BigEndian',
|
|
2179
2198
|
},
|
|
2180
2199
|
},
|
|
@@ -2184,8 +2203,6 @@ my %base64coord = (
|
|
|
2184
2203
|
SubDirectory => {
|
|
2185
2204
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD810',
|
|
2186
2205
|
DecryptStart => 4,
|
|
2187
|
-
DecryptLen => 0x36f4 + 12,
|
|
2188
|
-
DecryptMore => 'Get32u(\$data, 0x84) + 12',
|
|
2189
2206
|
ByteOrder => 'LittleEndian',
|
|
2190
2207
|
},
|
|
2191
2208
|
},
|
|
@@ -2195,8 +2212,6 @@ my %base64coord = (
|
|
|
2195
2212
|
SubDirectory => {
|
|
2196
2213
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD850',
|
|
2197
2214
|
DecryptStart => 4,
|
|
2198
|
-
DecryptLen => 0x2efb + 12,
|
|
2199
|
-
DecryptMore => 'Get32u(\$data, 0xa0) + 12',
|
|
2200
2215
|
ByteOrder => 'LittleEndian',
|
|
2201
2216
|
},
|
|
2202
2217
|
},
|
|
@@ -2209,7 +2224,6 @@ my %base64coord = (
|
|
|
2209
2224
|
SubDirectory => {
|
|
2210
2225
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD5000',
|
|
2211
2226
|
DecryptStart => 4,
|
|
2212
|
-
DecryptLen => 0x39a,
|
|
2213
2227
|
ByteOrder => 'BigEndian',
|
|
2214
2228
|
},
|
|
2215
2229
|
},
|
|
@@ -2219,7 +2233,6 @@ my %base64coord = (
|
|
|
2219
2233
|
SubDirectory => {
|
|
2220
2234
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD5100',
|
|
2221
2235
|
DecryptStart => 4,
|
|
2222
|
-
DecryptLen => 0x430,
|
|
2223
2236
|
ByteOrder => 'BigEndian',
|
|
2224
2237
|
},
|
|
2225
2238
|
},
|
|
@@ -2229,7 +2242,6 @@ my %base64coord = (
|
|
|
2229
2242
|
SubDirectory => {
|
|
2230
2243
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD5200',
|
|
2231
2244
|
DecryptStart => 4,
|
|
2232
|
-
DecryptLen => 0xd00,
|
|
2233
2245
|
ByteOrder => 'BigEndian',
|
|
2234
2246
|
},
|
|
2235
2247
|
},
|
|
@@ -2239,7 +2251,6 @@ my %base64coord = (
|
|
|
2239
2251
|
SubDirectory => {
|
|
2240
2252
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD7000',
|
|
2241
2253
|
DecryptStart => 4,
|
|
2242
|
-
DecryptLen => 0x448,
|
|
2243
2254
|
ByteOrder => 'BigEndian',
|
|
2244
2255
|
},
|
|
2245
2256
|
},
|
|
@@ -2249,7 +2260,6 @@ my %base64coord = (
|
|
|
2249
2260
|
SubDirectory => {
|
|
2250
2261
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD4',
|
|
2251
2262
|
DecryptStart => 4,
|
|
2252
|
-
DecryptLen => 0x789,
|
|
2253
2263
|
ByteOrder => 'BigEndian',
|
|
2254
2264
|
},
|
|
2255
2265
|
},
|
|
@@ -2259,29 +2269,15 @@ my %base64coord = (
|
|
|
2259
2269
|
SubDirectory => {
|
|
2260
2270
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD4S',
|
|
2261
2271
|
DecryptStart => 4,
|
|
2262
|
-
DecryptLen => 0x3697,
|
|
2263
|
-
ByteOrder => 'LittleEndian',
|
|
2264
|
-
},
|
|
2265
|
-
},
|
|
2266
|
-
{ #28 (D5 firmware version 1.10a)
|
|
2267
|
-
Condition => '$$valPt =~ /^0238/',
|
|
2268
|
-
Name => 'ShotInfoD5',
|
|
2269
|
-
SubDirectory => {
|
|
2270
|
-
TagTable => 'Image::ExifTool::Nikon::ShotInfoD500',
|
|
2271
|
-
DecryptStart => 4,
|
|
2272
|
-
DecryptLen => 0x2c24 + 12,
|
|
2273
|
-
DecryptMore => 'Get32u(\$data, 0xa8) + 0x2ea5 - 0x2c90',
|
|
2274
2272
|
ByteOrder => 'LittleEndian',
|
|
2275
2273
|
},
|
|
2276
2274
|
},
|
|
2277
|
-
{ # (D500 firmware version 1.00)
|
|
2278
|
-
Condition => '$$valPt =~ /^
|
|
2275
|
+
{ #28 (D500 firmware version 1.00 and D5 firmware version 1.10a)
|
|
2276
|
+
Condition => '$$valPt =~ /^023[89]/',
|
|
2279
2277
|
Name => 'ShotInfoD500',
|
|
2280
2278
|
SubDirectory => {
|
|
2281
2279
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD500',
|
|
2282
2280
|
DecryptStart => 4,
|
|
2283
|
-
DecryptLen => 0x2cb2 + 4,
|
|
2284
|
-
DecryptMore => 'Get32u(\$data, 0xa8) + 0x2ea5 - 0x2c90',
|
|
2285
2281
|
ByteOrder => 'LittleEndian',
|
|
2286
2282
|
},
|
|
2287
2283
|
},
|
|
@@ -2291,7 +2287,6 @@ my %base64coord = (
|
|
|
2291
2287
|
SubDirectory => {
|
|
2292
2288
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
|
|
2293
2289
|
DecryptStart => 4,
|
|
2294
|
-
DecryptLen => 0xc292 + 720, # thru decoded parts of Offset 32
|
|
2295
2290
|
ByteOrder => 'LittleEndian',
|
|
2296
2291
|
},
|
|
2297
2292
|
},
|
|
@@ -2301,7 +2296,6 @@ my %base64coord = (
|
|
|
2301
2296
|
SubDirectory => {
|
|
2302
2297
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD610',
|
|
2303
2298
|
DecryptStart => 4,
|
|
2304
|
-
DecryptLen => 0x7ff,
|
|
2305
2299
|
ByteOrder => 'BigEndian',
|
|
2306
2300
|
},
|
|
2307
2301
|
},
|
|
@@ -2312,8 +2306,6 @@ my %base64coord = (
|
|
|
2312
2306
|
SubDirectory => {
|
|
2313
2307
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',
|
|
2314
2308
|
DecryptStart => 4,
|
|
2315
|
-
# TODO: eventually set the length dynamically according to actual offsets!
|
|
2316
|
-
DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II
|
|
2317
2309
|
ByteOrder => 'LittleEndian',
|
|
2318
2310
|
},
|
|
2319
2311
|
},
|
|
@@ -2323,8 +2315,6 @@ my %base64coord = (
|
|
|
2323
2315
|
SubDirectory => {
|
|
2324
2316
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
|
|
2325
2317
|
DecryptStart => 4,
|
|
2326
|
-
# TODO: eventually set the length dynamically according to actual offsets!
|
|
2327
|
-
DecryptLen => 0xec4b + 2196, # decoded thru end of Offset26
|
|
2328
2318
|
ByteOrder => 'LittleEndian',
|
|
2329
2319
|
},
|
|
2330
2320
|
},
|
|
@@ -2333,10 +2323,9 @@ my %base64coord = (
|
|
|
2333
2323
|
Name => 'ShotInfo02xx',
|
|
2334
2324
|
SubDirectory => {
|
|
2335
2325
|
TagTable => 'Image::ExifTool::Nikon::ShotInfo',
|
|
2336
|
-
ProcessProc => \&
|
|
2337
|
-
WriteProc => \&
|
|
2326
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2327
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2338
2328
|
DecryptStart => 4,
|
|
2339
|
-
DecryptLen => 0x251,
|
|
2340
2329
|
ByteOrder => 'BigEndian',
|
|
2341
2330
|
},
|
|
2342
2331
|
},
|
|
@@ -2400,11 +2389,10 @@ my %base64coord = (
|
|
|
2400
2389
|
Name => 'ColorBalance0205',
|
|
2401
2390
|
SubDirectory => {
|
|
2402
2391
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
|
2403
|
-
ProcessProc => \&
|
|
2404
|
-
WriteProc => \&
|
|
2392
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2393
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2405
2394
|
DecryptStart => 4,
|
|
2406
|
-
|
|
2407
|
-
DirOffset => 14,
|
|
2395
|
+
DirOffset => 14, # (start of directory relative to DecryptStart)
|
|
2408
2396
|
},
|
|
2409
2397
|
},
|
|
2410
2398
|
{ # (D3/D3X/D300/D700=0209,D300S=0212,D3S=0214)
|
|
@@ -2412,10 +2400,9 @@ my %base64coord = (
|
|
|
2412
2400
|
Name => 'ColorBalance0209',
|
|
2413
2401
|
SubDirectory => {
|
|
2414
2402
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
|
|
2415
|
-
ProcessProc => \&
|
|
2416
|
-
WriteProc => \&
|
|
2403
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2404
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2417
2405
|
DecryptStart => 284,
|
|
2418
|
-
DecryptLen => 18, # 324 bytes encrypted, but don't need to decrypt it all
|
|
2419
2406
|
DirOffset => 10,
|
|
2420
2407
|
},
|
|
2421
2408
|
},
|
|
@@ -2424,10 +2411,9 @@ my %base64coord = (
|
|
|
2424
2411
|
Name => 'ColorBalance02',
|
|
2425
2412
|
SubDirectory => {
|
|
2426
2413
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
|
2427
|
-
ProcessProc => \&
|
|
2428
|
-
WriteProc => \&
|
|
2414
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2415
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2429
2416
|
DecryptStart => 284,
|
|
2430
|
-
DecryptLen => 14, # don't need to decrypt it all
|
|
2431
2417
|
DirOffset => 6,
|
|
2432
2418
|
},
|
|
2433
2419
|
},
|
|
@@ -2436,10 +2422,9 @@ my %base64coord = (
|
|
|
2436
2422
|
Name => 'ColorBalance0211',
|
|
2437
2423
|
SubDirectory => {
|
|
2438
2424
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
|
|
2439
|
-
ProcessProc => \&
|
|
2440
|
-
WriteProc => \&
|
|
2425
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2426
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2441
2427
|
DecryptStart => 284,
|
|
2442
|
-
DecryptLen => 24, # don't need to decrypt it all
|
|
2443
2428
|
DirOffset => 16,
|
|
2444
2429
|
},
|
|
2445
2430
|
},
|
|
@@ -2448,10 +2433,9 @@ my %base64coord = (
|
|
|
2448
2433
|
Name => 'ColorBalance0213',
|
|
2449
2434
|
SubDirectory => {
|
|
2450
2435
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
|
2451
|
-
ProcessProc => \&
|
|
2452
|
-
WriteProc => \&
|
|
2436
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2437
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2453
2438
|
DecryptStart => 284,
|
|
2454
|
-
DecryptLen => 18, # don't need to decrypt it all
|
|
2455
2439
|
DirOffset => 10,
|
|
2456
2440
|
},
|
|
2457
2441
|
},
|
|
@@ -2460,10 +2444,9 @@ my %base64coord = (
|
|
|
2460
2444
|
Name => 'ColorBalance0215',
|
|
2461
2445
|
SubDirectory => {
|
|
2462
2446
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
|
|
2463
|
-
ProcessProc => \&
|
|
2464
|
-
WriteProc => \&
|
|
2447
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2448
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2465
2449
|
DecryptStart => 284,
|
|
2466
|
-
DecryptLen => 12, # don't need to decrypt it all
|
|
2467
2450
|
DirOffset => 4,
|
|
2468
2451
|
},
|
|
2469
2452
|
},
|
|
@@ -2472,9 +2455,9 @@ my %base64coord = (
|
|
|
2472
2455
|
Condition => '$$valPt =~ /^0[26]/',
|
|
2473
2456
|
SubDirectory => {
|
|
2474
2457
|
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
|
|
2475
|
-
ProcessProc => \&
|
|
2458
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2459
|
+
WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
|
|
2476
2460
|
DecryptStart => 284,
|
|
2477
|
-
DecryptLen => 10, # (arbitrary)
|
|
2478
2461
|
},
|
|
2479
2462
|
},
|
|
2480
2463
|
{ # (1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, 1AW1=0403, Z6/Z7=0800)
|
|
@@ -2482,9 +2465,9 @@ my %base64coord = (
|
|
|
2482
2465
|
Condition => '$$valPt =~ /^0[48]/',
|
|
2483
2466
|
SubDirectory => {
|
|
2484
2467
|
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
|
|
2485
|
-
ProcessProc => \&
|
|
2468
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2469
|
+
WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
|
|
2486
2470
|
DecryptStart => 4,
|
|
2487
|
-
DecryptLen => 10, # (arbitrary)
|
|
2488
2471
|
},
|
|
2489
2472
|
},
|
|
2490
2473
|
{
|
|
@@ -2513,8 +2496,8 @@ my %base64coord = (
|
|
|
2513
2496
|
Name => 'LensData0201',
|
|
2514
2497
|
SubDirectory => {
|
|
2515
2498
|
TagTable => 'Image::ExifTool::Nikon::LensData01',
|
|
2516
|
-
ProcessProc => \&
|
|
2517
|
-
WriteProc => \&
|
|
2499
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2500
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2518
2501
|
DecryptStart => 4,
|
|
2519
2502
|
},
|
|
2520
2503
|
},
|
|
@@ -2523,8 +2506,8 @@ my %base64coord = (
|
|
|
2523
2506
|
Name => 'LensData0204',
|
|
2524
2507
|
SubDirectory => {
|
|
2525
2508
|
TagTable => 'Image::ExifTool::Nikon::LensData0204',
|
|
2526
|
-
ProcessProc => \&
|
|
2527
|
-
WriteProc => \&
|
|
2509
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2510
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2528
2511
|
DecryptStart => 4,
|
|
2529
2512
|
},
|
|
2530
2513
|
},
|
|
@@ -2533,8 +2516,8 @@ my %base64coord = (
|
|
|
2533
2516
|
Name => 'LensData0400',
|
|
2534
2517
|
SubDirectory => {
|
|
2535
2518
|
TagTable => 'Image::ExifTool::Nikon::LensData0400',
|
|
2536
|
-
ProcessProc => \&
|
|
2537
|
-
WriteProc => \&
|
|
2519
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2520
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2538
2521
|
DecryptStart => 4,
|
|
2539
2522
|
},
|
|
2540
2523
|
},
|
|
@@ -2543,8 +2526,8 @@ my %base64coord = (
|
|
|
2543
2526
|
Name => 'LensData0402',
|
|
2544
2527
|
SubDirectory => {
|
|
2545
2528
|
TagTable => 'Image::ExifTool::Nikon::LensData0402',
|
|
2546
|
-
ProcessProc => \&
|
|
2547
|
-
WriteProc => \&
|
|
2529
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2530
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2548
2531
|
DecryptStart => 4,
|
|
2549
2532
|
},
|
|
2550
2533
|
},
|
|
@@ -2553,8 +2536,8 @@ my %base64coord = (
|
|
|
2553
2536
|
Name => 'LensData0403',
|
|
2554
2537
|
SubDirectory => {
|
|
2555
2538
|
TagTable => 'Image::ExifTool::Nikon::LensData0403',
|
|
2556
|
-
ProcessProc => \&
|
|
2557
|
-
WriteProc => \&
|
|
2539
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2540
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2558
2541
|
DecryptStart => 4,
|
|
2559
2542
|
},
|
|
2560
2543
|
},
|
|
@@ -2563,8 +2546,8 @@ my %base64coord = (
|
|
|
2563
2546
|
Name => 'LensData0800',
|
|
2564
2547
|
SubDirectory => {
|
|
2565
2548
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|
|
2566
|
-
ProcessProc => \&
|
|
2567
|
-
WriteProc => \&
|
|
2549
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2550
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2568
2551
|
DecryptStart => 4,
|
|
2569
2552
|
ByteOrder => 'LittleEndian',
|
|
2570
2553
|
},
|
|
@@ -2573,8 +2556,8 @@ my %base64coord = (
|
|
|
2573
2556
|
Name => 'LensDataUnknown',
|
|
2574
2557
|
SubDirectory => {
|
|
2575
2558
|
TagTable => 'Image::ExifTool::Nikon::LensDataUnknown',
|
|
2576
|
-
ProcessProc => \&
|
|
2577
|
-
WriteProc => \&
|
|
2559
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
2560
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
2578
2561
|
DecryptStart => 4,
|
|
2579
2562
|
},
|
|
2580
2563
|
},
|
|
@@ -5279,7 +5262,7 @@ my %nikonFocalConversions = (
|
|
|
5279
5262
|
Name => 'NewLensData',
|
|
5280
5263
|
Format => 'undef[17]',
|
|
5281
5264
|
RawConv => '$$self{NewLensData} = 1 unless $val =~ /^.\0+$/s; undef',
|
|
5282
|
-
Hidden => 1,
|
|
5265
|
+
#Hidden => 1,
|
|
5283
5266
|
},
|
|
5284
5267
|
0x30 => { #PH
|
|
5285
5268
|
Name => 'LensID',
|
|
@@ -5305,12 +5288,14 @@ my %nikonFocalConversions = (
|
|
|
5305
5288
|
23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
|
|
5306
5289
|
24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
|
|
5307
5290
|
25 => 'Nikkor Z 40mm f/2', #28
|
|
5291
|
+
26 => 'Nikkor Z DX 18-140mm f/3.5-6.3 VR', #IB
|
|
5308
5292
|
27 => 'Nikkor Z MC 50mm f/2.8', #IB
|
|
5309
5293
|
28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
|
|
5310
5294
|
29 => 'Nikkor Z 28mm f/2.8', #IB
|
|
5311
5295
|
30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
|
|
5312
5296
|
31 => 'Nikkor Z 24-120 f/4', #28
|
|
5313
5297
|
32 => 'Nikkor Z 800mm f/6.3 VR S', #28
|
|
5298
|
+
35 => 'Nikkor Z 28-75mm f/2.8', #IB
|
|
5314
5299
|
36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
|
|
5315
5300
|
37 => 'Nikkor Z 600mm f/4 TC VR S', #28
|
|
5316
5301
|
39 => 'Nikkor Z 17-28mm f/2.8', #IB
|
|
@@ -5322,7 +5307,7 @@ my %nikonFocalConversions = (
|
|
|
5322
5307
|
Name => 'LensMountType',
|
|
5323
5308
|
RawConv => '$$self{LensMountType} = $val', # 0=> DSLR lens via FTZ style adapter; 1=> Native Z lens;
|
|
5324
5309
|
Format => 'int8u',
|
|
5325
|
-
Unknown => 1,
|
|
5310
|
+
#Unknown => 1,
|
|
5326
5311
|
PrintConv => {
|
|
5327
5312
|
0 => 'F-mount Lens',
|
|
5328
5313
|
1 => 'Z-mount Lens',
|
|
@@ -5385,7 +5370,7 @@ my %nikonFocalConversions = (
|
|
|
5385
5370
|
Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
|
|
5386
5371
|
Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
|
|
5387
5372
|
Format => 'int32s',
|
|
5388
|
-
Unknown => 1,
|
|
5373
|
+
#Unknown => 1,
|
|
5389
5374
|
},
|
|
5390
5375
|
);
|
|
5391
5376
|
|
|
@@ -5508,8 +5493,6 @@ my %nikonFocalConversions = (
|
|
|
5508
5493
|
Format => 'int32u',
|
|
5509
5494
|
Priority => 0,
|
|
5510
5495
|
},
|
|
5511
|
-
# note: DecryptLen currently set to 0x251
|
|
5512
|
-
|
|
5513
5496
|
# 0x55c - int16u[2400] TiffMeteringImage2: 60x40 image (ShotInfoVersion 0800, ref JR)
|
|
5514
5497
|
# 0x181c - int16u[1200] TiffMeteringImage?: 60x20 image for some NEF's (ShotInfoVersion 0800, ref JR)
|
|
5515
5498
|
# 0x217c - int16u[2400] TiffMeteringImage3: 60x40 image (ShotInfoVersion 0800, ref JR)
|
|
@@ -5521,8 +5504,8 @@ my %nikonFocalConversions = (
|
|
|
5521
5504
|
|
|
5522
5505
|
# shot information for D40 and D40X (encrypted) - ref PH
|
|
5523
5506
|
%Image::ExifTool::Nikon::ShotInfoD40 = (
|
|
5524
|
-
PROCESS_PROC => \&
|
|
5525
|
-
WRITE_PROC => \&
|
|
5507
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5508
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5526
5509
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5527
5510
|
VARS => { ID_LABEL => 'Index' },
|
|
5528
5511
|
IS_SUBDIR => [ 729 ],
|
|
@@ -5552,13 +5535,12 @@ my %nikonFocalConversions = (
|
|
|
5552
5535
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD40',
|
|
5553
5536
|
},
|
|
5554
5537
|
},
|
|
5555
|
-
# note: DecryptLen currently set to 748
|
|
5556
5538
|
);
|
|
5557
5539
|
|
|
5558
5540
|
# shot information for D80 (encrypted) - ref JD
|
|
5559
5541
|
%Image::ExifTool::Nikon::ShotInfoD80 = (
|
|
5560
|
-
PROCESS_PROC => \&
|
|
5561
|
-
WRITE_PROC => \&
|
|
5542
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5543
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5562
5544
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5563
5545
|
VARS => { ID_LABEL => 'Index' },
|
|
5564
5546
|
IS_SUBDIR => [ 748 ],
|
|
@@ -5632,13 +5614,12 @@ my %nikonFocalConversions = (
|
|
|
5632
5614
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD80',
|
|
5633
5615
|
},
|
|
5634
5616
|
},
|
|
5635
|
-
# note: DecryptLen currently set to 765
|
|
5636
5617
|
);
|
|
5637
5618
|
|
|
5638
5619
|
# shot information for D90 (encrypted) - ref PH
|
|
5639
5620
|
%Image::ExifTool::Nikon::ShotInfoD90 = (
|
|
5640
|
-
PROCESS_PROC => \&
|
|
5641
|
-
WRITE_PROC => \&
|
|
5621
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5622
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5642
5623
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5643
5624
|
VARS => { ID_LABEL => 'Index' },
|
|
5644
5625
|
IS_SUBDIR => [ 0x374 ],
|
|
@@ -5678,13 +5659,12 @@ my %nikonFocalConversions = (
|
|
|
5678
5659
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD90',
|
|
5679
5660
|
},
|
|
5680
5661
|
},
|
|
5681
|
-
# note: DecryptLen currently set to 0x398
|
|
5682
5662
|
);
|
|
5683
5663
|
|
|
5684
5664
|
# shot information for the D3 firmware 0.37 and 1.00 (encrypted) - ref PH
|
|
5685
5665
|
%Image::ExifTool::Nikon::ShotInfoD3a = (
|
|
5686
|
-
PROCESS_PROC => \&
|
|
5687
|
-
WRITE_PROC => \&
|
|
5666
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5667
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5688
5668
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5689
5669
|
VARS => { ID_LABEL => 'Index' },
|
|
5690
5670
|
IS_SUBDIR => [ 0x301 ],
|
|
@@ -5742,13 +5722,12 @@ my %nikonFocalConversions = (
|
|
|
5742
5722
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
5743
5723
|
},
|
|
5744
5724
|
},
|
|
5745
|
-
# note: DecryptLen currently set to 0x318
|
|
5746
5725
|
);
|
|
5747
5726
|
|
|
5748
5727
|
# shot information for the D3 firmware 1.10, 2.00 and 2.01 (encrypted) - ref PH
|
|
5749
5728
|
%Image::ExifTool::Nikon::ShotInfoD3b = (
|
|
5750
|
-
PROCESS_PROC => \&
|
|
5751
|
-
WRITE_PROC => \&
|
|
5729
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5730
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5752
5731
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5753
5732
|
VARS => { ID_LABEL => 'Index' },
|
|
5754
5733
|
IS_SUBDIR => [ 0x30a ],
|
|
@@ -5837,13 +5816,12 @@ my %nikonFocalConversions = (
|
|
|
5837
5816
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
5838
5817
|
},
|
|
5839
5818
|
},
|
|
5840
|
-
# note: DecryptLen currently set to 0x321
|
|
5841
5819
|
);
|
|
5842
5820
|
|
|
5843
5821
|
# shot information for the D3X firmware 1.00 (encrypted) - ref PH
|
|
5844
5822
|
%Image::ExifTool::Nikon::ShotInfoD3X = (
|
|
5845
|
-
PROCESS_PROC => \&
|
|
5846
|
-
WRITE_PROC => \&
|
|
5823
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5824
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5847
5825
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5848
5826
|
VARS => { ID_LABEL => 'Index' },
|
|
5849
5827
|
IS_SUBDIR => [ 0x30b ],
|
|
@@ -5883,13 +5861,12 @@ my %nikonFocalConversions = (
|
|
|
5883
5861
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
5884
5862
|
},
|
|
5885
5863
|
},
|
|
5886
|
-
# note: DecryptLen currently set to 0x323
|
|
5887
5864
|
);
|
|
5888
5865
|
|
|
5889
5866
|
# shot information for the D3S firmware 0.16 and 1.00 (encrypted) - ref PH
|
|
5890
5867
|
%Image::ExifTool::Nikon::ShotInfoD3S = (
|
|
5891
|
-
PROCESS_PROC => \&
|
|
5892
|
-
WRITE_PROC => \&
|
|
5868
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5869
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5893
5870
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5894
5871
|
VARS => { ID_LABEL => 'Index' },
|
|
5895
5872
|
IS_SUBDIR => [ 0x2ce ],
|
|
@@ -5938,13 +5915,12 @@ my %nikonFocalConversions = (
|
|
|
5938
5915
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
5939
5916
|
},
|
|
5940
5917
|
},
|
|
5941
|
-
# note: DecryptLen currently set to 0x2e9
|
|
5942
5918
|
);
|
|
5943
5919
|
|
|
5944
5920
|
# shot information for the D300 firmware 1.00 (encrypted) - ref JD
|
|
5945
5921
|
%Image::ExifTool::Nikon::ShotInfoD300a = (
|
|
5946
|
-
PROCESS_PROC => \&
|
|
5947
|
-
WRITE_PROC => \&
|
|
5922
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
5923
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
5948
5924
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
5949
5925
|
VARS => { ID_LABEL => 'Index' },
|
|
5950
5926
|
IS_SUBDIR => [ 790 ],
|
|
@@ -6031,13 +6007,12 @@ my %nikonFocalConversions = (
|
|
|
6031
6007
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
6032
6008
|
},
|
|
6033
6009
|
},
|
|
6034
|
-
# note: DecryptLen currently set to 813
|
|
6035
6010
|
);
|
|
6036
6011
|
|
|
6037
6012
|
# shot information for the D300 firmware 1.10 (encrypted) - ref PH
|
|
6038
6013
|
%Image::ExifTool::Nikon::ShotInfoD300b = (
|
|
6039
|
-
PROCESS_PROC => \&
|
|
6040
|
-
WRITE_PROC => \&
|
|
6014
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6015
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6041
6016
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6042
6017
|
VARS => { ID_LABEL => 'Index' },
|
|
6043
6018
|
DATAMEMBER => [ 4 ],
|
|
@@ -6182,13 +6157,12 @@ my %nikonFocalConversions = (
|
|
|
6182
6157
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
6183
6158
|
},
|
|
6184
6159
|
},
|
|
6185
|
-
# note: DecryptLen currently set to 825
|
|
6186
6160
|
);
|
|
6187
6161
|
|
|
6188
6162
|
# shot information for the D300S firmware 1.00 (encrypted) - ref PH
|
|
6189
6163
|
%Image::ExifTool::Nikon::ShotInfoD300S = (
|
|
6190
|
-
PROCESS_PROC => \&
|
|
6191
|
-
WRITE_PROC => \&
|
|
6164
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6165
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6192
6166
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6193
6167
|
VARS => { ID_LABEL => 'Index' },
|
|
6194
6168
|
IS_SUBDIR => [ 804 ],
|
|
@@ -6228,13 +6202,12 @@ my %nikonFocalConversions = (
|
|
|
6228
6202
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD3',
|
|
6229
6203
|
},
|
|
6230
6204
|
},
|
|
6231
|
-
# note: DecryptLen currently set to 827
|
|
6232
6205
|
);
|
|
6233
6206
|
|
|
6234
6207
|
# shot information for the D700 firmware 1.02f (encrypted) - ref 29
|
|
6235
6208
|
%Image::ExifTool::Nikon::ShotInfoD700 = (
|
|
6236
|
-
PROCESS_PROC => \&
|
|
6237
|
-
WRITE_PROC => \&
|
|
6209
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6210
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6238
6211
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6239
6212
|
VARS => { ID_LABEL => 'Index' },
|
|
6240
6213
|
IS_SUBDIR => [ 804 ],
|
|
@@ -6274,13 +6247,45 @@ my %nikonFocalConversions = (
|
|
|
6274
6247
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD700',
|
|
6275
6248
|
},
|
|
6276
6249
|
},
|
|
6277
|
-
|
|
6250
|
+
);
|
|
6251
|
+
|
|
6252
|
+
# shot information for the D780 - ref #28
|
|
6253
|
+
%Image::ExifTool::Nikon::ShotInfoD780 = (
|
|
6254
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6255
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6256
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6257
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
|
6258
|
+
DATAMEMBER => [ 0x04 ],
|
|
6259
|
+
IS_SUBDIR => [ 0x9c ],
|
|
6260
|
+
WRITABLE => 1,
|
|
6261
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6262
|
+
NOTES => 'These tags are extracted from encrypted data in images from the D780.',
|
|
6263
|
+
0x00 => {
|
|
6264
|
+
Name => 'ShotInfoVersion',
|
|
6265
|
+
Format => 'string[4]',
|
|
6266
|
+
Writable => 0,
|
|
6267
|
+
},
|
|
6268
|
+
0x04 => {
|
|
6269
|
+
Name => 'FirmwareVersion',
|
|
6270
|
+
DataMember => 'FirmwareVersion',
|
|
6271
|
+
Format => 'string[5]',
|
|
6272
|
+
Writable => 0,
|
|
6273
|
+
RawConv => '$$self{FirmwareVersion} = $val',
|
|
6274
|
+
},
|
|
6275
|
+
0x9c => {
|
|
6276
|
+
Name => 'OrientOffset',
|
|
6277
|
+
Format => 'int32u',
|
|
6278
|
+
SubDirectory => {
|
|
6279
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
6280
|
+
Start => '$val',
|
|
6281
|
+
},
|
|
6282
|
+
},
|
|
6278
6283
|
);
|
|
6279
6284
|
|
|
6280
6285
|
# shot information for the D5000 firmware 1.00 (encrypted) - ref PH
|
|
6281
6286
|
%Image::ExifTool::Nikon::ShotInfoD5000 = (
|
|
6282
|
-
PROCESS_PROC => \&
|
|
6283
|
-
WRITE_PROC => \&
|
|
6287
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6288
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6284
6289
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6285
6290
|
VARS => { ID_LABEL => 'Index' },
|
|
6286
6291
|
IS_SUBDIR => [ 0x378 ],
|
|
@@ -6320,13 +6325,12 @@ my %nikonFocalConversions = (
|
|
|
6320
6325
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD5000',
|
|
6321
6326
|
},
|
|
6322
6327
|
},
|
|
6323
|
-
# note: DecryptLen currently set to 0x39a
|
|
6324
6328
|
);
|
|
6325
6329
|
|
|
6326
6330
|
# shot information for the D5100 firmware 1.00f (encrypted) - ref PH
|
|
6327
6331
|
%Image::ExifTool::Nikon::ShotInfoD5100 = (
|
|
6328
|
-
PROCESS_PROC => \&
|
|
6329
|
-
WRITE_PROC => \&
|
|
6332
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6333
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6330
6334
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6331
6335
|
VARS => { ID_LABEL => 'Index' },
|
|
6332
6336
|
IS_SUBDIR => [ 0x407 ],
|
|
@@ -6355,13 +6359,12 @@ my %nikonFocalConversions = (
|
|
|
6355
6359
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD5100',
|
|
6356
6360
|
},
|
|
6357
6361
|
},
|
|
6358
|
-
# note: DecryptLen currently set to 0x430
|
|
6359
6362
|
);
|
|
6360
6363
|
|
|
6361
6364
|
# shot information for the D5200 firmware 1.00 (encrypted) - ref PH
|
|
6362
6365
|
%Image::ExifTool::Nikon::ShotInfoD5200 = (
|
|
6363
|
-
PROCESS_PROC => \&
|
|
6364
|
-
WRITE_PROC => \&
|
|
6366
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6367
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6365
6368
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6366
6369
|
VARS => { ID_LABEL => 'Index' },
|
|
6367
6370
|
IS_SUBDIR => [ 0xcd5 ],
|
|
@@ -6393,13 +6396,12 @@ my %nikonFocalConversions = (
|
|
|
6393
6396
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD5200',
|
|
6394
6397
|
},
|
|
6395
6398
|
},
|
|
6396
|
-
# note: DecryptLen currently set to 0xd00
|
|
6397
6399
|
);
|
|
6398
6400
|
|
|
6399
6401
|
# shot information for the D7000 firmware 1.01d (encrypted) - ref 29
|
|
6400
6402
|
%Image::ExifTool::Nikon::ShotInfoD7000 = (
|
|
6401
|
-
PROCESS_PROC => \&
|
|
6402
|
-
WRITE_PROC => \&
|
|
6403
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6404
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6403
6405
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6404
6406
|
VARS => { ID_LABEL => 'Index' },
|
|
6405
6407
|
IS_SUBDIR => [ 1028 ],
|
|
@@ -6441,10 +6443,43 @@ my %nikonFocalConversions = (
|
|
|
6441
6443
|
},
|
|
6442
6444
|
);
|
|
6443
6445
|
|
|
6446
|
+
# shot information for the D7500 - ref #28
|
|
6447
|
+
%Image::ExifTool::Nikon::ShotInfoD7500 = (
|
|
6448
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6449
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6450
|
+
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6451
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
|
6452
|
+
DATAMEMBER => [ 0x04 ],
|
|
6453
|
+
IS_SUBDIR => [ 0xa0 ],
|
|
6454
|
+
WRITABLE => 1,
|
|
6455
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6456
|
+
NOTES => 'These tags are extracted from encrypted data in images from the D7500.',
|
|
6457
|
+
0x00 => {
|
|
6458
|
+
Name => 'ShotInfoVersion',
|
|
6459
|
+
Format => 'string[4]',
|
|
6460
|
+
Writable => 0,
|
|
6461
|
+
},
|
|
6462
|
+
0x04 => {
|
|
6463
|
+
Name => 'FirmwareVersion',
|
|
6464
|
+
DataMember => 'FirmwareVersion',
|
|
6465
|
+
Format => 'string[5]',
|
|
6466
|
+
Writable => 0,
|
|
6467
|
+
RawConv => '$$self{FirmwareVersion} = $val',
|
|
6468
|
+
},
|
|
6469
|
+
0xa0 => {
|
|
6470
|
+
Name => 'OrientOffset',
|
|
6471
|
+
Format => 'int32u',
|
|
6472
|
+
SubDirectory => {
|
|
6473
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
6474
|
+
Start => '$val',
|
|
6475
|
+
},
|
|
6476
|
+
},
|
|
6477
|
+
);
|
|
6478
|
+
|
|
6444
6479
|
# shot information for the D800 firmware 1.01a (encrypted) - ref PH
|
|
6445
6480
|
%Image::ExifTool::Nikon::ShotInfoD800 = (
|
|
6446
|
-
PROCESS_PROC => \&
|
|
6447
|
-
WRITE_PROC => \&
|
|
6481
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6482
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6448
6483
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6449
6484
|
VARS => { ID_LABEL => 'Index' },
|
|
6450
6485
|
IS_SUBDIR => [ 0x6ec ],
|
|
@@ -6559,20 +6594,17 @@ my %nikonFocalConversions = (
|
|
|
6559
6594
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD800',
|
|
6560
6595
|
},
|
|
6561
6596
|
},
|
|
6562
|
-
# note: DecryptLen currently set to 0x720
|
|
6563
6597
|
);
|
|
6564
6598
|
|
|
6565
6599
|
# shot information for the D5 firmware 1.10a and D500 firmware 1.01 (encrypted) - ref 28
|
|
6566
6600
|
%Image::ExifTool::Nikon::ShotInfoD500 = (
|
|
6567
|
-
PROCESS_PROC => \&
|
|
6568
|
-
WRITE_PROC => \&
|
|
6601
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
6602
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
6569
6603
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
6570
|
-
VARS => { ID_LABEL => 'Index' },
|
|
6571
|
-
DATAMEMBER => [ 0x04
|
|
6572
|
-
|
|
6573
|
-
IS_SUBDIR => [ 0x0eeb ],
|
|
6604
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
|
6605
|
+
DATAMEMBER => [ 0x04 ],
|
|
6606
|
+
IS_SUBDIR => [ 0x10, 0x14, 0x2c, 0x50, 0x58, 0xa0, 0xa8 ],
|
|
6574
6607
|
WRITABLE => 1,
|
|
6575
|
-
FIRST_ENTRY => 0,
|
|
6576
6608
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6577
6609
|
NOTES => 'These tags are extracted from encrypted data in images from the D5 and D500.',
|
|
6578
6610
|
0x00 => {
|
|
@@ -6589,73 +6621,66 @@ my %nikonFocalConversions = (
|
|
|
6589
6621
|
},
|
|
6590
6622
|
0x10 => {
|
|
6591
6623
|
Name => 'RotationInfoOffset',
|
|
6592
|
-
DataMember => 'RotationInfoOffset',
|
|
6593
6624
|
Format => 'int32u',
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6625
|
+
SubDirectory => {
|
|
6626
|
+
TagTable => 'Image::ExifTool::Nikon::RotationInfoD500',
|
|
6627
|
+
Start => '$val',
|
|
6628
|
+
}
|
|
6597
6629
|
},
|
|
6598
6630
|
0x14 => {
|
|
6599
6631
|
Name => 'JPGInfoOffset',
|
|
6600
|
-
DataMember => 'JPGInfoOffset',
|
|
6601
6632
|
Format => 'int32u',
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6633
|
+
SubDirectory => {
|
|
6634
|
+
TagTable => 'Image::ExifTool::Nikon::JPGInfoD500',
|
|
6635
|
+
Start => '$val',
|
|
6636
|
+
}
|
|
6605
6637
|
},
|
|
6606
6638
|
0x2c => {
|
|
6607
|
-
Name => '
|
|
6608
|
-
DataMember => 'BracketingInfoOffset',
|
|
6639
|
+
Name => 'BracketingOffset',
|
|
6609
6640
|
Format => 'int32u',
|
|
6610
|
-
|
|
6611
|
-
|
|
6612
|
-
|
|
6641
|
+
SubDirectory => {
|
|
6642
|
+
TagTable => 'Image::ExifTool::Nikon::BracketingInfoD500',
|
|
6643
|
+
Start => '$val',
|
|
6644
|
+
}
|
|
6613
6645
|
},
|
|
6614
6646
|
0x50 => {
|
|
6615
6647
|
Name => 'ShootingMenuOffset',
|
|
6616
|
-
DataMember => 'ShootingMenuOffset',
|
|
6617
6648
|
Format => 'int32u',
|
|
6618
|
-
|
|
6619
|
-
|
|
6620
|
-
|
|
6649
|
+
SubDirectory => {
|
|
6650
|
+
TagTable => 'Image::ExifTool::Nikon::ShootingMenuD500',
|
|
6651
|
+
Start => '$val',
|
|
6652
|
+
}
|
|
6621
6653
|
},
|
|
6622
6654
|
0x58 => {
|
|
6623
6655
|
Name => 'CustomSettingsOffset',
|
|
6624
|
-
DataMember => 'CustomSettingsOffset',
|
|
6625
6656
|
Format => 'int32u',
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6657
|
+
SubDirectory => {
|
|
6658
|
+
TagTable => 'Image::ExifTool::Nikon::CustomSettingsD500',
|
|
6659
|
+
Start => '$val',
|
|
6660
|
+
}
|
|
6629
6661
|
},
|
|
6630
6662
|
0xa0 => {
|
|
6631
6663
|
Name => 'OrientationOffset',
|
|
6632
|
-
DataMember => 'OrientationOffset',
|
|
6633
6664
|
Format => 'int32u',
|
|
6634
|
-
|
|
6635
|
-
|
|
6636
|
-
|
|
6665
|
+
SubDirectory => {
|
|
6666
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
6667
|
+
Start => '$val',
|
|
6668
|
+
}
|
|
6637
6669
|
},
|
|
6638
6670
|
0xa8 => {
|
|
6639
6671
|
Name => 'OtherOffset',
|
|
6640
|
-
DataMember => 'OtherOffset',
|
|
6641
6672
|
Format => 'int32u',
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
|
|
6645
|
-
|
|
6646
|
-
#
|
|
6647
|
-
# Tag ID's below are the offsets for a D500 JPEG image, but these offsets change
|
|
6648
|
-
# for various image types according to the offset table above
|
|
6649
|
-
#
|
|
6650
|
-
### 0xb0 - RotationInfo start
|
|
6651
|
-
0xb0 => {
|
|
6652
|
-
Name => 'Hook1',
|
|
6653
|
-
Hidden => 1,
|
|
6654
|
-
RawConv => 'undef',
|
|
6655
|
-
# account for variable location of Rotation data
|
|
6656
|
-
Hook => '$varSize = $$self{RotationInfoOffset} - 0xb0',
|
|
6673
|
+
SubDirectory => {
|
|
6674
|
+
TagTable => 'Image::ExifTool::Nikon::OtherInfoD500',
|
|
6675
|
+
Start => '$val',
|
|
6676
|
+
}
|
|
6657
6677
|
},
|
|
6658
|
-
|
|
6678
|
+
);
|
|
6679
|
+
|
|
6680
|
+
%Image::ExifTool::Nikon::RotationInfoD500 = (
|
|
6681
|
+
%binaryDataAttrs,
|
|
6682
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6683
|
+
0x1a => {
|
|
6659
6684
|
Name => 'Rotation',
|
|
6660
6685
|
Mask => 0x03,
|
|
6661
6686
|
PrintConv => {
|
|
@@ -6665,32 +6690,29 @@ my %nikonFocalConversions = (
|
|
|
6665
6690
|
3 => 'Rotate 180',
|
|
6666
6691
|
},
|
|
6667
6692
|
},
|
|
6668
|
-
|
|
6693
|
+
0x20 => {
|
|
6669
6694
|
Name => 'Interval',
|
|
6670
6695
|
# prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
|
|
6671
6696
|
Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
|
|
6672
6697
|
PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
|
|
6673
6698
|
},
|
|
6674
|
-
|
|
6699
|
+
0x24 => {
|
|
6675
6700
|
Name => 'IntervalFrame',
|
|
6676
6701
|
# prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
|
|
6677
6702
|
Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
|
|
6678
6703
|
PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
|
|
6679
6704
|
},
|
|
6680
|
-
|
|
6705
|
+
0x0532 => {
|
|
6681
6706
|
Name => 'FlickerReductionIndicator',
|
|
6682
6707
|
Mask => 0x01,
|
|
6683
6708
|
PrintConv => { 0 => 'On', 1 => 'Off' },
|
|
6684
6709
|
},
|
|
6685
|
-
|
|
6686
|
-
|
|
6687
|
-
|
|
6688
|
-
|
|
6689
|
-
|
|
6690
|
-
|
|
6691
|
-
Hook => '$varSize = $$self{JPGInfoOffset} - 0x07b0',
|
|
6692
|
-
},
|
|
6693
|
-
0x07d4 => {
|
|
6710
|
+
);
|
|
6711
|
+
|
|
6712
|
+
%Image::ExifTool::Nikon::JPGInfoD500 = (
|
|
6713
|
+
%binaryDataAttrs,
|
|
6714
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6715
|
+
0x24 => {
|
|
6694
6716
|
Name => 'JPGCompression',
|
|
6695
6717
|
Mask => 0x01,
|
|
6696
6718
|
PrintConv => {
|
|
@@ -6698,16 +6720,12 @@ my %nikonFocalConversions = (
|
|
|
6698
6720
|
1 => 'Optimal Quality',
|
|
6699
6721
|
},
|
|
6700
6722
|
},
|
|
6701
|
-
|
|
6702
|
-
|
|
6703
|
-
|
|
6704
|
-
|
|
6705
|
-
|
|
6706
|
-
|
|
6707
|
-
# account for variable location of Shooting Menu data
|
|
6708
|
-
Hook => '$varSize = $$self{BracketingInfoOffset} - 0x086c',
|
|
6709
|
-
},
|
|
6710
|
-
0x087b => {
|
|
6723
|
+
);
|
|
6724
|
+
|
|
6725
|
+
%Image::ExifTool::Nikon::BracketingInfoD500 = (
|
|
6726
|
+
%binaryDataAttrs,
|
|
6727
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6728
|
+
0x0f => {
|
|
6711
6729
|
Name => 'AEBracketingSteps',
|
|
6712
6730
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
|
6713
6731
|
Mask => 0xff,
|
|
@@ -6765,7 +6783,7 @@ my %nikonFocalConversions = (
|
|
|
6765
6783
|
0xd6 => '5F3',
|
|
6766
6784
|
},
|
|
6767
6785
|
},
|
|
6768
|
-
|
|
6786
|
+
0x10 => {
|
|
6769
6787
|
Name => 'WBBracketingSteps',
|
|
6770
6788
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
|
6771
6789
|
Mask => 0xff,
|
|
@@ -6808,7 +6826,7 @@ my %nikonFocalConversions = (
|
|
|
6808
6826
|
0x28 => '9F 3',
|
|
6809
6827
|
},
|
|
6810
6828
|
},
|
|
6811
|
-
|
|
6829
|
+
0x17 => {
|
|
6812
6830
|
Name => 'ADLBracketingStep',
|
|
6813
6831
|
Mask => 0xf0,
|
|
6814
6832
|
PrintConv => {
|
|
@@ -6820,7 +6838,7 @@ my %nikonFocalConversions = (
|
|
|
6820
6838
|
8 => 'Auto',
|
|
6821
6839
|
},
|
|
6822
6840
|
},
|
|
6823
|
-
|
|
6841
|
+
0x18 => {
|
|
6824
6842
|
Name => 'ADLBracketingType',
|
|
6825
6843
|
Mask => 0x0f,
|
|
6826
6844
|
PrintConv => {
|
|
@@ -6831,23 +6849,12 @@ my %nikonFocalConversions = (
|
|
|
6831
6849
|
4 => '5 Shots',
|
|
6832
6850
|
},
|
|
6833
6851
|
},
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6839
|
-
|
|
6840
|
-
### 0x0cbd - ? start
|
|
6841
|
-
### 0x0d98 - ? start
|
|
6842
|
-
### 0x0e7d - ShootingMenuOffset start
|
|
6843
|
-
0x0e7c => {
|
|
6844
|
-
Name => 'Hook4',
|
|
6845
|
-
Hidden => 1,
|
|
6846
|
-
RawConv => 'undef',
|
|
6847
|
-
# account for variable location of Shooting Menu data
|
|
6848
|
-
Hook => '$varSize = $$self{ShootingMenuOffset} - 0x0e7d',
|
|
6849
|
-
},
|
|
6850
|
-
0x0e7d => {
|
|
6852
|
+
);
|
|
6853
|
+
|
|
6854
|
+
%Image::ExifTool::Nikon::ShootingMenuD500 = (
|
|
6855
|
+
%binaryDataAttrs,
|
|
6856
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6857
|
+
0x00 => {
|
|
6851
6858
|
Name => 'PhotoShootingMenuBank',
|
|
6852
6859
|
Mask => 0x03,
|
|
6853
6860
|
PrintConv => {
|
|
@@ -6857,7 +6864,7 @@ my %nikonFocalConversions = (
|
|
|
6857
6864
|
3 => 'D',
|
|
6858
6865
|
},
|
|
6859
6866
|
},
|
|
6860
|
-
|
|
6867
|
+
0x02 => {
|
|
6861
6868
|
Name => 'PrimarySlot',
|
|
6862
6869
|
Condition => '$$self{Model} =~ /\bD500\b/',
|
|
6863
6870
|
Notes => 'D500 only',
|
|
@@ -6867,7 +6874,7 @@ my %nikonFocalConversions = (
|
|
|
6867
6874
|
1 => 'SD Card',
|
|
6868
6875
|
},
|
|
6869
6876
|
},
|
|
6870
|
-
|
|
6877
|
+
0x04 => {
|
|
6871
6878
|
Name => 'ISOAutoShutterTime',
|
|
6872
6879
|
Mask => 0x3f,
|
|
6873
6880
|
PrintConv => {
|
|
@@ -6910,7 +6917,7 @@ my %nikonFocalConversions = (
|
|
|
6910
6917
|
36 => 'Auto (Fastest)',
|
|
6911
6918
|
},
|
|
6912
6919
|
},
|
|
6913
|
-
|
|
6920
|
+
0x05 => {
|
|
6914
6921
|
Name => 'ISOAutoHiLimit',
|
|
6915
6922
|
Mask => 0xff,
|
|
6916
6923
|
PrintHex => 1,
|
|
@@ -6958,7 +6965,7 @@ my %nikonFocalConversions = (
|
|
|
6958
6965
|
0x72 => 'ISO Hi 5.0',
|
|
6959
6966
|
},
|
|
6960
6967
|
},
|
|
6961
|
-
|
|
6968
|
+
0x07 => {
|
|
6962
6969
|
Name => 'FlickerReduction',
|
|
6963
6970
|
Mask => 0x20,
|
|
6964
6971
|
PrintConv => {
|
|
@@ -6966,7 +6973,7 @@ my %nikonFocalConversions = (
|
|
|
6966
6973
|
1 => 'Disable',
|
|
6967
6974
|
},
|
|
6968
6975
|
},
|
|
6969
|
-
|
|
6976
|
+
7.1 => {
|
|
6970
6977
|
Name => 'PhotoShootingMenuBankImageArea',
|
|
6971
6978
|
Mask => 0x07,
|
|
6972
6979
|
PrintConv => {
|
|
@@ -6977,16 +6984,14 @@ my %nikonFocalConversions = (
|
|
|
6977
6984
|
4 => '1.3x (18x12)',
|
|
6978
6985
|
},
|
|
6979
6986
|
},
|
|
6980
|
-
|
|
6981
|
-
|
|
6982
|
-
|
|
6983
|
-
|
|
6984
|
-
|
|
6985
|
-
|
|
6986
|
-
|
|
6987
|
-
|
|
6988
|
-
},
|
|
6989
|
-
0x0eeb => [{
|
|
6987
|
+
);
|
|
6988
|
+
|
|
6989
|
+
%Image::ExifTool::Nikon::CustomSettingsD500 = (
|
|
6990
|
+
%binaryDataAttrs,
|
|
6991
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
6992
|
+
IS_SUBDIR => [ 0x00 ],
|
|
6993
|
+
VARS => { ALLOW_REPROCESS => 1 }, # (necessary because subdirectory is at offset 0)
|
|
6994
|
+
0x00 => [{
|
|
6990
6995
|
Name => 'CustomSettingsD5',
|
|
6991
6996
|
Condition => '$$self{Model} =~ /\bD5\b/',
|
|
6992
6997
|
Format => 'undef[90]',
|
|
@@ -7000,7 +7005,7 @@ my %nikonFocalConversions = (
|
|
|
7000
7005
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD500',
|
|
7001
7006
|
},
|
|
7002
7007
|
}],
|
|
7003
|
-
#
|
|
7008
|
+
# 0x7d => { #this decode works, but involves more bits than should be necessary
|
|
7004
7009
|
# Name => 'ShutterTrigger',
|
|
7005
7010
|
# Mask => 0xff,
|
|
7006
7011
|
# PrintConv => {
|
|
@@ -7009,51 +7014,13 @@ my %nikonFocalConversions = (
|
|
|
7009
7014
|
# 195 => 'Shutter Button',
|
|
7010
7015
|
# },
|
|
7011
7016
|
# },
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
# account for variable location of OrientationInfo data
|
|
7018
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0x2c24',
|
|
7019
|
-
},
|
|
7020
|
-
0x2c24 => {
|
|
7021
|
-
Name => 'RollAngle',
|
|
7022
|
-
Format => 'fixed32u',
|
|
7023
|
-
Notes => 'converted to degrees of clockwise camera roll',
|
|
7024
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7025
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7026
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7027
|
-
PrintConvInv => '$val',
|
|
7028
|
-
},
|
|
7029
|
-
0x2c28 => {
|
|
7030
|
-
Name => 'PitchAngle',
|
|
7031
|
-
Format => 'fixed32u',
|
|
7032
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
7033
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7034
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7035
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7036
|
-
PrintConvInv => '$val',
|
|
7037
|
-
},
|
|
7038
|
-
0x2c2c => {
|
|
7039
|
-
Name => 'YawAngle',
|
|
7040
|
-
Format => 'fixed32u',
|
|
7041
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
7042
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7043
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7044
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7045
|
-
PrintConvInv => '$val',
|
|
7046
|
-
},
|
|
7047
|
-
### 0x2c90 - OtherInfo start (D500 firmware 1.20d)
|
|
7048
|
-
0x2c8f => {
|
|
7049
|
-
Name => 'Hook7',
|
|
7050
|
-
Hidden => 1,
|
|
7051
|
-
RawConv => 'undef',
|
|
7052
|
-
# account for variable location of OtherInfo data
|
|
7053
|
-
Hook => '$varSize = $$self{OtherOffset} - 0x2c90',
|
|
7054
|
-
},
|
|
7017
|
+
);
|
|
7018
|
+
|
|
7019
|
+
%Image::ExifTool::Nikon::OtherInfoD500 = (
|
|
7020
|
+
%binaryDataAttrs,
|
|
7021
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7055
7022
|
# (needs testing)
|
|
7056
|
-
#
|
|
7023
|
+
#0x22 => {
|
|
7057
7024
|
# Name => 'ExtendedPhotoShootingBanks',
|
|
7058
7025
|
# Mask => 0x01,
|
|
7059
7026
|
# PrintConv => {
|
|
@@ -7062,7 +7029,7 @@ my %nikonFocalConversions = (
|
|
|
7062
7029
|
# },
|
|
7063
7030
|
#},
|
|
7064
7031
|
# (may not be reliable and is found elsewhere)
|
|
7065
|
-
#
|
|
7032
|
+
#0x212 => {
|
|
7066
7033
|
# Name => 'Rotation',
|
|
7067
7034
|
# Condition => '$$self{Model} =~ /\bD500\b/',
|
|
7068
7035
|
# Notes => 'D500 firmware 1.1x',
|
|
@@ -7074,7 +7041,7 @@ my %nikonFocalConversions = (
|
|
|
7074
7041
|
# 3 => 'Rotate 180',
|
|
7075
7042
|
# },
|
|
7076
7043
|
#},
|
|
7077
|
-
|
|
7044
|
+
0x214 => { #PH
|
|
7078
7045
|
Name => 'NikonMeteringMode',
|
|
7079
7046
|
Condition => '$$self{Model} =~ /\bD500\b/', # (didn't seem to work for D5, but I need more samples)
|
|
7080
7047
|
Notes => 'D500 only',
|
|
@@ -7086,18 +7053,16 @@ my %nikonFocalConversions = (
|
|
|
7086
7053
|
3 => 'Highlight'
|
|
7087
7054
|
},
|
|
7088
7055
|
},
|
|
7089
|
-
# note: DecryptLen currently set to OtherOffset + 0x2ea5 - 0x2c90
|
|
7090
7056
|
);
|
|
7091
7057
|
|
|
7092
7058
|
# shot information for the D6 firmware 1.00 (encrypted) - ref 28
|
|
7093
7059
|
%Image::ExifTool::Nikon::ShotInfoD6 = (
|
|
7094
|
-
PROCESS_PROC => \&
|
|
7095
|
-
WRITE_PROC => \&
|
|
7060
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7061
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7096
7062
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7097
|
-
VARS => { ID_LABEL => 'Index' },
|
|
7098
|
-
|
|
7063
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
|
7064
|
+
IS_SUBDIR => [ 0x30, 0x9c, 0xa4 ],
|
|
7099
7065
|
WRITABLE => 1,
|
|
7100
|
-
FIRST_ENTRY => 0,
|
|
7101
7066
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7102
7067
|
NOTES => 'These tags are extracted from encrypted data in images from the D6.',
|
|
7103
7068
|
0x00 => {
|
|
@@ -7112,159 +7077,111 @@ my %nikonFocalConversions = (
|
|
|
7112
7077
|
},
|
|
7113
7078
|
0x24 => {
|
|
7114
7079
|
Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data)
|
|
7115
|
-
DataMember => 'NumberOffsets',
|
|
7116
7080
|
Format => 'int32u',
|
|
7117
7081
|
Writable => 0,
|
|
7118
7082
|
Hidden => 1,
|
|
7119
7083
|
},
|
|
7120
7084
|
0x30 => {
|
|
7121
|
-
Name => '
|
|
7122
|
-
DataMember => 'Offset3',
|
|
7085
|
+
Name => 'SequenceOffset',
|
|
7123
7086
|
Format => 'int32u',
|
|
7124
|
-
|
|
7125
|
-
|
|
7126
|
-
|
|
7127
|
-
|
|
7128
|
-
0x60 => {
|
|
7129
|
-
Name => 'Offset15',
|
|
7130
|
-
DataMember => 'Offset15',
|
|
7131
|
-
Format => 'int32u',
|
|
7132
|
-
Writable => 0,
|
|
7133
|
-
Hidden => 1,
|
|
7134
|
-
RawConv => '$$self{Offset15} = $val || 0x10000000; undef', # (ignore if 0)
|
|
7087
|
+
SubDirectory => {
|
|
7088
|
+
TagTable => 'Image::ExifTool::Nikon::SeqInfoD6',
|
|
7089
|
+
Start => '$val',
|
|
7090
|
+
},
|
|
7135
7091
|
},
|
|
7136
7092
|
0x9c => {
|
|
7137
7093
|
Name => 'OrientationOffset',
|
|
7138
|
-
DataMember => 'OrientationOffset',
|
|
7139
7094
|
Format => 'int32u',
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
|
|
7095
|
+
SubDirectory => {
|
|
7096
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
7097
|
+
Start => '$val',
|
|
7098
|
+
},
|
|
7143
7099
|
},
|
|
7144
7100
|
0xa4 => {
|
|
7145
|
-
Name => '
|
|
7146
|
-
DataMember => 'Offset32',
|
|
7101
|
+
Name => 'IntervalOffset',
|
|
7147
7102
|
Format => 'int32u',
|
|
7148
|
-
|
|
7149
|
-
|
|
7150
|
-
|
|
7151
|
-
|
|
7152
|
-
### 0x75e8 - Offset3 info start (D6 firmware 1.33)
|
|
7153
|
-
0x75e7 => {
|
|
7154
|
-
Name => 'Hook1',
|
|
7155
|
-
Hidden => 1,
|
|
7156
|
-
RawConv => 'undef',
|
|
7157
|
-
# account for variable location of Offset5 data
|
|
7158
|
-
Hook => '$varSize = $$self{Offset3} - 0x75e8',
|
|
7103
|
+
SubDirectory => {
|
|
7104
|
+
TagTable => 'Image::ExifTool::Nikon::IntervalInfoD6',
|
|
7105
|
+
Start => '$val',
|
|
7106
|
+
}
|
|
7159
7107
|
},
|
|
7160
|
-
|
|
7108
|
+
);
|
|
7109
|
+
|
|
7110
|
+
%Image::ExifTool::Nikon::SeqInfoD6 = (
|
|
7111
|
+
%binaryDataAttrs,
|
|
7112
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7113
|
+
DATAMEMBER => [ 0x24, 0x28 ],
|
|
7114
|
+
0x24 => {
|
|
7161
7115
|
Name => 'IntervalShooting',
|
|
7162
7116
|
RawConv => '$$self{IntervalShooting} = $val',
|
|
7163
7117
|
Format => 'int16u',
|
|
7164
7118
|
PrintConv => q{
|
|
7165
7119
|
return 'Off' if $val == 0 ;
|
|
7166
|
-
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); #something like "Interval 1 of 3"
|
|
7167
|
-
my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; #something like "Frame 1 of 3" or blank
|
|
7120
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); #something like "Interval 1 of 3"
|
|
7121
|
+
my $f = ($$self{IntervalShootingShotsPerInterval}||0) > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0): '' ; #something like "Frame 1 of 3" or blank
|
|
7168
7122
|
return "On: $i$f"
|
|
7169
|
-
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
|
|
7123
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
|
7170
7124
|
},
|
|
7171
7125
|
},
|
|
7172
|
-
|
|
7126
|
+
0x28 => {
|
|
7173
7127
|
Name => 'IntervalFrame',
|
|
7174
7128
|
RawConv => '$$self{IntervalFrame} = $val',
|
|
7175
7129
|
Condition => '$$self{IntervalShooting} > 0',
|
|
7176
7130
|
Format => 'int16u',
|
|
7177
7131
|
Hidden => 1,
|
|
7178
7132
|
},
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
|
|
7182
|
-
|
|
7183
|
-
|
|
7184
|
-
|
|
7185
|
-
|
|
7186
|
-
},
|
|
7187
|
-
0xc21a => {
|
|
7188
|
-
Name => 'RollAngle',
|
|
7189
|
-
Format => 'fixed32u',
|
|
7190
|
-
Notes => 'converted to degrees of clockwise camera roll',
|
|
7191
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7192
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7193
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7194
|
-
PrintConvInv => '$val',
|
|
7195
|
-
},
|
|
7196
|
-
0xc21e => {
|
|
7197
|
-
Name => 'PitchAngle',
|
|
7198
|
-
Format => 'fixed32u',
|
|
7199
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
7200
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7201
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7202
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7203
|
-
PrintConvInv => '$val',
|
|
7204
|
-
},
|
|
7205
|
-
0xc222 => {
|
|
7206
|
-
Name => 'YawAngle',
|
|
7207
|
-
Format => 'fixed32u',
|
|
7208
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
7209
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7210
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7211
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7212
|
-
PrintConvInv => '$val',
|
|
7213
|
-
},
|
|
7214
|
-
### 0xc9c6 - Offset32 start (D6 firmware 1.33)
|
|
7215
|
-
0xc292 => {
|
|
7216
|
-
Name => 'Hook3',
|
|
7217
|
-
Hidden => 1,
|
|
7218
|
-
RawConv => 'undef',
|
|
7219
|
-
# account for variable location of data
|
|
7220
|
-
Hook => '$varSize = $$self{Offset32} - 0xc292',
|
|
7221
|
-
},
|
|
7222
|
-
0xc40e => {
|
|
7133
|
+
);
|
|
7134
|
+
|
|
7135
|
+
%Image::ExifTool::Nikon::IntervalInfoD6 = (
|
|
7136
|
+
%binaryDataAttrs,
|
|
7137
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7138
|
+
DATAMEMBER => [ 0x17c, 0x180, 0x214, 0x22c ],
|
|
7139
|
+
0x17c => {
|
|
7223
7140
|
Name => 'Intervals',
|
|
7224
7141
|
Format => 'int32u',
|
|
7225
7142
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
|
7226
7143
|
Condition => '$$self{IntervalShooting} > 0',
|
|
7227
7144
|
},
|
|
7228
|
-
|
|
7145
|
+
0x180 => {
|
|
7229
7146
|
Name => 'ShotsPerInterval',
|
|
7230
7147
|
Format => 'int32u',
|
|
7231
7148
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
|
7232
7149
|
Condition => '$$self{IntervalShooting} > 0',
|
|
7233
7150
|
},
|
|
7234
|
-
|
|
7151
|
+
0x184 => {
|
|
7235
7152
|
Name => 'IntervalExposureSmoothing',
|
|
7236
7153
|
Condition => '$$self{IntervalShooting} > 0',
|
|
7237
7154
|
Format => 'int8u',
|
|
7238
7155
|
PrintConv => \%offOn,
|
|
7239
7156
|
},
|
|
7240
|
-
|
|
7157
|
+
0x186 => {
|
|
7241
7158
|
Name => 'IntervalPriority',
|
|
7242
7159
|
Condition => '$$self{IntervalShooting} > 0',
|
|
7243
7160
|
Format => 'int8u',
|
|
7244
7161
|
PrintConv => \%offOn,
|
|
7245
7162
|
},
|
|
7246
|
-
|
|
7163
|
+
0x1a8 => {
|
|
7247
7164
|
Name => 'FocusShiftNumberShots',
|
|
7248
7165
|
},
|
|
7249
|
-
|
|
7166
|
+
0x1ac => {
|
|
7250
7167
|
Name => 'FocusShiftStepWidth',
|
|
7251
7168
|
},
|
|
7252
|
-
|
|
7169
|
+
0x1b0 => {
|
|
7253
7170
|
Name => 'FocusShiftInterval',
|
|
7254
7171
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
|
7255
7172
|
},
|
|
7256
|
-
|
|
7173
|
+
0x1b4 => {
|
|
7257
7174
|
Name => 'FocusShiftExposureLock',
|
|
7258
7175
|
PrintConv => \%offOn,
|
|
7259
7176
|
},
|
|
7260
|
-
#
|
|
7261
|
-
|
|
7177
|
+
#0x20a => HighISONoiseReduction
|
|
7178
|
+
0x20e => {
|
|
7262
7179
|
Name => 'DiffractionCompensation',
|
|
7263
7180
|
Format => 'int8u',
|
|
7264
7181
|
PrintConv => \%offOn,
|
|
7265
7182
|
},
|
|
7266
|
-
#
|
|
7267
|
-
|
|
7183
|
+
#0x20f => {Name => 'FlickerReductionShooting',}, #redundant with tag in NikonSettings
|
|
7184
|
+
0x214 => {
|
|
7268
7185
|
Name => 'FlashControlMode', #this and nearby tag values for flash may be set from either the Photo Shooting Menu or using the Flash unit menu
|
|
7269
7186
|
RawConv => '$$self{FlashControlMode} = $val',
|
|
7270
7187
|
PrintConv => {
|
|
@@ -7275,14 +7192,14 @@ my %nikonFocalConversions = (
|
|
|
7275
7192
|
4 => 'Repeating Flash',
|
|
7276
7193
|
},
|
|
7277
7194
|
},
|
|
7278
|
-
|
|
7195
|
+
0x21a => {
|
|
7279
7196
|
Name => 'FlashGNDistance',
|
|
7280
7197
|
Condition => '$$self{FlashControlMode} == 2',
|
|
7281
7198
|
Unknown => 1,
|
|
7282
7199
|
ValueConv => '$val + 3',
|
|
7283
7200
|
PrintConv => \%flashGNDistance,
|
|
7284
7201
|
},
|
|
7285
|
-
|
|
7202
|
+
0x21e => {
|
|
7286
7203
|
Name => 'FlashOutput', #range[0,24] with 0=>Full; 1=>50%; then decreasing flash power in 1/3 stops to 0.39% (1/256 full power). #also found in FlashInfoUnknown at offset 0x0a (with different mappings)
|
|
7287
7204
|
Condition => '$$self{FlashControlMode} >= 3',
|
|
7288
7205
|
Unknown => 1,
|
|
@@ -7291,7 +7208,7 @@ my %nikonFocalConversions = (
|
|
|
7291
7208
|
PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
|
|
7292
7209
|
PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
|
|
7293
7210
|
},
|
|
7294
|
-
|
|
7211
|
+
0x228 => {
|
|
7295
7212
|
Name => 'FlashRemoteControl',
|
|
7296
7213
|
Unknown => 1,
|
|
7297
7214
|
PrintConv => {
|
|
@@ -7300,12 +7217,12 @@ my %nikonFocalConversions = (
|
|
|
7300
7217
|
2 => 'Remote Repeating',
|
|
7301
7218
|
},
|
|
7302
7219
|
},
|
|
7303
|
-
|
|
7220
|
+
0x22c => {
|
|
7304
7221
|
Name => 'FlashMasterControlMode', #tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
|
|
7305
7222
|
RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
|
|
7306
7223
|
PrintConv => \%flashGroupOptionsMode,
|
|
7307
7224
|
},
|
|
7308
|
-
|
|
7225
|
+
0x22e => {
|
|
7309
7226
|
Name => 'FlashMasterCompensation',
|
|
7310
7227
|
Unknown => 1,
|
|
7311
7228
|
Format => 'int8s',
|
|
@@ -7315,7 +7232,7 @@ my %nikonFocalConversions = (
|
|
|
7315
7232
|
PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
|
|
7316
7233
|
PrintConvInv => '$val',
|
|
7317
7234
|
},
|
|
7318
|
-
|
|
7235
|
+
0x232 => {
|
|
7319
7236
|
Name => 'FlashMasterOutput',
|
|
7320
7237
|
Unknown => 1,
|
|
7321
7238
|
Condition => '$$self{FlashGroupOptionsMasterMode} == 1', #only for Mode=M
|
|
@@ -7324,7 +7241,7 @@ my %nikonFocalConversions = (
|
|
|
7324
7241
|
PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
|
|
7325
7242
|
PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
|
|
7326
7243
|
},
|
|
7327
|
-
|
|
7244
|
+
0x234 => {
|
|
7328
7245
|
Name => 'FlashWirelessOption',
|
|
7329
7246
|
Unknown => 1,
|
|
7330
7247
|
PrintConv => {
|
|
@@ -7332,7 +7249,7 @@ my %nikonFocalConversions = (
|
|
|
7332
7249
|
1 => 'Off',
|
|
7333
7250
|
},
|
|
7334
7251
|
},
|
|
7335
|
-
|
|
7252
|
+
0x2ca => {
|
|
7336
7253
|
Name => 'MovieType',
|
|
7337
7254
|
Unknown => 1,
|
|
7338
7255
|
PrintConv => {
|
|
@@ -7340,13 +7257,12 @@ my %nikonFocalConversions = (
|
|
|
7340
7257
|
1 => 'MP4',
|
|
7341
7258
|
},
|
|
7342
7259
|
},
|
|
7343
|
-
# note: DecryptLen currently set to 0xc9c6 + 720
|
|
7344
7260
|
);
|
|
7345
7261
|
|
|
7346
7262
|
# shot information for the D610 firmware 1.00 (encrypted) - ref PH
|
|
7347
7263
|
%Image::ExifTool::Nikon::ShotInfoD610 = (
|
|
7348
|
-
PROCESS_PROC => \&
|
|
7349
|
-
WRITE_PROC => \&
|
|
7264
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7265
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7350
7266
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7351
7267
|
VARS => { ID_LABEL => 'Index' },
|
|
7352
7268
|
IS_SUBDIR => [ 0x07cf ],
|
|
@@ -7371,25 +7287,19 @@ my %nikonFocalConversions = (
|
|
|
7371
7287
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD610',
|
|
7372
7288
|
},
|
|
7373
7289
|
},
|
|
7374
|
-
# note: DecryptLen currently set to 0x7ff
|
|
7375
7290
|
);
|
|
7376
7291
|
|
|
7377
7292
|
# shot information for the D810 firmware 1.00(PH)/1.01 (encrypted) - ref 28
|
|
7378
7293
|
%Image::ExifTool::Nikon::ShotInfoD810 = (
|
|
7379
|
-
PROCESS_PROC => \&
|
|
7380
|
-
WRITE_PROC => \&
|
|
7294
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7295
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7381
7296
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7382
|
-
VARS => { ID_LABEL => 'Index' },
|
|
7383
|
-
DATAMEMBER => [ 0x04
|
|
7384
|
-
IS_SUBDIR => [
|
|
7297
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
|
7298
|
+
DATAMEMBER => [ 0x04 ],
|
|
7299
|
+
IS_SUBDIR => [ 0x10, 0x24, 0x38, 0x40, 0x84 ],
|
|
7385
7300
|
WRITABLE => 1,
|
|
7386
|
-
FIRST_ENTRY => 0,
|
|
7387
7301
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7388
|
-
NOTES =>
|
|
7389
|
-
These tags are extracted from encrypted data in images from the D810. Note
|
|
7390
|
-
that the indices listed below are for firmware version 1.0, but they may be
|
|
7391
|
-
different for other firmware versions.
|
|
7392
|
-
},
|
|
7302
|
+
NOTES => 'These tags are extracted from encrypted data in images from the D810.',
|
|
7393
7303
|
0x00 => {
|
|
7394
7304
|
Name => 'ShotInfoVersion',
|
|
7395
7305
|
Format => 'string[4]',
|
|
@@ -7404,39 +7314,64 @@ my %nikonFocalConversions = (
|
|
|
7404
7314
|
},
|
|
7405
7315
|
# 0x0c - number of entries in offset table (= 0x21)
|
|
7406
7316
|
# 0x10 - int32u[val 0x0c]: offset table
|
|
7317
|
+
0x10 => {
|
|
7318
|
+
Name => 'SettingsOffset',
|
|
7319
|
+
Format => 'int32u',
|
|
7320
|
+
SubDirectory => {
|
|
7321
|
+
TagTable => 'Image::ExifTool::Nikon::SettingsInfoD810',
|
|
7322
|
+
Start => '$val',
|
|
7323
|
+
},
|
|
7324
|
+
},
|
|
7407
7325
|
0x24 => {
|
|
7408
7326
|
Name => 'BracketingOffset',
|
|
7409
|
-
DataMember => 'BracketingOffset',
|
|
7410
7327
|
Format => 'int32u',
|
|
7411
|
-
|
|
7412
|
-
|
|
7413
|
-
|
|
7328
|
+
SubDirectory => {
|
|
7329
|
+
TagTable => 'Image::ExifTool::Nikon::BracketingInfoD810',
|
|
7330
|
+
Start => '$val',
|
|
7331
|
+
},
|
|
7414
7332
|
},
|
|
7415
7333
|
0x38 => {
|
|
7416
7334
|
Name => 'ISOAutoOffset',
|
|
7417
|
-
DataMember => 'ISOAutoOffset',
|
|
7418
7335
|
Format => 'int32u',
|
|
7419
|
-
|
|
7420
|
-
|
|
7421
|
-
|
|
7336
|
+
SubDirectory => {
|
|
7337
|
+
TagTable => 'Image::ExifTool::Nikon::ISOAutoInfoD810',
|
|
7338
|
+
Start => '$val',
|
|
7339
|
+
},
|
|
7422
7340
|
},
|
|
7423
7341
|
0x40 => {
|
|
7424
7342
|
Name => 'CustomSettingsOffset', # (relative offset from start of ShotInfo data)
|
|
7425
|
-
DataMember => 'CustomSettingsOffset',
|
|
7426
7343
|
Format => 'int32u',
|
|
7427
|
-
|
|
7428
|
-
|
|
7429
|
-
|
|
7344
|
+
SubDirectory => {
|
|
7345
|
+
TagTable => 'Image::ExifTool::NikonCustom::SettingsD810',
|
|
7346
|
+
Start => '$val',
|
|
7347
|
+
},
|
|
7430
7348
|
},
|
|
7431
7349
|
0x84 => {
|
|
7432
7350
|
Name => 'OrientationOffset',
|
|
7433
|
-
DataMember => 'OrientationOffset',
|
|
7434
7351
|
Format => 'int32u',
|
|
7435
|
-
|
|
7436
|
-
|
|
7437
|
-
|
|
7352
|
+
SubDirectory => {
|
|
7353
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
7354
|
+
Start => '$val',
|
|
7355
|
+
}
|
|
7438
7356
|
},
|
|
7439
|
-
|
|
7357
|
+
# (moves around too much and doesn't fit cleanly in the offset table)
|
|
7358
|
+
#0x38be => {
|
|
7359
|
+
# Name => 'Rotation',
|
|
7360
|
+
# Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
|
|
7361
|
+
# Mask => 0x30,
|
|
7362
|
+
# PrintConv => {
|
|
7363
|
+
# 0 => 'Horizontal',
|
|
7364
|
+
# 1 => 'Rotate 270 CW',
|
|
7365
|
+
# 2 => 'Rotate 90 CW',
|
|
7366
|
+
# 3 => 'Rotate 180',
|
|
7367
|
+
# },
|
|
7368
|
+
#},
|
|
7369
|
+
);
|
|
7370
|
+
|
|
7371
|
+
%Image::ExifTool::Nikon::SettingsInfoD810 = (
|
|
7372
|
+
%binaryDataAttrs,
|
|
7373
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7374
|
+
0x13c => {
|
|
7440
7375
|
Name => 'SecondarySlotFunction',
|
|
7441
7376
|
Mask => 0x03,
|
|
7442
7377
|
PrintConv => {
|
|
@@ -7444,9 +7379,13 @@ my %nikonFocalConversions = (
|
|
|
7444
7379
|
2 => 'Backup',
|
|
7445
7380
|
3 => 'NEF Primary + JPG Secondary',
|
|
7446
7381
|
},
|
|
7447
|
-
Hook => '$varSize = $$self{BracketingOffset} - 0x1747',
|
|
7448
7382
|
},
|
|
7449
|
-
|
|
7383
|
+
);
|
|
7384
|
+
|
|
7385
|
+
%Image::ExifTool::Nikon::BracketingInfoD810 = (
|
|
7386
|
+
%binaryDataAttrs,
|
|
7387
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7388
|
+
0x0f => {
|
|
7450
7389
|
Name => 'AEBracketingSteps',
|
|
7451
7390
|
Mask => 0xff,
|
|
7452
7391
|
PrintHex => 1,
|
|
@@ -7503,7 +7442,7 @@ my %nikonFocalConversions = (
|
|
|
7503
7442
|
0xd6 => '5F3',
|
|
7504
7443
|
},
|
|
7505
7444
|
},
|
|
7506
|
-
|
|
7445
|
+
0x10 => {
|
|
7507
7446
|
Name => 'WBBracketingSteps',
|
|
7508
7447
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
|
7509
7448
|
Mask => 0xff,
|
|
@@ -7546,7 +7485,7 @@ my %nikonFocalConversions = (
|
|
|
7546
7485
|
0x28 => '9F 3',
|
|
7547
7486
|
},
|
|
7548
7487
|
},
|
|
7549
|
-
|
|
7488
|
+
0x17 => {
|
|
7550
7489
|
Name => 'NikonMeteringMode',
|
|
7551
7490
|
Mask => 0x03,
|
|
7552
7491
|
PrintConv => {
|
|
@@ -7555,9 +7494,13 @@ my %nikonFocalConversions = (
|
|
|
7555
7494
|
2 => 'Spot',
|
|
7556
7495
|
3 => 'Highlight'
|
|
7557
7496
|
},
|
|
7558
|
-
Hook => '$varSize = $$self{ISOAutoOffset} - 0x1858',
|
|
7559
7497
|
},
|
|
7560
|
-
|
|
7498
|
+
);
|
|
7499
|
+
|
|
7500
|
+
%Image::ExifTool::Nikon::ISOAutoInfoD810 = (
|
|
7501
|
+
%binaryDataAttrs,
|
|
7502
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7503
|
+
0x04 => {
|
|
7561
7504
|
Name => 'ISOAutoShutterTime',
|
|
7562
7505
|
Mask => 0x3f,
|
|
7563
7506
|
PrintConv => {
|
|
@@ -7600,7 +7543,7 @@ my %nikonFocalConversions = (
|
|
|
7600
7543
|
36 => 'Auto (Fastest)',
|
|
7601
7544
|
},
|
|
7602
7545
|
},
|
|
7603
|
-
|
|
7546
|
+
0x05 => {
|
|
7604
7547
|
Name => 'ISOAutoHiLimit',
|
|
7605
7548
|
Mask => 0xff,
|
|
7606
7549
|
PrintHex => 1,
|
|
@@ -7647,69 +7590,18 @@ my %nikonFocalConversions = (
|
|
|
7647
7590
|
0x6c => 'ISO Hi 4.0',
|
|
7648
7591
|
0x72 => 'ISO Hi 5.0',
|
|
7649
7592
|
},
|
|
7650
|
-
Hook => '$varSize = $$self{CustomSettingsOffset} - 0x18ab',
|
|
7651
7593
|
},
|
|
7652
|
-
0x18ab => { # (actual offset adjusted by Hook above)
|
|
7653
|
-
Name => 'CustomSettingsD810',
|
|
7654
|
-
Format => 'undef[53]',
|
|
7655
|
-
SubDirectory => {
|
|
7656
|
-
TagTable => 'Image::ExifTool::NikonCustom::SettingsD810',
|
|
7657
|
-
},
|
|
7658
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0x36f4',
|
|
7659
|
-
},
|
|
7660
|
-
0x36f4 => {
|
|
7661
|
-
Name => 'RollAngle',
|
|
7662
|
-
Format => 'fixed32u',
|
|
7663
|
-
Notes => 'converted to degrees of clockwise camera roll',
|
|
7664
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7665
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7666
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7667
|
-
PrintConvInv => '$val',
|
|
7668
|
-
},
|
|
7669
|
-
0x36f8 => {
|
|
7670
|
-
Name => 'PitchAngle',
|
|
7671
|
-
Format => 'fixed32u',
|
|
7672
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
7673
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7674
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7675
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7676
|
-
PrintConvInv => '$val',
|
|
7677
|
-
},
|
|
7678
|
-
0x36fc => {
|
|
7679
|
-
Name => 'YawAngle',
|
|
7680
|
-
Format => 'fixed32u',
|
|
7681
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
7682
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7683
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7684
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7685
|
-
PrintConvInv => '$val',
|
|
7686
|
-
},
|
|
7687
|
-
# note: DecryptLen currently set to OrientationOffset + 12
|
|
7688
|
-
|
|
7689
|
-
# (moves around too much and doesn't fit cleanly in the offset table)
|
|
7690
|
-
#0x38be => {
|
|
7691
|
-
# Name => 'Rotation',
|
|
7692
|
-
# Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
|
|
7693
|
-
# Mask => 0x30,
|
|
7694
|
-
# PrintConv => {
|
|
7695
|
-
# 0 => 'Horizontal',
|
|
7696
|
-
# 1 => 'Rotate 270 CW',
|
|
7697
|
-
# 2 => 'Rotate 90 CW',
|
|
7698
|
-
# 3 => 'Rotate 180',
|
|
7699
|
-
# },
|
|
7700
|
-
#},
|
|
7701
7594
|
);
|
|
7702
7595
|
|
|
7703
7596
|
# shot information for the D850 firmware 1.00b (encrypted) - ref 28
|
|
7704
7597
|
%Image::ExifTool::Nikon::ShotInfoD850 = (
|
|
7705
|
-
PROCESS_PROC => \&
|
|
7706
|
-
WRITE_PROC => \&
|
|
7598
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7599
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7707
7600
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7708
|
-
VARS => { ID_LABEL => 'Index' },
|
|
7709
|
-
DATAMEMBER => [ 0x04
|
|
7710
|
-
IS_SUBDIR => [
|
|
7601
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
|
7602
|
+
DATAMEMBER => [ 0x04 ],
|
|
7603
|
+
IS_SUBDIR => [ 0x10, 0x4c, 0x58, 0xa0 ],
|
|
7711
7604
|
WRITABLE => 1,
|
|
7712
|
-
FIRST_ENTRY => 0,
|
|
7713
7605
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7714
7606
|
NOTES => 'These tags are extracted from encrypted data in images from the D850.',
|
|
7715
7607
|
0x00 => {
|
|
@@ -7724,23 +7616,44 @@ my %nikonFocalConversions = (
|
|
|
7724
7616
|
Writable => 0,
|
|
7725
7617
|
RawConv => '$$self{FirmwareVersion} = $val',
|
|
7726
7618
|
},
|
|
7619
|
+
0x10 => {
|
|
7620
|
+
Name => 'MenuSettingsOffset',
|
|
7621
|
+
Format => 'int32u',
|
|
7622
|
+
SubDirectory => {
|
|
7623
|
+
TagTable => 'Image::ExifTool::Nikon::MenuSettingsD850',
|
|
7624
|
+
Start => '$val',
|
|
7625
|
+
},
|
|
7626
|
+
},
|
|
7627
|
+
0x4c => {
|
|
7628
|
+
Name => 'MoreSettingsOffset',
|
|
7629
|
+
Format => 'int32u',
|
|
7630
|
+
SubDirectory => {
|
|
7631
|
+
TagTable => 'Image::ExifTool::Nikon::MoreSettingsD850',
|
|
7632
|
+
Start => '$val',
|
|
7633
|
+
},
|
|
7634
|
+
},
|
|
7727
7635
|
0x58 => {
|
|
7728
|
-
Name => 'CustomSettingsOffset',
|
|
7729
|
-
DataMember => 'CustomSettingsOffset',
|
|
7636
|
+
Name => 'CustomSettingsOffset',
|
|
7730
7637
|
Format => 'int32u',
|
|
7731
|
-
|
|
7732
|
-
|
|
7733
|
-
|
|
7638
|
+
SubDirectory => {
|
|
7639
|
+
TagTable => 'Image::ExifTool::NikonCustom::SettingsD850',
|
|
7640
|
+
Start => '$val',
|
|
7641
|
+
},
|
|
7734
7642
|
},
|
|
7735
7643
|
0xa0 => {
|
|
7736
7644
|
Name => 'OrientationOffset',
|
|
7737
|
-
DataMember => 'OrientationOffset',
|
|
7738
7645
|
Format => 'int32u',
|
|
7739
|
-
|
|
7740
|
-
|
|
7741
|
-
|
|
7646
|
+
SubDirectory => {
|
|
7647
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
7648
|
+
Start => '$val',
|
|
7649
|
+
},
|
|
7742
7650
|
},
|
|
7743
|
-
|
|
7651
|
+
);
|
|
7652
|
+
|
|
7653
|
+
%Image::ExifTool::Nikon::MenuSettingsD850 = (
|
|
7654
|
+
%binaryDataAttrs,
|
|
7655
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7656
|
+
0x06dd => {
|
|
7744
7657
|
Name => 'PhotoShootingMenuBankImageArea',
|
|
7745
7658
|
Mask => 0x07,
|
|
7746
7659
|
PrintConv => {
|
|
@@ -7751,7 +7664,12 @@ my %nikonFocalConversions = (
|
|
|
7751
7664
|
4 => '1:1 (24x24)',
|
|
7752
7665
|
},
|
|
7753
7666
|
},
|
|
7754
|
-
|
|
7667
|
+
);
|
|
7668
|
+
|
|
7669
|
+
%Image::ExifTool::Nikon::MoreSettingsD850 = (
|
|
7670
|
+
%binaryDataAttrs,
|
|
7671
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
7672
|
+
0x24 => {
|
|
7755
7673
|
Name => 'PhotoShootingMenuBank',
|
|
7756
7674
|
Condition => '$$self{FILE_TYPE} eq "JPEG"',
|
|
7757
7675
|
Notes => 'valid for JPEG images only',
|
|
@@ -7763,63 +7681,20 @@ my %nikonFocalConversions = (
|
|
|
7763
7681
|
3 => 'D',
|
|
7764
7682
|
},
|
|
7765
7683
|
},
|
|
7766
|
-
|
|
7684
|
+
0x25 => {
|
|
7767
7685
|
Name => 'PrimarySlot',
|
|
7768
7686
|
Mask => 0x80,
|
|
7769
7687
|
PrintConv => {
|
|
7770
7688
|
0 => 'XQD Card',
|
|
7771
7689
|
1 => 'SD Card',
|
|
7772
7690
|
},
|
|
7773
|
-
Hook => '$varSize = $$self{CustomSettingsOffset} - 0x1038',
|
|
7774
|
-
},
|
|
7775
|
-
0x1038 => {
|
|
7776
|
-
Name => 'CustomSettingsD850',
|
|
7777
|
-
Format => 'undef[90]',
|
|
7778
|
-
SubDirectory => {
|
|
7779
|
-
TagTable => 'Image::ExifTool::NikonCustom::SettingsD850',
|
|
7780
|
-
},
|
|
7781
|
-
},
|
|
7782
|
-
### 0x2efb - OrientationInfo start (D850 firmware 1.01a)
|
|
7783
|
-
0x2efa => {
|
|
7784
|
-
Name => 'Hook1',
|
|
7785
|
-
Hidden => 1,
|
|
7786
|
-
RawConv => 'undef',
|
|
7787
|
-
# account for variable location of OrientationInfo data
|
|
7788
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0x2efb',
|
|
7789
|
-
},
|
|
7790
|
-
0x2efb => { #28
|
|
7791
|
-
Name => 'RollAngle',
|
|
7792
|
-
Format => 'fixed32u',
|
|
7793
|
-
Notes => 'converted to degrees of clockwise camera roll',
|
|
7794
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7795
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7796
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7797
|
-
PrintConvInv => '$val',
|
|
7798
7691
|
},
|
|
7799
|
-
0x2eff => { #28
|
|
7800
|
-
Name => 'PitchAngle',
|
|
7801
|
-
Format => 'fixed32u',
|
|
7802
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
7803
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7804
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7805
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7806
|
-
PrintConvInv => '$val',
|
|
7807
|
-
},
|
|
7808
|
-
0x2f03 => { #28
|
|
7809
|
-
Name => 'YawAngle',
|
|
7810
|
-
Format => 'fixed32u',
|
|
7811
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
7812
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
7813
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
7814
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
7815
|
-
PrintConvInv => '$val',
|
|
7816
|
-
},
|
|
7817
|
-
# note: DecryptLen currently set to 0x2f07
|
|
7818
7692
|
);
|
|
7693
|
+
|
|
7819
7694
|
# shot information for the D4 firmware 1.00g (ref PH)
|
|
7820
7695
|
%Image::ExifTool::Nikon::ShotInfoD4 = (
|
|
7821
|
-
PROCESS_PROC => \&
|
|
7822
|
-
WRITE_PROC => \&
|
|
7696
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7697
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7823
7698
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7824
7699
|
VARS => { ID_LABEL => 'Index' },
|
|
7825
7700
|
IS_SUBDIR => [ 0x0751 ],
|
|
@@ -7845,17 +7720,16 @@ my %nikonFocalConversions = (
|
|
|
7845
7720
|
Format => 'undef[56]',
|
|
7846
7721
|
SubDirectory => { TagTable => 'Image::ExifTool::NikonCustom::SettingsD4' },
|
|
7847
7722
|
},
|
|
7848
|
-
# note: DecryptLen currently set to 0x789
|
|
7849
7723
|
);
|
|
7850
7724
|
|
|
7851
7725
|
# shot information for the D4S firmware 1.01a (ref 28, encrypted)
|
|
7852
7726
|
%Image::ExifTool::Nikon::ShotInfoD4S = (
|
|
7853
|
-
PROCESS_PROC => \&
|
|
7854
|
-
WRITE_PROC => \&
|
|
7727
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
7728
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
7855
7729
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
7856
7730
|
VARS => { ID_LABEL => 'Index' },
|
|
7857
7731
|
DATAMEMBER => [ 4 ],
|
|
7858
|
-
IS_SUBDIR => [ 0x189d, 0x193d ],
|
|
7732
|
+
IS_SUBDIR => [ 0x189d, 0x193d, 0x350b ],
|
|
7859
7733
|
WRITABLE => 1,
|
|
7860
7734
|
FIRST_ENTRY => 0,
|
|
7861
7735
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
@@ -8119,31 +7993,13 @@ my %nikonFocalConversions = (
|
|
|
8119
7993
|
# },
|
|
8120
7994
|
# },
|
|
8121
7995
|
0x350b => {
|
|
8122
|
-
Name => '
|
|
8123
|
-
Format => '
|
|
8124
|
-
|
|
8125
|
-
|
|
8126
|
-
|
|
8127
|
-
|
|
8128
|
-
|
|
8129
|
-
},
|
|
8130
|
-
0x350f => {
|
|
8131
|
-
Name => 'PitchAngle',
|
|
8132
|
-
Format => 'fixed32u',
|
|
8133
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
8134
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
8135
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
8136
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
8137
|
-
PrintConvInv => '$val',
|
|
8138
|
-
},
|
|
8139
|
-
0x3513 => {
|
|
8140
|
-
Name => 'YawAngle',
|
|
8141
|
-
Format => 'fixed32u',
|
|
8142
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
8143
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
8144
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
8145
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
8146
|
-
PrintConvInv => '$val',
|
|
7996
|
+
Name => 'OrientationInfo',
|
|
7997
|
+
Format => 'undef[12]',
|
|
7998
|
+
SubDirectory => {
|
|
7999
|
+
# Note: pitch angle may be wrong sign for this model?
|
|
8000
|
+
# (pitch sign was changed without verification to use same decoding as other models)
|
|
8001
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
8002
|
+
},
|
|
8147
8003
|
},
|
|
8148
8004
|
0x3693 => {
|
|
8149
8005
|
Name => 'Rotation',
|
|
@@ -8155,20 +8011,17 @@ my %nikonFocalConversions = (
|
|
|
8155
8011
|
3 => 'Rotate 180',
|
|
8156
8012
|
},
|
|
8157
8013
|
},
|
|
8158
|
-
# note: DecryptLen currently set to 0x3697
|
|
8159
8014
|
);
|
|
8160
8015
|
|
|
8161
8016
|
# shot information for the Z7II firmware 1.00 (encrypted) - ref 28
|
|
8162
8017
|
%Image::ExifTool::Nikon::ShotInfoZ7II = (
|
|
8163
|
-
PROCESS_PROC => \&
|
|
8164
|
-
WRITE_PROC => \&
|
|
8018
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
8019
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
8165
8020
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
8166
|
-
VARS => { ID_LABEL => 'Index' },
|
|
8167
|
-
DATAMEMBER => [ 0x04
|
|
8168
|
-
|
|
8169
|
-
IS_SUBDIR => [ 0xceb8 ],
|
|
8021
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
|
8022
|
+
DATAMEMBER => [ 0x04 ],
|
|
8023
|
+
IS_SUBDIR => [ 0x30, 0x38, 0x98, 0xa0 ],
|
|
8170
8024
|
WRITABLE => 1,
|
|
8171
|
-
FIRST_ENTRY => 0,
|
|
8172
8025
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8173
8026
|
NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
|
|
8174
8027
|
0x00 => {
|
|
@@ -8197,79 +8050,73 @@ my %nikonFocalConversions = (
|
|
|
8197
8050
|
},
|
|
8198
8051
|
0x24 => {
|
|
8199
8052
|
Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
|
|
8200
|
-
DataMember => 'NumberOffsets',
|
|
8201
8053
|
Format => 'int32u',
|
|
8202
8054
|
Writable => 0,
|
|
8203
8055
|
Hidden => 1,
|
|
8204
8056
|
},
|
|
8205
8057
|
0x30 => {
|
|
8206
|
-
Name => '
|
|
8207
|
-
DataMember => 'Offset3',
|
|
8058
|
+
Name => 'IntervalOffset',
|
|
8208
8059
|
Format => 'int32u',
|
|
8209
|
-
|
|
8210
|
-
|
|
8211
|
-
|
|
8060
|
+
SubDirectory => {
|
|
8061
|
+
TagTable => 'Image::ExifTool::Nikon::IntervalInfoZ7II',
|
|
8062
|
+
Start => '$val',
|
|
8063
|
+
}
|
|
8212
8064
|
},
|
|
8213
8065
|
0x38 => {
|
|
8214
|
-
Name => '
|
|
8215
|
-
DataMember => 'Offset5',
|
|
8066
|
+
Name => 'PortraitOffset',
|
|
8216
8067
|
Format => 'int32u',
|
|
8217
|
-
|
|
8218
|
-
|
|
8219
|
-
|
|
8068
|
+
SubDirectory => {
|
|
8069
|
+
TagTable => 'Image::ExifTool::Nikon::PortraitInfoZ7II',
|
|
8070
|
+
Start => '$val',
|
|
8071
|
+
}
|
|
8220
8072
|
},
|
|
8221
8073
|
0x98 => {
|
|
8222
8074
|
Name => 'OrientationOffset',
|
|
8223
|
-
DataMember => 'OrientationOffset',
|
|
8224
8075
|
Format => 'int32u',
|
|
8225
|
-
|
|
8226
|
-
|
|
8227
|
-
|
|
8076
|
+
SubDirectory => {
|
|
8077
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
8078
|
+
Start => '$val',
|
|
8079
|
+
}
|
|
8228
8080
|
},
|
|
8229
8081
|
0xa0 => {
|
|
8230
|
-
Name => '
|
|
8231
|
-
DataMember => 'Offset31',
|
|
8082
|
+
Name => 'MenuOffset',
|
|
8232
8083
|
Format => 'int32u',
|
|
8233
|
-
|
|
8234
|
-
|
|
8235
|
-
|
|
8236
|
-
|
|
8237
|
-
### 0x75e8 - Offset3 info start (Z7II firmware 1.30)
|
|
8238
|
-
0x75e7 => {
|
|
8239
|
-
Name => 'Hook1',
|
|
8240
|
-
Hidden => 1,
|
|
8241
|
-
RawConv => 'undef',
|
|
8242
|
-
# account for variable location of Offset3 data
|
|
8243
|
-
Hook => '$varSize = $$self{Offset3} - 0x75e8',
|
|
8084
|
+
SubDirectory => {
|
|
8085
|
+
TagTable => 'Image::ExifTool::Nikon::MenuInfoZ7II',
|
|
8086
|
+
Start => '$val',
|
|
8087
|
+
},
|
|
8244
8088
|
},
|
|
8245
|
-
|
|
8089
|
+
);
|
|
8090
|
+
|
|
8091
|
+
%Image::ExifTool::Nikon::IntervalInfoZ7II = (
|
|
8092
|
+
%binaryDataAttrs,
|
|
8093
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8094
|
+
DATAMEMBER => [ 0x24, 0x28 ],
|
|
8095
|
+
0x24 => {
|
|
8246
8096
|
Name => 'IntervalShooting',
|
|
8247
8097
|
RawConv => '$$self{IntervalShooting} = $val',
|
|
8248
8098
|
Format => 'int16u',
|
|
8249
8099
|
PrintConv => q{
|
|
8250
8100
|
return 'Off' if $val == 0 ;
|
|
8251
|
-
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
|
|
8252
|
-
my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
|
|
8101
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); # something like "Interval 1 of 3"
|
|
8102
|
+
my $f = ($$self{IntervalShootingShotsPerInterval}||0) > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0): '' ; # something like "Frame 1 of 3" or blank
|
|
8253
8103
|
return "On: $i$f"
|
|
8254
|
-
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
|
|
8104
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
|
8255
8105
|
},
|
|
8256
8106
|
},
|
|
8257
|
-
|
|
8107
|
+
0x28 => {
|
|
8258
8108
|
Name => 'IntervalFrame',
|
|
8259
8109
|
RawConv => '$$self{IntervalFrame} = $val',
|
|
8260
8110
|
Condition => '$$self{IntervalShooting} > 0',
|
|
8261
8111
|
Format => 'int16u',
|
|
8262
8112
|
Hidden => 1,
|
|
8263
8113
|
},
|
|
8264
|
-
|
|
8265
|
-
|
|
8266
|
-
|
|
8267
|
-
|
|
8268
|
-
|
|
8269
|
-
|
|
8270
|
-
Hook => '$varSize = $$self{Offset5} - 0x7f00',
|
|
8271
|
-
},
|
|
8272
|
-
0x7fa0 => { #28
|
|
8114
|
+
);
|
|
8115
|
+
|
|
8116
|
+
%Image::ExifTool::Nikon::PortraitInfoZ7II = (
|
|
8117
|
+
%binaryDataAttrs,
|
|
8118
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8119
|
+
0xa0 => { #28
|
|
8273
8120
|
Name => 'PortraitImpressionBalance', # will be 0 for firmware 1.21 and earlier; firmware 1.30 onward: will be set by Photo Shooting Menu entry Portrait Impression Balance
|
|
8274
8121
|
# offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera
|
|
8275
8122
|
# offset5+161 128 is neutral; >128 increases Brightness; <128 decreases Brightness
|
|
@@ -8285,83 +8132,31 @@ my %nikonFocalConversions = (
|
|
|
8285
8132
|
return "$color $brightness"
|
|
8286
8133
|
},
|
|
8287
8134
|
},
|
|
8288
|
-
|
|
8289
|
-
0xce31 => {
|
|
8290
|
-
Name => 'Hook3',
|
|
8291
|
-
Hidden => 1,
|
|
8292
|
-
RawConv => 'undef',
|
|
8293
|
-
# account for variable location of OrientationInfo data
|
|
8294
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0xce32',
|
|
8295
|
-
},
|
|
8135
|
+
);
|
|
8296
8136
|
|
|
8297
|
-
|
|
8298
|
-
|
|
8299
|
-
|
|
8300
|
-
|
|
8301
|
-
|
|
8302
|
-
|
|
8303
|
-
|
|
8304
|
-
PrintConvInv => '$val',
|
|
8305
|
-
},
|
|
8306
|
-
0xce36 => {
|
|
8307
|
-
Name => 'PitchAngle',
|
|
8308
|
-
Format => 'fixed32u',
|
|
8309
|
-
Notes => 'converted to degrees of upward camera tilt',
|
|
8310
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
8311
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
8312
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
8313
|
-
PrintConvInv => '$val',
|
|
8314
|
-
},
|
|
8315
|
-
0xce3a => {
|
|
8316
|
-
Name => 'YawAngle',
|
|
8317
|
-
Format => 'fixed32u',
|
|
8318
|
-
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
8319
|
-
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
8320
|
-
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
8321
|
-
PrintConv => 'sprintf("%.1f", $val)',
|
|
8322
|
-
PrintConvInv => '$val',
|
|
8323
|
-
},
|
|
8324
|
-
0xcea5 => {
|
|
8325
|
-
Name => 'Hook4',
|
|
8326
|
-
Hidden => 1,
|
|
8327
|
-
RawConv => 'undef',
|
|
8328
|
-
# account for variable location of Offset31 data
|
|
8329
|
-
Hook => '$varSize = $$self{Offset31} - 0xcea6',
|
|
8330
|
-
},
|
|
8331
|
-
### 0xcea6 - Offset31 info start (Z7II firmware 1.30)
|
|
8332
|
-
0xceb6 => {
|
|
8333
|
-
Name => 'MenuSettingsZ7IIOffset',
|
|
8334
|
-
# offset to MenuSettingsZ7II is relative to start of Offset31 block
|
|
8335
|
-
RawConv => '$$self{MenuSettingsZ7IIOffset} = ($val || 0x10000000) + $$self{Offset31}; undef', # (ignore if 0)
|
|
8336
|
-
},
|
|
8337
|
-
0xceb7 => {
|
|
8338
|
-
Name => 'Hook5',
|
|
8339
|
-
Hidden => 1,
|
|
8340
|
-
RawConv => 'undef',
|
|
8341
|
-
# account for variable location of Offset5 data
|
|
8342
|
-
Hook => '$varSize = $$self{MenuSettingsZ7IIOffset} - 0xceb8',
|
|
8343
|
-
},
|
|
8344
|
-
0xceb8 => { # (this is 0xd04e for the Z50)
|
|
8345
|
-
Name => 'MenuSettingsZ7II',
|
|
8346
|
-
Format => 'undef[860]',
|
|
8137
|
+
%Image::ExifTool::Nikon::MenuInfoZ7II = (
|
|
8138
|
+
%binaryDataAttrs,
|
|
8139
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8140
|
+
IS_SUBDIR => [ 0x10 ],
|
|
8141
|
+
0x10 => {
|
|
8142
|
+
Name => 'MenuSettingsOffsetZ7II',
|
|
8143
|
+
Format => 'int32u',
|
|
8347
8144
|
SubDirectory => {
|
|
8348
8145
|
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II',
|
|
8146
|
+
Start => '$dirStart + $val',
|
|
8349
8147
|
},
|
|
8350
|
-
}
|
|
8351
|
-
# note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e)
|
|
8148
|
+
},
|
|
8352
8149
|
);
|
|
8353
8150
|
|
|
8354
8151
|
# shot information for the Z9 firmware 1.00 (encrypted) - ref 28
|
|
8355
8152
|
%Image::ExifTool::Nikon::ShotInfoZ9 = (
|
|
8356
|
-
PROCESS_PROC => \&
|
|
8357
|
-
WRITE_PROC => \&
|
|
8153
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
|
8154
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
|
8358
8155
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
|
8359
|
-
VARS => { ID_LABEL => 'Index' },
|
|
8360
|
-
DATAMEMBER => [ 0x04
|
|
8361
|
-
|
|
8362
|
-
IS_SUBDIR => [ 0x44ec, 0x8225 ],
|
|
8156
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
|
8157
|
+
DATAMEMBER => [ 0x04 ],
|
|
8158
|
+
IS_SUBDIR => [ 0x30, 0x58, 0x84, 0x8c ],
|
|
8363
8159
|
WRITABLE => 1,
|
|
8364
|
-
FIRST_ENTRY => 0,
|
|
8365
8160
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8366
8161
|
NOTES => 'These tags are extracted from encrypted data in images from the Z9.',
|
|
8367
8162
|
0x00 => {
|
|
@@ -8390,47 +8185,55 @@ my %nikonFocalConversions = (
|
|
|
8390
8185
|
},
|
|
8391
8186
|
0x24 => {
|
|
8392
8187
|
Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
|
|
8393
|
-
DataMember => 'NumberOffsets',
|
|
8394
8188
|
Format => 'int32u',
|
|
8395
8189
|
Writable => 0,
|
|
8396
8190
|
Hidden => 1,
|
|
8397
8191
|
},
|
|
8192
|
+
# subdirectories, referenced by offsets (not processed if offset is zero)
|
|
8398
8193
|
0x30 => {
|
|
8399
|
-
Name => 'SequenceOffset',
|
|
8400
|
-
DataMember => 'SequenceOffset',
|
|
8194
|
+
Name => 'SequenceOffset',
|
|
8401
8195
|
Format => 'int32u',
|
|
8402
|
-
|
|
8403
|
-
|
|
8404
|
-
|
|
8196
|
+
SubDirectory => {
|
|
8197
|
+
TagTable => 'Image::ExifTool::Nikon::SeqInfoZ9',
|
|
8198
|
+
Start => '$val',
|
|
8199
|
+
},
|
|
8200
|
+
},
|
|
8201
|
+
0x58 => {
|
|
8202
|
+
Name => 'Offset13', #offset13 - length x'8f80 (Z9 firmware 3.01 NEF), using currently for a few foucs related tags. Might be premature to give the offset a more meaningful name at this point.
|
|
8203
|
+
Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "03.01"',
|
|
8204
|
+
Format => 'int32u',
|
|
8205
|
+
SubDirectory => {
|
|
8206
|
+
TagTable => 'Image::ExifTool::Nikon::Offset13InfoZ9',
|
|
8207
|
+
Start => '$val',
|
|
8208
|
+
},
|
|
8405
8209
|
},
|
|
8406
8210
|
0x84 => {
|
|
8407
|
-
Name => '
|
|
8408
|
-
|
|
8211
|
+
Name => 'OrientOffset',
|
|
8212
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8409
8213
|
Format => 'int32u',
|
|
8410
|
-
|
|
8411
|
-
|
|
8412
|
-
|
|
8214
|
+
SubDirectory => {
|
|
8215
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
|
8216
|
+
Start => '$val',
|
|
8217
|
+
},
|
|
8413
8218
|
},
|
|
8414
8219
|
0x8c => {
|
|
8415
|
-
Name => 'MenuOffset',
|
|
8416
|
-
DataMember => 'MenuOffset6',
|
|
8220
|
+
Name => 'MenuOffset',
|
|
8417
8221
|
Format => 'int32u',
|
|
8418
|
-
|
|
8419
|
-
|
|
8420
|
-
|
|
8421
|
-
|
|
8422
|
-
### 0x0094 - SequenceOffset info start (Z9 firmware 1.00)
|
|
8423
|
-
0x0093 => {
|
|
8424
|
-
Name => 'SequenceOffsetHook',
|
|
8425
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8426
|
-
Hidden => 1,
|
|
8427
|
-
RawConv => 'undef',
|
|
8428
|
-
# account for variable location of SequenceOffset data
|
|
8429
|
-
Hook => '$varSize = $$self{SequenceOffset} - 0x0094',
|
|
8222
|
+
SubDirectory => {
|
|
8223
|
+
TagTable => 'Image::ExifTool::Nikon::MenuInfoZ9',
|
|
8224
|
+
Start => '$val',
|
|
8225
|
+
},
|
|
8430
8226
|
},
|
|
8431
|
-
|
|
8227
|
+
);
|
|
8228
|
+
|
|
8229
|
+
# ref 28
|
|
8230
|
+
%Image::ExifTool::Nikon::SeqInfoZ9 = (
|
|
8231
|
+
%binaryDataAttrs,
|
|
8232
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8233
|
+
DATAMEMBER => [ 0x20, 0x28, 0x2a ],
|
|
8234
|
+
0x0020 => {
|
|
8432
8235
|
Name => 'FocusShiftShooting',
|
|
8433
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8236
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8434
8237
|
RawConv => '$$self{FocusShiftShooting} = $val',
|
|
8435
8238
|
PrintConv => q{
|
|
8436
8239
|
return 'Off' if $val == 0 ;
|
|
@@ -8438,86 +8241,215 @@ my %nikonFocalConversions = (
|
|
|
8438
8241
|
return "On: $i"
|
|
8439
8242
|
},
|
|
8440
8243
|
},
|
|
8441
|
-
|
|
8244
|
+
0x0028 => {
|
|
8442
8245
|
Name => 'IntervalShooting',
|
|
8443
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8246
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8444
8247
|
RawConv => '$$self{IntervalShooting} = $val',
|
|
8445
8248
|
Format => 'int16u',
|
|
8446
8249
|
PrintConv => q{
|
|
8447
8250
|
return 'Off' if $val == 0 ;
|
|
8448
|
-
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}); # something like "Interval 1 of 3"
|
|
8449
|
-
my $f = $$self{IntervalShootingShotsPerInterval} > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}): '' ; # something like "Frame 1 of 3" or blank
|
|
8251
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); # something like "Interval 1 of 3"
|
|
8252
|
+
my $f = ($$self{IntervalShootingShotsPerInterval}||0) > 1 ? sprintf(" Frame %.0f of %.0f",$$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0): '' ; # something like "Frame 1 of 3" or blank
|
|
8450
8253
|
return "On: $i$f"
|
|
8451
|
-
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}, $$self{IntervalFrame}, $$self{IntervalShootingShotsPerInterval}),
|
|
8254
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
|
8452
8255
|
},
|
|
8453
8256
|
},
|
|
8454
|
-
|
|
8455
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8257
|
+
0x002a => {
|
|
8456
8258
|
Name => 'IntervalFrame',
|
|
8457
8259
|
RawConv => '$$self{IntervalFrame} = $val',
|
|
8458
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8260
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8459
8261
|
Format => 'int16u',
|
|
8460
8262
|
Hidden => 1,
|
|
8461
8263
|
},
|
|
8462
|
-
|
|
8463
|
-
|
|
8464
|
-
|
|
8465
|
-
|
|
8466
|
-
|
|
8467
|
-
|
|
8468
|
-
|
|
8469
|
-
|
|
8264
|
+
);
|
|
8265
|
+
|
|
8266
|
+
# ref 28
|
|
8267
|
+
%Image::ExifTool::Nikon::Offset13InfoZ9 = (
|
|
8268
|
+
%binaryDataAttrs,
|
|
8269
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8270
|
+
DATAMEMBER => [ 0x0bea, 0x0beb ],
|
|
8271
|
+
0x0be8 => {
|
|
8272
|
+
Name => 'AFAreaInitialXPosition', #stored as a representation of the horizontal position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
|
|
8273
|
+
Condition => '$$self{ShutterMode} ne 96 and $$self{AFAreaMode} < 2 ', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
|
8274
|
+
Format => 'int8s',
|
|
8275
|
+
PrintConv => q{
|
|
8276
|
+
#in FX mode and Single-point, the 29 horizontal focus points are spaced 259 pixels apart starting at pixel 502 and ending at 7754. Spacing is the same for Wide(L/C1/C2) with different start points.
|
|
8277
|
+
#in FX mode and Dynamic(L), the 27 horizontal focus points are spaced 259 pixels apart starting at pixel 761 and ending at 7495
|
|
8278
|
+
#in FX mode and Dynamic(M), the 29 horizontal focus points are spaced 259 pixels apart starting at pixel 502 and ending at 7754
|
|
8279
|
+
#in DX mode and Single-point, the 19 horizontal focus points are spaced 388 pixels apart starting at pixel 636 and ending at 7620. [These correspond to FX positions and match the corresponding values in AFAreaMode tag AFAreaXPosition].
|
|
8280
|
+
#in DX mode and Wide(S), the 17 horizontal focus points are spaced 393 pixels apart starting at pixel 591 and ending at 7272.
|
|
8281
|
+
#in DX mode and Dynamic(L), the 17 horizontal focus points are spaced 388 pixels apart starting at pixel 1024 and ending at 7232
|
|
8282
|
+
#in DX mode and Dynamic(M), the 19 horizontal focus points are spaced 388 pixels apart starting at pixel 636 and ending at 7620
|
|
8283
|
+
|
|
8284
|
+
my $areaMode = $$self{VALUE}{PhotoShootingMenuBankImageArea};
|
|
8285
|
+
my $afAreaMode = $$self{VALUE}{AFAreaMode};
|
|
8286
|
+
my $dynamicAFAreaSize = $$self{VALUE}{DynamicAFAreaSize};
|
|
8287
|
+
|
|
8288
|
+
my $FX = 0;
|
|
8289
|
+
my $DX = 1;
|
|
8290
|
+
|
|
8291
|
+
my $Single = 1;
|
|
8292
|
+
my $Dynamic = 2;
|
|
8293
|
+
my $WideS = 3;
|
|
8294
|
+
my $WideL = 4;
|
|
8295
|
+
my $ThreeD = 5;
|
|
8296
|
+
my $Auto = 6;
|
|
8297
|
+
my $WideC1 = 12;
|
|
8298
|
+
|
|
8299
|
+
my $DynamicS = 0;
|
|
8300
|
+
my $DynamicM = 1;
|
|
8301
|
+
my $DynamicL = 2;
|
|
8302
|
+
|
|
8303
|
+
my $start = 502; #FX - all flavors
|
|
8304
|
+
$start = 636 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) + 3D + Auto
|
|
8305
|
+
$start = 591 if $areaMode == $DX and $afAreaMode == $WideS ; #DX Wide(S)
|
|
8306
|
+
|
|
8307
|
+
my $increment = 259; #FX - all flavors
|
|
8308
|
+
$increment = 388 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) + 3D + Auto
|
|
8309
|
+
$increment = 393 if $areaMode == $DX and $afAreaMode == $WideS ; #DX Wide(S)
|
|
8310
|
+
|
|
8311
|
+
my $divisor = 4;
|
|
8312
|
+
$divisor = 6 if $areaMode == $DX ;
|
|
8313
|
+
|
|
8314
|
+
my $offsetVal = 0;
|
|
8315
|
+
$offsetVal = 12 if $areaMode == $FX and $afAreaMode == $Dynamic ; #FX Dynamic (L/M) - force positive values so perl rounding toward zero isn't an issue
|
|
8316
|
+
$offsetVal = 18 if $areaMode == $DX and $afAreaMode == $Dynamic ; #DX Dynamic (L/M)
|
|
8317
|
+
|
|
8318
|
+
my $offsetSum = -1;
|
|
8319
|
+
$offsetSum = -4 if $afAreaMode == $Dynamic ; # Dynamic (L/M)
|
|
8320
|
+
|
|
8321
|
+
my $ncol = $$self{AFAreaInitialWidth};
|
|
8322
|
+
$ncol = int($ncol * 2 / 3) if $areaMode == $DX ; #DX
|
|
8323
|
+
|
|
8324
|
+
#some sample mappings:
|
|
8325
|
+
#FX Wide(S/L/C1/C2) [6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, 101, 105, 109, 113, 117] to 502, 761, 1020, 1279, 1538, 1797, 2056, 2315, 2574, 2833, 3092, 3351, 3610, 3869, 4128, 4387, 4646, 4905, 5164, 5423, 5682, 5941, 6200, 6459, 6718, 6977, 7236, 7495, 7754]
|
|
8326
|
+
#DX Wide(L/C1/C2) map for Wide(L)/C1/C2 [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 67, 73, 79, 85, 91, 97, 103, 109, 115] to [636, 1024, 1412, 1800, 2188, 2576, 2964, 3352, 3740, 4128, 4516, 4904, 5292, 5680, 6068, 6456, 6844, 7232, 7620]
|
|
8327
|
+
#DX Wide(S) for Wide(S) [6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 67, 73, 79, 85, 91, 97, 103] to [984, 1377, 1770, 2163, 2556, 2949, 3342, 3735, 4128, 4521, 4914, 5307, 5700, 6093, 6486, 6879, 7272]
|
|
8328
|
+
#FX Dynamic (L) map [-9, -5, -1, 2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93] to [761, 1020, 1279, 1538, 1797, 2056, 2315, 2574, 2833, 3092, 3351, 3610, 3869, 4128, 4387, 4646, 4905, 5164, 5423, 5682, 5941, 6200, 6459, 6718, 6977, 7236, 7495]
|
|
8329
|
+
|
|
8330
|
+
return $start + $increment * (int(($val + $offsetVal) / $divisor) + int($ncol / 2) + $offsetSum) ; #do not use simple int() becuase it rounds negative fractions toward zero resulting in duplicate values - instead use the 10xdivisor to force positive values
|
|
8331
|
+
},
|
|
8332
|
+
},
|
|
8333
|
+
0x0be9 => {
|
|
8334
|
+
Name =>'AFAreaInitialYPosition', #stored as a representation of the vertical position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
|
|
8335
|
+
Condition => '$$self{ShutterMode} ne 96 and $$self{AFAreaMode} < 2', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
|
8336
|
+
Format => 'int8s',
|
|
8337
|
+
PrintConv => q{
|
|
8338
|
+
#in FX mode and Single-point, the 17 vertical focus points are spaced 291 pixels apart starting at pixel 424 and ending at 5080. Spacing is the same for Wide(L/C1/C2)
|
|
8339
|
+
#in FX mode and Dynamic(L), the 15 vertical focus points are spaced 291 pixels apart starting at pixel 715 and ending at 4789
|
|
8340
|
+
#in FX mode and Dynamic(M), the 17 vertical l focus points are spaced 291 pixels apart starting at pixel 424 and ending at 5080
|
|
8341
|
+
#in DX mode and Single-point, the 11 vertical focus points are spaced 436 pixels apart starting at pixel 572 and ending at 4932. [These correspond to FX positions and match the corresponding values in AFAreaMode tag AFAreaYPosition].
|
|
8342
|
+
#in DX Mode and Wide(S) the 9 vertical focus points are spaced 442 pixels apart starting at pixel 542 and ending at 4520
|
|
8343
|
+
#in DX mode and Dynamic(L), the 9 vertical focus points are spaced 436 pixels apart starting at pixel 1008 and ending at 4496
|
|
8344
|
+
|
|
8345
|
+
my $areaMode = $$self{VALUE}{PhotoShootingMenuBankImageArea};
|
|
8346
|
+
my $afAreaMode = $$self{VALUE}{AFAreaMode};
|
|
8347
|
+
my $dynamicAFAreaSize = $$self{VALUE}{DynamicAFAreaSize};
|
|
8348
|
+
|
|
8349
|
+
my $FX = 0;
|
|
8350
|
+
my $DX = 1;
|
|
8351
|
+
|
|
8352
|
+
my $Single = 1;
|
|
8353
|
+
my $Dynamic = 2;
|
|
8354
|
+
my $WideS = 3;
|
|
8355
|
+
my $WideL = 4;
|
|
8356
|
+
my $ThreeD = 5;
|
|
8357
|
+
my $Auto = 6;
|
|
8358
|
+
my $WideC1 = 12;
|
|
8359
|
+
|
|
8360
|
+
my $DynamicS = 0;
|
|
8361
|
+
my $DynamicM = 1;
|
|
8362
|
+
my $DynamicL = 2;
|
|
8363
|
+
|
|
8364
|
+
my $start = 424; #FX - all flavors
|
|
8365
|
+
$start = 572 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic(L/M/S) + 3D + Auto
|
|
8366
|
+
$start = 542 if $areaMode == $DX and $afAreaMode == 3 ; #DX Wide(S)
|
|
8367
|
+
|
|
8368
|
+
my $increment = 291; #FX - all flavors
|
|
8369
|
+
$increment = 436 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $WideL or $afAreaMode == $ThreeD or $afAreaMode == $Auto or $afAreaMode >= $WideC1); #DX Wide(L/C1/C2) + Dynamic (L/M/S) +3D + Auto
|
|
8370
|
+
$increment = 442 if $areaMode == $DX and $afAreaMode == 3 ; #DX Wide(S)
|
|
8371
|
+
|
|
8372
|
+
my $divisor = 7;
|
|
8373
|
+
$divisor = 10 if $areaMode == $DX ; #DX
|
|
8374
|
+
|
|
8375
|
+
my $offsetVal = -1;
|
|
8376
|
+
$offsetVal = 39 if $afAreaMode == $Dynamic and ( $dynamicAFAreaSize == $DynamicL ) ; #Dynamic (L) - force positive values so perl rounding toward zero isn't an issue
|
|
8377
|
+
$offsetVal = 40 if $afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicM ; #Dynamic (M)
|
|
8378
|
+
$offsetVal = 40 if $areaMode == $FX and (($afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicS) or $afAreaMode == $ThreeD) ; #FX Dynamic (S) or 3D
|
|
8379
|
+
$offsetVal = 38 if $areaMode == $DX and ($afAreaMode == $Dynamic and $dynamicAFAreaSize == $DynamicS ) ; #DX Dynamic (S)or 3D
|
|
8380
|
+
|
|
8381
|
+
my $offsetSum = 0;
|
|
8382
|
+
$offsetSum = -6 if $areaMode == $FX and ($afAreaMode == $Dynamic or $afAreaMode == $ThreeD); #FX Dynamic (L/M/S) or 3D
|
|
8383
|
+
$offsetSum = -4 if $areaMode == $DX and ($afAreaMode == $Dynamic or $afAreaMode == $ThreeD ); #DX Dynamic (L/M/S) or 3D
|
|
8384
|
+
|
|
8385
|
+
my $nrow = $$self{AFAreaInitialHeight};
|
|
8386
|
+
$nrow = int($nrow * 2 / 3) if $areaMode == $DX; #DX
|
|
8387
|
+
|
|
8388
|
+
#some sample mappings:
|
|
8389
|
+
#FX Wide(S/L/C1/C2) map [7, 13, 20, 27, 33, 40, 47, 53, 60, 67, 74, 80, 87, 94, 100, 107, 114] to [424, 715, 1006, 1297, 1588, 1879, 2170, 2461, 2752, 3043, 3334, 3625, 3916, 4207, 4498, 4789, 5080]
|
|
8390
|
+
#DX Wide(L/C1/C2) map [7, 17, 28, 38, 48, 58, 69, 79, 89, 100, 110] to [572, 1008, 1444, 1880, 2316, 2752, 3188, 3624, 4060, 4496, 4932]
|
|
8391
|
+
#DX Wide(S) map for Wide(S) [7, 17, 28, 38, 48, 58, 69, 79, 89] to [984, 1426, 1868, 2310, 2752, 3194, 3636, 4078, 4520]
|
|
8392
|
+
#FX Dynamic (L) map [-19, -13, -6, 0, 7, 13, 20, 27, 33, 40, 47, 53, 60, 67, 74] to [715, 1006, 1297, 1588, 1879, 2170, 2461, 2752, 3043, 3334, 3625, 3916, 4207, 4498, 4789]
|
|
8393
|
+
|
|
8394
|
+
return $start + $increment * (int(($val + $offsetVal) / $divisor) + int($nrow / 2) + $offsetSum) ;;
|
|
8395
|
+
},
|
|
8396
|
+
},
|
|
8397
|
+
0x0bea => {
|
|
8398
|
+
Name => 'AFAreaInitialWidth',
|
|
8399
|
+
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8400
|
+
ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
|
|
8401
|
+
RawConv => '$$self{AFAreaInitialWidth} = 1 + int ($val / 4)', #convert from [3, 11, 19, 35, 51, 75] to [1, 3, 5, 9 13, 19] to match camera options for C1/C2 focus modes .. input/output of 11/3 is for Wide(S)
|
|
8470
8402
|
},
|
|
8471
|
-
|
|
8472
|
-
Name => '
|
|
8473
|
-
Condition => '$$self{ShutterMode}
|
|
8474
|
-
|
|
8475
|
-
RawConv => '
|
|
8476
|
-
# account for variable location of menu settings data
|
|
8477
|
-
Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0x44ec',
|
|
8403
|
+
0x0beb => {
|
|
8404
|
+
Name => 'AFAreaInitialHeight',
|
|
8405
|
+
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8406
|
+
ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
|
|
8407
|
+
RawConv => '$$self{AFAreaInitialHeight} = 1 + int ($val / 7) ', #convert from [6, 20, 33, 46, 73] to [1, 3, 5, 7, 11] to match camera options for C1/C2 focus modes .. input/output of 33/5 is for Wide(L)
|
|
8478
8408
|
},
|
|
8479
|
-
|
|
8409
|
+
);
|
|
8410
|
+
|
|
8411
|
+
%Image::ExifTool::Nikon::MenuInfoZ9 = (
|
|
8412
|
+
%binaryDataAttrs,
|
|
8413
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8414
|
+
IS_SUBDIR => [ 0x10 ],
|
|
8415
|
+
# 0x00 - int32u size of this directory
|
|
8416
|
+
0x10 => [
|
|
8480
8417
|
{
|
|
8481
|
-
Name => '
|
|
8482
|
-
Condition => '$$self{
|
|
8483
|
-
Format => '
|
|
8418
|
+
Name => 'MenuSettingsOffsetZ9',
|
|
8419
|
+
Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} lt "03.00"',
|
|
8420
|
+
Format => 'int32u',
|
|
8484
8421
|
Notes => 'Firmware versions 2.11 and earlier',
|
|
8485
8422
|
SubDirectory => {
|
|
8486
8423
|
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
|
|
8424
|
+
Start => '$dirStart + $val',
|
|
8487
8425
|
},
|
|
8488
8426
|
},
|
|
8489
8427
|
{
|
|
8490
|
-
Name => '
|
|
8428
|
+
Name => 'MenuSettingsOffsetZ9v3',
|
|
8491
8429
|
Notes => 'Firmware versions 3.0 and later',
|
|
8492
|
-
|
|
8493
|
-
Format => 'undef[1948]',
|
|
8430
|
+
Format => 'int32u',
|
|
8494
8431
|
SubDirectory => {
|
|
8495
|
-
TagTable => 'Image::ExifTool::Nikon::
|
|
8432
|
+
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9v3',
|
|
8433
|
+
Start => '$dirStart + $val',
|
|
8496
8434
|
},
|
|
8497
8435
|
},
|
|
8498
8436
|
],
|
|
8499
|
-
|
|
8500
|
-
|
|
8501
|
-
|
|
8502
|
-
|
|
8503
|
-
|
|
8504
|
-
|
|
8505
|
-
# account for variable location of OrientationInfo data
|
|
8506
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0x80c5',
|
|
8507
|
-
},
|
|
8508
|
-
0x80c5 => {
|
|
8437
|
+
);
|
|
8438
|
+
|
|
8439
|
+
%Image::ExifTool::Nikon::OrientationInfo = (
|
|
8440
|
+
%binaryDataAttrs,
|
|
8441
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8442
|
+
0 => {
|
|
8509
8443
|
Name => 'RollAngle',
|
|
8510
|
-
|
|
8511
|
-
Format => 'fixed32u',
|
|
8444
|
+
Format => 'fixed32u',
|
|
8512
8445
|
Notes => 'converted to degrees of clockwise camera roll',
|
|
8513
8446
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
8514
8447
|
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
|
8515
8448
|
PrintConv => 'sprintf("%.1f", $val)',
|
|
8516
8449
|
PrintConvInv => '$val',
|
|
8517
8450
|
},
|
|
8518
|
-
|
|
8451
|
+
4 => {
|
|
8519
8452
|
Name => 'PitchAngle',
|
|
8520
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8521
8453
|
Format => 'fixed32u',
|
|
8522
8454
|
Notes => 'converted to degrees of upward camera tilt',
|
|
8523
8455
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
@@ -8525,9 +8457,8 @@ my %nikonFocalConversions = (
|
|
|
8525
8457
|
PrintConv => 'sprintf("%.1f", $val)',
|
|
8526
8458
|
PrintConvInv => '$val',
|
|
8527
8459
|
},
|
|
8528
|
-
|
|
8460
|
+
8 => {
|
|
8529
8461
|
Name => 'YawAngle',
|
|
8530
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
|
8531
8462
|
Format => 'fixed32u',
|
|
8532
8463
|
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
|
8533
8464
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
|
@@ -8535,51 +8466,25 @@ my %nikonFocalConversions = (
|
|
|
8535
8466
|
PrintConv => 'sprintf("%.1f", $val)',
|
|
8536
8467
|
PrintConvInv => '$val',
|
|
8537
8468
|
},
|
|
8538
|
-
### 0x8139 - Offset26 info start (Z9 firmware 3.01)
|
|
8539
|
-
0x8149 => {
|
|
8540
|
-
Name => 'MenuSettingsZ9Offset',
|
|
8541
|
-
Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
|
|
8542
|
-
Writable => 0,
|
|
8543
|
-
Hidden => 1,
|
|
8544
|
-
# offset to MenuSettingsZ9 is relative to start of Offset26 block
|
|
8545
|
-
RawConv => '$$self{MenuSettingsZ9Offset} = ($val || 0x10000000) + $$self{MenuOffset}; undef', # (ignore if 0)
|
|
8546
|
-
},
|
|
8547
|
-
0x814a => {
|
|
8548
|
-
Name => 'Hook5',
|
|
8549
|
-
Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
|
|
8550
|
-
Hidden => 1,
|
|
8551
|
-
RawConv => 'undef',
|
|
8552
|
-
# account for variable location of menu settings data
|
|
8553
|
-
Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0x8225',
|
|
8554
|
-
},
|
|
8555
|
-
0x8225 => [
|
|
8556
|
-
{
|
|
8557
|
-
Name => 'MenuSettingsZ9',
|
|
8558
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FirmwareVersion} lt "03.00"', # C30/C60/C120 jpgs handled at 0x4410
|
|
8559
|
-
Format => 'undef[1646]',
|
|
8560
|
-
Notes => 'Firmware versions 2.11 and earlier',
|
|
8561
|
-
SubDirectory => {
|
|
8562
|
-
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
|
|
8563
|
-
},
|
|
8564
|
-
},
|
|
8565
|
-
{
|
|
8566
|
-
Name => 'MenuSettingsZ9',
|
|
8567
|
-
Notes => 'Firmware versions 3.0 and later',
|
|
8568
|
-
Condition => '$$self{ShutterMode} ne 96', # C30/C60/C120 jpgs handled at 0x4410
|
|
8569
|
-
Format => 'undef[1948]',
|
|
8570
|
-
SubDirectory => {
|
|
8571
|
-
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9Firmware3',
|
|
8572
|
-
},
|
|
8573
|
-
},
|
|
8574
|
-
],
|
|
8575
|
-
# note: DecryptLen currently set to 0xec4b + 2196
|
|
8576
8469
|
);
|
|
8577
8470
|
|
|
8578
8471
|
%Image::ExifTool::Nikon::MenuSettingsZ7II = (
|
|
8579
8472
|
%binaryDataAttrs,
|
|
8580
8473
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8581
|
-
DATAMEMBER => [ 176, 180, 328, 352, 858 ],
|
|
8474
|
+
DATAMEMBER => [ 90, 176, 180, 328, 352, 858 ],
|
|
8582
8475
|
NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.',
|
|
8476
|
+
#48 SelfTimer' #0=> no 1=> yes works for Z7II firmware 1.40, but not 1.30. Follow-up required.
|
|
8477
|
+
90 => {
|
|
8478
|
+
Name => 'SingleFrame', #0=> Single Frame 1=> one of the continuous modes
|
|
8479
|
+
Hidden => 1,
|
|
8480
|
+
RawConv => '$$self{SingleFrame} = $val',
|
|
8481
|
+
},
|
|
8482
|
+
92 => {
|
|
8483
|
+
Name => 'ReleaseMode',
|
|
8484
|
+
#ValueConv => '$$self{SelfTimer} == 1 ? 4 : $$self{SingleFrame} == 0 ? 5 : $val', #map single frame and timer to a unique values for PrintConv. Activate when SelfTimer tag is clarified for cameras other than Z7II fw 1.40
|
|
8485
|
+
ValueConv => '$$self{SingleFrame} == 0 ? 5 : $val', #map single frame to a unique value for PrintConv
|
|
8486
|
+
PrintConv => \%releaseModeZ7,
|
|
8487
|
+
},
|
|
8583
8488
|
160 => {
|
|
8584
8489
|
Name => 'IntervalDurationHours',
|
|
8585
8490
|
Format => 'int32u',
|
|
@@ -8800,7 +8705,7 @@ my %nikonFocalConversions = (
|
|
|
8800
8705
|
%Image::ExifTool::Nikon::MenuSettingsZ9 = (
|
|
8801
8706
|
%binaryDataAttrs,
|
|
8802
8707
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8803
|
-
DATAMEMBER => [ 140, 188, 192, 232, 424, 534 ],
|
|
8708
|
+
DATAMEMBER => [ 140, 188, 192, 232, 424, 534, 576 ],
|
|
8804
8709
|
IS_SUBDIR => [ 799 ],
|
|
8805
8710
|
NOTES => 'These tags are used by the Z9.',
|
|
8806
8711
|
#90 ISO
|
|
@@ -8814,34 +8719,34 @@ my %nikonFocalConversions = (
|
|
|
8814
8719
|
Name => 'Intervals',
|
|
8815
8720
|
Format => 'int32u',
|
|
8816
8721
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
|
8817
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8722
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8818
8723
|
},
|
|
8819
8724
|
192 => {
|
|
8820
8725
|
Name => 'ShotsPerInterval',
|
|
8821
8726
|
Format => 'int32u',
|
|
8822
8727
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
|
8823
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8728
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8824
8729
|
},
|
|
8825
8730
|
#220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
|
|
8826
8731
|
232 => {
|
|
8827
8732
|
Name => 'FocusShiftNumberShots', #1-300
|
|
8828
8733
|
RawConv => '$$self{FocusShiftNumberShots} = $val',
|
|
8829
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8734
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8830
8735
|
},
|
|
8831
8736
|
236 => {
|
|
8832
8737
|
Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
|
|
8833
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8738
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8834
8739
|
},
|
|
8835
8740
|
240 => {
|
|
8836
8741
|
Name => 'FocusShiftInterval',
|
|
8837
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8742
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8838
8743
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
|
8839
8744
|
},
|
|
8840
8745
|
244 => {
|
|
8841
8746
|
Name => 'FocusShiftExposureLock',
|
|
8842
8747
|
Unknown => 1,
|
|
8843
8748
|
PrintConv => \%offOn,
|
|
8844
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8749
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8845
8750
|
},
|
|
8846
8751
|
274 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
|
|
8847
8752
|
276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, #single tag from both Photo & Video menus
|
|
@@ -8940,6 +8845,12 @@ my %nikonFocalConversions = (
|
|
|
8940
8845
|
556 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
|
|
8941
8846
|
572 => { Name => 'DXCropAlert', PrintConv => \%offOn },
|
|
8942
8847
|
574 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
|
|
8848
|
+
576 => {
|
|
8849
|
+
Name => 'DynamicAFAreaSize',
|
|
8850
|
+
Condition => '$$self{AFAraMode} = 2',
|
|
8851
|
+
RawConv => '$$self{DynamicAFAreaSize} = $val',
|
|
8852
|
+
PrintConv => \%dynamicAfAreaModesZ9,
|
|
8853
|
+
},
|
|
8943
8854
|
604 => {
|
|
8944
8855
|
Name => 'MovieImageArea',
|
|
8945
8856
|
Unknown => 1,
|
|
@@ -8996,16 +8907,16 @@ my %nikonFocalConversions = (
|
|
|
8996
8907
|
1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
|
|
8997
8908
|
1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
|
|
8998
8909
|
1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
|
|
8999
|
-
1608 => { Name => 'EnergySavingMode', PrintConv
|
|
8910
|
+
1608 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
|
|
9000
8911
|
1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
|
|
9001
8912
|
1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
|
|
9002
8913
|
1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
|
|
9003
8914
|
);
|
|
9004
8915
|
|
|
9005
|
-
%Image::ExifTool::Nikon::
|
|
8916
|
+
%Image::ExifTool::Nikon::MenuSettingsZ9v3 = (
|
|
9006
8917
|
%binaryDataAttrs,
|
|
9007
8918
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
9008
|
-
DATAMEMBER => [ 154, 204, 208, 248, 444, 554 ],
|
|
8919
|
+
DATAMEMBER => [ 154, 204, 208, 248, 444, 554, 596 ],
|
|
9009
8920
|
IS_SUBDIR => [ 847 ],
|
|
9010
8921
|
NOTES => 'These tags are used by the Z9 firmware 3.00.',
|
|
9011
8922
|
72 => {
|
|
@@ -9022,33 +8933,33 @@ my %nikonFocalConversions = (
|
|
|
9022
8933
|
Name => 'Intervals',
|
|
9023
8934
|
Format => 'int32u',
|
|
9024
8935
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
|
9025
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8936
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9026
8937
|
},
|
|
9027
8938
|
208 => {
|
|
9028
8939
|
Name => 'ShotsPerInterval',
|
|
9029
8940
|
Format => 'int32u',
|
|
9030
8941
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
|
9031
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8942
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9032
8943
|
},
|
|
9033
8944
|
248 => {
|
|
9034
8945
|
Name => 'FocusShiftNumberShots', #1-300
|
|
9035
8946
|
RawConv => '$$self{FocusShiftNumberShots} = $val',
|
|
9036
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8947
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9037
8948
|
},
|
|
9038
8949
|
252 => {
|
|
9039
8950
|
Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
|
|
9040
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8951
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9041
8952
|
},
|
|
9042
8953
|
256 => {
|
|
9043
8954
|
Name => 'FocusShiftInterval',
|
|
9044
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8955
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9045
8956
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
|
9046
8957
|
},
|
|
9047
8958
|
260 => {
|
|
9048
8959
|
Name => 'FocusShiftExposureLock',
|
|
9049
8960
|
Unknown => 1,
|
|
9050
8961
|
PrintConv => \%offOn,
|
|
9051
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
8962
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9052
8963
|
},
|
|
9053
8964
|
290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
|
|
9054
8965
|
292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
|
|
@@ -9134,6 +9045,12 @@ my %nikonFocalConversions = (
|
|
|
9134
9045
|
576 => { Name => 'SecondarySlotFunction', PrintConv => \%secondarySlotFunctionZ9 },
|
|
9135
9046
|
592 => { Name => 'DXCropAlert', PrintConv => \%offOn },
|
|
9136
9047
|
594 => { Name => 'SubjectDetection', PrintConv => \%subjectDetectionZ9 },
|
|
9048
|
+
596 => {
|
|
9049
|
+
Name => 'DynamicAFAreaSize',
|
|
9050
|
+
Condition => '$$self{AFAraMode} = 2',
|
|
9051
|
+
RawConv => '$$self{DynamicAFAreaSize} = $val',
|
|
9052
|
+
PrintConv => \%dynamicAfAreaModesZ9,
|
|
9053
|
+
},
|
|
9137
9054
|
636 => { Name => 'HighFrequencyFlickerReductionShooting', PrintConv => \%offOn, Unknown => 1 }, # new with firmware 3.0
|
|
9138
9055
|
646 => {
|
|
9139
9056
|
Name => 'MovieImageArea',
|
|
@@ -9192,7 +9109,7 @@ my %nikonFocalConversions = (
|
|
|
9192
9109
|
1613 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
|
|
9193
9110
|
1620 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
|
|
9194
9111
|
1621 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
|
|
9195
|
-
1656 => { Name => 'EnergySavingMode', PrintConv
|
|
9112
|
+
1656 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
|
|
9196
9113
|
1680 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
|
|
9197
9114
|
1684 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
|
|
9198
9115
|
1693 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
|
|
@@ -9200,7 +9117,7 @@ my %nikonFocalConversions = (
|
|
|
9200
9117
|
Name => 'FocusShiftAutoReset',
|
|
9201
9118
|
Unknown => 1,
|
|
9202
9119
|
PrintConv => \%offOn,
|
|
9203
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9120
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
|
9204
9121
|
},
|
|
9205
9122
|
1810 => { #CSd4-a
|
|
9206
9123
|
Name => 'PreReleaseBurstLength',
|
|
@@ -11258,8 +11175,8 @@ my %nikonFocalConversions = (
|
|
|
11258
11175
|
Name => 'LensData0201',
|
|
11259
11176
|
SubDirectory => {
|
|
11260
11177
|
TagTable => 'Image::ExifTool::Nikon::LensData01',
|
|
11261
|
-
ProcessProc => \&
|
|
11262
|
-
WriteProc => \&
|
|
11178
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11179
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11263
11180
|
DecryptStart => 4,
|
|
11264
11181
|
},
|
|
11265
11182
|
},
|
|
@@ -11268,8 +11185,8 @@ my %nikonFocalConversions = (
|
|
|
11268
11185
|
Name => 'LensData0204',
|
|
11269
11186
|
SubDirectory => {
|
|
11270
11187
|
TagTable => 'Image::ExifTool::Nikon::LensData0204',
|
|
11271
|
-
ProcessProc => \&
|
|
11272
|
-
WriteProc => \&
|
|
11188
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11189
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11273
11190
|
DecryptStart => 4,
|
|
11274
11191
|
},
|
|
11275
11192
|
},
|
|
@@ -11278,8 +11195,8 @@ my %nikonFocalConversions = (
|
|
|
11278
11195
|
Name => 'LensData0400',
|
|
11279
11196
|
SubDirectory => {
|
|
11280
11197
|
TagTable => 'Image::ExifTool::Nikon::LensData0400',
|
|
11281
|
-
ProcessProc => \&
|
|
11282
|
-
WriteProc => \&
|
|
11198
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11199
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11283
11200
|
DecryptStart => 4,
|
|
11284
11201
|
},
|
|
11285
11202
|
},
|
|
@@ -11288,8 +11205,8 @@ my %nikonFocalConversions = (
|
|
|
11288
11205
|
Name => 'LensData0402',
|
|
11289
11206
|
SubDirectory => {
|
|
11290
11207
|
TagTable => 'Image::ExifTool::Nikon::LensData0402',
|
|
11291
|
-
ProcessProc => \&
|
|
11292
|
-
WriteProc => \&
|
|
11208
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11209
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11293
11210
|
DecryptStart => 4,
|
|
11294
11211
|
},
|
|
11295
11212
|
},
|
|
@@ -11298,8 +11215,8 @@ my %nikonFocalConversions = (
|
|
|
11298
11215
|
Name => 'LensData0403',
|
|
11299
11216
|
SubDirectory => {
|
|
11300
11217
|
TagTable => 'Image::ExifTool::Nikon::LensData0403',
|
|
11301
|
-
ProcessProc => \&
|
|
11302
|
-
WriteProc => \&
|
|
11218
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11219
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11303
11220
|
DecryptStart => 4,
|
|
11304
11221
|
},
|
|
11305
11222
|
},
|
|
@@ -11308,8 +11225,8 @@ my %nikonFocalConversions = (
|
|
|
11308
11225
|
Name => 'LensData0800',
|
|
11309
11226
|
SubDirectory => {
|
|
11310
11227
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|
|
11311
|
-
ProcessProc => \&
|
|
11312
|
-
WriteProc => \&
|
|
11228
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11229
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11313
11230
|
DecryptStart => 4,
|
|
11314
11231
|
ByteOrder => 'LittleEndian',
|
|
11315
11232
|
# 0x5a0c - NikonMeteringMode for some Z6 ver1.00 samples (ref PH)
|
|
@@ -11319,8 +11236,8 @@ my %nikonFocalConversions = (
|
|
|
11319
11236
|
Name => 'LensDataUnknown',
|
|
11320
11237
|
SubDirectory => {
|
|
11321
11238
|
TagTable => 'Image::ExifTool::Nikon::LensDataUnknown',
|
|
11322
|
-
ProcessProc => \&
|
|
11323
|
-
WriteProc => \&
|
|
11239
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
|
11240
|
+
WriteProc => \&ProcessNikonEncrypted,
|
|
11324
11241
|
DecryptStart => 4,
|
|
11325
11242
|
},
|
|
11326
11243
|
},
|
|
@@ -11512,6 +11429,7 @@ my %nikonFocalConversions = (
|
|
|
11512
11429
|
# construct lens ID string as per ref 11
|
|
11513
11430
|
ValueConv => 'sprintf("%.2X"." %.2X"x7, @raw)',
|
|
11514
11431
|
PrintConv => \%nikonLensIDs,
|
|
11432
|
+
PrintInt => 1,
|
|
11515
11433
|
},
|
|
11516
11434
|
AutoFocus => {
|
|
11517
11435
|
Require => {
|
|
@@ -11835,37 +11753,54 @@ my @xlat = (
|
|
|
11835
11753
|
0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f ]
|
|
11836
11754
|
);
|
|
11837
11755
|
|
|
11756
|
+
my ($ci0, $cj0, $ck0, $decryptStart); # decryption parameters
|
|
11757
|
+
|
|
11838
11758
|
# Decrypt Nikon data block (ref 4)
|
|
11839
|
-
# Inputs: 0) reference to data block, 1)
|
|
11840
|
-
#
|
|
11841
|
-
#
|
|
11759
|
+
# Inputs: 0) reference to data block, 1) optional start offset (default 0)
|
|
11760
|
+
# 2) optional number of bytes to decode (default to the end of the data)
|
|
11761
|
+
# 3) optional serial number key (undef to continue previous decryption)
|
|
11762
|
+
# 4) optional shutter count key
|
|
11842
11763
|
# Returns: data block with specified data decrypted
|
|
11843
|
-
|
|
11764
|
+
# Notes: The first time this is called for a given encrypted data block the serial/count
|
|
11765
|
+
# keys must be defined, and $start must be the offset for initialization of the
|
|
11766
|
+
# decryption parameters (ie. the beginning of the encrypted data, which isn't
|
|
11767
|
+
# necessarily inside the data block if $len is zero). Subsequent calls for
|
|
11768
|
+
# the same data block do not specify the serial/count keys, and may be used
|
|
11769
|
+
# to decrypt data at any start point within the full data block.
|
|
11770
|
+
sub Decrypt($;$$$$)
|
|
11844
11771
|
{
|
|
11845
|
-
my ($dataPt, $
|
|
11846
|
-
my ($
|
|
11772
|
+
my ($dataPt, $start, $len, $serial, $count) = @_;
|
|
11773
|
+
my ($ch, $cj, $ck);
|
|
11847
11774
|
|
|
11848
11775
|
$start or $start = 0;
|
|
11849
11776
|
my $maxLen = length($$dataPt) - $start;
|
|
11850
11777
|
$len = $maxLen if not defined $len or $len > $maxLen;
|
|
11851
|
-
|
|
11852
|
-
|
|
11853
|
-
|
|
11854
|
-
$key ^= ($count >> ($
|
|
11778
|
+
if (defined $serial and defined $count) {
|
|
11779
|
+
# initialize decryption parameters
|
|
11780
|
+
my $key = 0;
|
|
11781
|
+
$key ^= ($count >> ($_*8)) & 0xff foreach 0..3;
|
|
11782
|
+
$ci0 = $xlat[0][$serial & 0xff];
|
|
11783
|
+
$cj0 = $xlat[1][$key];
|
|
11784
|
+
$ck0 = 0x60;
|
|
11785
|
+
undef $decryptStart;
|
|
11855
11786
|
}
|
|
11856
|
-
|
|
11857
|
-
|
|
11858
|
-
|
|
11859
|
-
|
|
11860
|
-
|
|
11861
|
-
|
|
11787
|
+
if (defined $decryptStart) {
|
|
11788
|
+
# initialize decryption parameters for this start position
|
|
11789
|
+
my $n = $start - $decryptStart;
|
|
11790
|
+
$cj = ($cj0 + $ci0 * ($n * $ck0 + ($n * ($n - 1))/2)) & 0xff;
|
|
11791
|
+
$ck = ($ck0 + $n) & 0xff;
|
|
11792
|
+
} else {
|
|
11793
|
+
$decryptStart = $start;
|
|
11794
|
+
($cj, $ck) = ($cj0, $ck0);
|
|
11795
|
+
}
|
|
11796
|
+
return $$dataPt if $len <= 0;
|
|
11797
|
+
my @data = unpack('C*', substr($$dataPt, $start, $len));
|
|
11798
|
+
foreach $ch (@data) {
|
|
11799
|
+
$cj = ($cj + $ci0 * $ck) & 0xff;
|
|
11862
11800
|
$ck = ($ck + 1) & 0xff;
|
|
11863
|
-
$
|
|
11801
|
+
$ch ^= $cj;
|
|
11864
11802
|
}
|
|
11865
|
-
|
|
11866
|
-
my $pre = $start ? substr($$dataPt, 0, $start) : '';
|
|
11867
|
-
my $post = $end < length($$dataPt) ? substr($$dataPt, $end) : '';
|
|
11868
|
-
return $pre . pack('C*',@data) . $post;
|
|
11803
|
+
return substr($$dataPt, 0, $start) . pack('C*', @data) . substr($$dataPt, $start+$len);
|
|
11869
11804
|
}
|
|
11870
11805
|
|
|
11871
11806
|
#------------------------------------------------------------------------------
|
|
@@ -12001,6 +11936,166 @@ sub ProcessNikonMOV($$$)
|
|
|
12001
11936
|
return 1;
|
|
12002
11937
|
}
|
|
12003
11938
|
|
|
11939
|
+
#------------------------------------------------------------------------------
|
|
11940
|
+
# Get offset of end-of-data for a tag
|
|
11941
|
+
# Inputs: 0) tag table ref, 1) tag ID, 2) true to not calculate end for a SubDirectory
|
|
11942
|
+
# Returns: offset of tag value end, undef if it can't be determined
|
|
11943
|
+
sub GetTagEnd($$;$)
|
|
11944
|
+
{
|
|
11945
|
+
my ($tagTablePtr, $tagID, $ignoreSubdir) = @_;
|
|
11946
|
+
my $tagInfo = $$tagTablePtr{$tagID};
|
|
11947
|
+
$tagInfo = $$tagInfo[0] if ref $tagInfo eq 'ARRAY';
|
|
11948
|
+
# (can't pre-determine position of offset-based subdirectories)
|
|
11949
|
+
return undef if $ignoreSubdir and $$tagInfo{SubDirectory};
|
|
11950
|
+
my $fmt = $$tagInfo{Format} || $$tagTablePtr{FORMAT} || 'int8u';
|
|
11951
|
+
my $nm = $fmt =~ s/\[(\d+)\]$// ? $1 : 1;
|
|
11952
|
+
my $sz = Image::ExifTool::FormatSize($fmt) or return undef;
|
|
11953
|
+
return int($tagID) + $sz * $nm;
|
|
11954
|
+
}
|
|
11955
|
+
|
|
11956
|
+
#------------------------------------------------------------------------------
|
|
11957
|
+
# Initialize SubDirectory KnownStart/KnownEnd limits of known tags (used in decryption)
|
|
11958
|
+
# Inputs: 0) tagInfo ref containing this SubDirectory, 2) tag table ref for encrypted subdir
|
|
11959
|
+
# Notes: KnownStart/KnownEnd are relative to the SubDirectory Start. If KnownStart/KnownEnd
|
|
11960
|
+
# aren't set then the entire data is decrypted, so all of this effort is just for speed.
|
|
11961
|
+
sub InitEncryptedSubdir($$)
|
|
11962
|
+
{
|
|
11963
|
+
my ($tagInfo, $tagTablePtr) = @_;
|
|
11964
|
+
#
|
|
11965
|
+
# for encrypted NIKON_OFFSETS tables we loop through all SubDirectory tags in this table
|
|
11966
|
+
# and set the KnownEnd for each of these according to the last tag in the child tables
|
|
11967
|
+
#
|
|
11968
|
+
my $vars = $$tagTablePtr{VARS};
|
|
11969
|
+
$vars or $vars = $$tagTablePtr{VARS} = { };
|
|
11970
|
+
if ($$vars{NIKON_OFFSETS} and not $$vars{NIKON_INITIALIZED}) {
|
|
11971
|
+
$$vars{NIKON_INITIALIZED} = 1;
|
|
11972
|
+
my $tagID;
|
|
11973
|
+
foreach $tagID (TagTableKeys($tagTablePtr)) {
|
|
11974
|
+
my $tagInfo = $$tagTablePtr{$tagID};
|
|
11975
|
+
next unless ref $tagInfo eq 'HASH';
|
|
11976
|
+
my $subdir = $$tagInfo{SubDirectory} or next;
|
|
11977
|
+
my $tbl = GetTagTable($$subdir{TagTable});
|
|
11978
|
+
my ($last) = sort { $b <=> $a } TagTableKeys($tbl); # (reverse sort)
|
|
11979
|
+
$$subdir{KnownEnd} = GetTagEnd($tbl, $last, 1);
|
|
11980
|
+
}
|
|
11981
|
+
}
|
|
11982
|
+
#
|
|
11983
|
+
# for other encrypted Nikon tables we set the KnownStart/KnownEnd entries in the
|
|
11984
|
+
# SubDirectory of the parent tag
|
|
11985
|
+
#
|
|
11986
|
+
unless ($$tagInfo{NikonInitialized}) {
|
|
11987
|
+
$$tagInfo{NikonInitialized} = 1;
|
|
11988
|
+
my $subdir = $$tagInfo{SubDirectory};
|
|
11989
|
+
my $start = $$subdir{DecryptStart} || 0;
|
|
11990
|
+
my $off = $$subdir{DirOffset};
|
|
11991
|
+
my @tagIDs = sort { $a <=> $b } TagTableKeys($tagTablePtr);
|
|
11992
|
+
if (defined $off) {
|
|
11993
|
+
$off += $start; # (DirOffset, if specified, is relative to DecryptStart)
|
|
11994
|
+
} else {
|
|
11995
|
+
# ignore tags that come before the start of encryption
|
|
11996
|
+
shift @tagIDs while @tagIDs and $tagIDs[0] < $start;
|
|
11997
|
+
$off = 0;
|
|
11998
|
+
}
|
|
11999
|
+
if (@tagIDs) {
|
|
12000
|
+
my ($first, $last) = @tagIDs[0,-1];
|
|
12001
|
+
my $lastInfo = $$tagTablePtr{$last};
|
|
12002
|
+
$lastInfo = $$lastInfo[0] if ref $lastInfo eq 'ARRAY';
|
|
12003
|
+
$$subdir{KnownStart} = int($first) + $off if $first + $off > $start;
|
|
12004
|
+
$$subdir{KnownEnd} = GetTagEnd($tagTablePtr, $last);
|
|
12005
|
+
if (defined $$subdir{KnownEnd}) {
|
|
12006
|
+
$$subdir{KnownEnd} += $off;
|
|
12007
|
+
} else {
|
|
12008
|
+
warn "Internal error setting KnownEnd for $$tagTablePtr{SHORT_NAME}\n";
|
|
12009
|
+
}
|
|
12010
|
+
} else {
|
|
12011
|
+
$$subdir{KnownStart} = $$subdir{KnownEnd} = $start;
|
|
12012
|
+
}
|
|
12013
|
+
}
|
|
12014
|
+
}
|
|
12015
|
+
|
|
12016
|
+
#------------------------------------------------------------------------------
|
|
12017
|
+
# Prepare to process NIKON_OFFSETS directory and decrypt necessary data
|
|
12018
|
+
# Inputs: 0) ExifTool ref, 1) data ref, 2) tag table ref, 3) decrypt start,
|
|
12019
|
+
# 4) decrypt mode (0=piecewise, 1=continuous to end of last known section, 2=all)
|
|
12020
|
+
# Returns: end of decrypted data (or undef for piecewise decryption)
|
|
12021
|
+
sub PrepareNikonOffsets($$$$$)
|
|
12022
|
+
{
|
|
12023
|
+
my ($et, $dataPt, $tagTablePtr, $start, $decryptMode) = @_;
|
|
12024
|
+
my $offset = $$tagTablePtr{VARS}{NIKON_OFFSETS};
|
|
12025
|
+
my $dataLen = length $$dataPt;
|
|
12026
|
+
return undef if $offset + 4 > $dataLen or $offset < $start;
|
|
12027
|
+
my $serial = $$et{NikonSerialKey};
|
|
12028
|
+
my $count = $$et{NikonCountKey};
|
|
12029
|
+
my $dpos = $offset + 4; # decrypt up to NumberOffsets
|
|
12030
|
+
$$dataPt = Decrypt($dataPt, $start, $dpos - $start, $serial, $count);
|
|
12031
|
+
my $numOffsets = Get32u($dataPt, $offset);
|
|
12032
|
+
my $more = $numOffsets * 4; # more bytes to decrypt entire offsets table
|
|
12033
|
+
return undef if $offset + 4 + $more > $dataLen;
|
|
12034
|
+
$$dataPt = Decrypt($dataPt, $dpos, $more);
|
|
12035
|
+
$dpos += $more;
|
|
12036
|
+
my $unknown = $et->Options('Unknown');
|
|
12037
|
+
my ($i, @offInfo, $end);
|
|
12038
|
+
# extract non-zero offsets and create unknown subdirectories if Unknown > 1
|
|
12039
|
+
for ($i=0; $i<$numOffsets; ++$i) {
|
|
12040
|
+
my $pos = $offset + 4 + 4 * $i;
|
|
12041
|
+
my $off = Get32u($dataPt, $pos) or next;
|
|
12042
|
+
my $tagInfo = $$tagTablePtr{$pos};
|
|
12043
|
+
my $known = 0;
|
|
12044
|
+
if ($tagInfo) {
|
|
12045
|
+
$known = 1 if ref $tagInfo ne 'HASH' or not $$tagInfo{Unknown};
|
|
12046
|
+
} elsif ($unknown > 1) {
|
|
12047
|
+
# create new table for unknown information
|
|
12048
|
+
my $tbl = sprintf('Image::ExifTool::Nikon::UnknownInfo%.2x', $pos);
|
|
12049
|
+
no strict 'refs';
|
|
12050
|
+
unless (%$tbl) {
|
|
12051
|
+
%$tbl = ( %binaryDataAttrs, GROUPS => { 0=>'MakerNotes', 2=>'Unknown' } );
|
|
12052
|
+
GetTagTable($tbl);
|
|
12053
|
+
}
|
|
12054
|
+
# add unknown entry in offset table for this subdirectory
|
|
12055
|
+
$tagInfo = AddTagToTable($tagTablePtr, $pos, {
|
|
12056
|
+
Name => sprintf('UnknownOffset%.2x', $pos),
|
|
12057
|
+
Format => 'int32u',
|
|
12058
|
+
SubDirectory => { TagTable => $tbl },
|
|
12059
|
+
Unknown => 2,
|
|
12060
|
+
});
|
|
12061
|
+
}
|
|
12062
|
+
push @offInfo, [ $pos, $off, $known ]; # save parameters for non-zero offsets
|
|
12063
|
+
}
|
|
12064
|
+
# sort offsets in ascending order, and use the differences to calculate
|
|
12065
|
+
# directory lengths and update the SubDirectory DirLen's accordingly
|
|
12066
|
+
my @sorted = sort { $$a[1] <=> $$b[1] or $$a[0] <=> $$b[0] } @offInfo;
|
|
12067
|
+
push @sorted, [ 0, length($$dataPt), 0 ];
|
|
12068
|
+
for ($i=0; $i<@sorted-1; ++$i) {
|
|
12069
|
+
my $pos = $sorted[$i][0];
|
|
12070
|
+
my $len = $sorted[$i+1][1] - $sorted[$i][1];
|
|
12071
|
+
# set DirLen in SubDirectory entry
|
|
12072
|
+
my $tagInfo = $$tagTablePtr{$pos};
|
|
12073
|
+
my $subdir;
|
|
12074
|
+
$$subdir{DirLen} = $len if ref $tagInfo eq 'HASH' and defined($subdir=$$tagInfo{SubDirectory});
|
|
12075
|
+
if ($decryptMode) {
|
|
12076
|
+
# keep track of end of last known directory
|
|
12077
|
+
$end = $sorted[$i+1][1] if $sorted[$i][2];
|
|
12078
|
+
} elsif ($tagInfo and (ref $tagInfo ne 'HASH' or not $$tagInfo{Unknown})) {
|
|
12079
|
+
# decrypt data piecewise as necessary
|
|
12080
|
+
my $n = $len;
|
|
12081
|
+
if ($subdir and $$subdir{KnownEnd}) {
|
|
12082
|
+
$n = $$subdir{KnownEnd};
|
|
12083
|
+
if ($n > $len) {
|
|
12084
|
+
$et->Warn("Data too short for $$tagInfo{Name}",1);
|
|
12085
|
+
$n = $len;
|
|
12086
|
+
}
|
|
12087
|
+
}
|
|
12088
|
+
$$dataPt = Decrypt($dataPt, $sorted[$i][1], $n);
|
|
12089
|
+
}
|
|
12090
|
+
}
|
|
12091
|
+
if ($decryptMode) {
|
|
12092
|
+
# decrypt the remaining required data
|
|
12093
|
+
$end = length $$dataPt if $decryptMode == 2 or not $end or $end < $dpos;
|
|
12094
|
+
$$dataPt = Decrypt($dataPt, $dpos, $end - $dpos);
|
|
12095
|
+
}
|
|
12096
|
+
return $end;
|
|
12097
|
+
}
|
|
12098
|
+
|
|
12004
12099
|
#------------------------------------------------------------------------------
|
|
12005
12100
|
# Read/Write Nikon Encrypted data block
|
|
12006
12101
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
@@ -12025,15 +12120,17 @@ sub ProcessNikonEncrypted($$$)
|
|
|
12025
12120
|
delete $$et{NikonCountKey};
|
|
12026
12121
|
return 0;
|
|
12027
12122
|
}
|
|
12028
|
-
my $
|
|
12123
|
+
my $oldOrder = GetByteOrder();
|
|
12124
|
+
my $isWriting = $$dirInfo{IsWriting};
|
|
12125
|
+
my $verbose = $isWriting ? 0 : $et->Options('Verbose');
|
|
12029
12126
|
my $tagInfo = $$dirInfo{TagInfo};
|
|
12030
12127
|
my $dirStart = $$dirInfo{DirStart};
|
|
12031
12128
|
my $data = substr(${$$dirInfo{DataPt}}, $dirStart, $$dirInfo{DirLen});
|
|
12032
12129
|
|
|
12033
|
-
my ($start, $len, $
|
|
12130
|
+
my ($start, $len, $offset, $recrypt, $newSerial, $newCount, $didDecrypt);
|
|
12034
12131
|
|
|
12035
12132
|
# must re-encrypt when writing if serial number or shutter count changes
|
|
12036
|
-
if (
|
|
12133
|
+
if ($isWriting) {
|
|
12037
12134
|
if ($$et{NewNikonSerialKey}) {
|
|
12038
12135
|
$newSerial = $$et{NewNikonSerialKey};
|
|
12039
12136
|
$recrypt = 1;
|
|
@@ -12044,46 +12141,43 @@ sub ProcessNikonEncrypted($$$)
|
|
|
12044
12141
|
}
|
|
12045
12142
|
}
|
|
12046
12143
|
if ($tagInfo and $$tagInfo{SubDirectory}) {
|
|
12047
|
-
|
|
12048
|
-
|
|
12049
|
-
|
|
12050
|
-
|
|
12051
|
-
|
|
12144
|
+
# initialize SubDirectory entries used in encryption (KnownStart, KnownEnd)
|
|
12145
|
+
InitEncryptedSubdir($tagInfo, $tagTablePtr);
|
|
12146
|
+
my $subdir = $$tagInfo{SubDirectory};
|
|
12147
|
+
$start = $$subdir{DecryptStart} || 0;
|
|
12148
|
+
# DirOffset, if specified, is the offset to the start of the
|
|
12149
|
+
# directory relative to start of encrypted data
|
|
12150
|
+
$offset = defined $$subdir{DirOffset} ? $$subdir{DirOffset} + $start : 0;
|
|
12151
|
+
# must set byte ordering before calling PrepareNikonOffsets()
|
|
12152
|
+
SetByteOrder($$subdir{ByteOrder}) if $$subdir{ByteOrder};
|
|
12153
|
+
# prepare for processing NIKON_OFFSETS directory if necessary
|
|
12154
|
+
my $unknown = $verbose > 2 || $et->Options('Unknown') > 1;
|
|
12155
|
+
# decrypt mode: 0=piecewise, 1=continuous to end of last known section, 2=all
|
|
12156
|
+
my $dMode = $isWriting ? ($recrypt ? 2 : 1) : ($unknown ? 2 : 0);
|
|
12157
|
+
if ($$tagTablePtr{VARS}{NIKON_OFFSETS}) {
|
|
12158
|
+
$len = PrepareNikonOffsets($et, \$data, $tagTablePtr, $start, $dMode);
|
|
12159
|
+
$didDecrypt = 1;
|
|
12160
|
+
} elsif ($dMode < 2) {
|
|
12161
|
+
if ($dMode == 0 and $$subdir{KnownStart}) {
|
|
12162
|
+
# initialize decryption parameters for address DecryptStart address
|
|
12163
|
+
Decrypt(\$data, $start, 0, $serial, $count);
|
|
12164
|
+
# reset serial/count keys so we don't re-initialize below
|
|
12165
|
+
undef $serial;
|
|
12166
|
+
undef $count;
|
|
12167
|
+
# change decryption start to skip unnecessary data
|
|
12168
|
+
$start = $$subdir{KnownStart};
|
|
12169
|
+
}
|
|
12170
|
+
$len = $$subdir{KnownEnd} - $start if $$subdir{KnownEnd};
|
|
12052
12171
|
}
|
|
12053
|
-
$offset = $$tagInfo{SubDirectory}{DirOffset};
|
|
12054
|
-
$byteOrder = $$tagInfo{SubDirectory}{ByteOrder};
|
|
12055
|
-
}
|
|
12056
|
-
$start or $start = 0;
|
|
12057
|
-
if (defined $offset) {
|
|
12058
|
-
# offset, if specified, is relative to start of encrypted data
|
|
12059
|
-
$offset += $start;
|
|
12060
12172
|
} else {
|
|
12061
|
-
$offset = 0;
|
|
12173
|
+
$start = $offset = 0;
|
|
12062
12174
|
}
|
|
12063
12175
|
my $maxLen = length($data) - $start;
|
|
12064
|
-
# decrypt all the data unless
|
|
12065
|
-
unless
|
|
12066
|
-
$len = $maxLen;
|
|
12067
|
-
undef $more; # (can't decrypt more than this)
|
|
12068
|
-
}
|
|
12176
|
+
# decrypt all the data unless the length was specified
|
|
12177
|
+
$len = $maxLen unless $len and $len < $maxLen;
|
|
12069
12178
|
|
|
12070
|
-
$data = Decrypt(\$data, $
|
|
12179
|
+
$data = Decrypt(\$data, $start, $len, $serial, $count) unless $didDecrypt;
|
|
12071
12180
|
|
|
12072
|
-
# set appropriate byte ordering before evaluating DecryptMore
|
|
12073
|
-
my $oldOrder = GetByteOrder();
|
|
12074
|
-
SetByteOrder($byteOrder) if $byteOrder;
|
|
12075
|
-
|
|
12076
|
-
if ($more) {
|
|
12077
|
-
#### eval DecryptMore ($data)
|
|
12078
|
-
my $moreLen = eval $more;
|
|
12079
|
-
$moreLen = $maxLen if $moreLen > $maxLen;
|
|
12080
|
-
# re-decrypt with new length
|
|
12081
|
-
if ($len < $moreLen) {
|
|
12082
|
-
$len = $moreLen;
|
|
12083
|
-
$data = substr(${$$dirInfo{DataPt}}, $dirStart, $$dirInfo{DirLen});
|
|
12084
|
-
$data = Decrypt(\$data, $serial, $count, $start, $len);
|
|
12085
|
-
}
|
|
12086
|
-
}
|
|
12087
12181
|
if ($verbose > 2) {
|
|
12088
12182
|
$et->VerboseDir("Decrypted $$tagInfo{Name}");
|
|
12089
12183
|
$et->VerboseDump(\$data,
|
|
@@ -12102,7 +12196,7 @@ sub ProcessNikonEncrypted($$$)
|
|
|
12102
12196
|
Base => $$dirInfo{Base},
|
|
12103
12197
|
);
|
|
12104
12198
|
my $rtnVal;
|
|
12105
|
-
if (
|
|
12199
|
+
if ($isWriting) {
|
|
12106
12200
|
my $changed = $$et{CHANGED};
|
|
12107
12201
|
$rtnVal = $et->WriteBinaryData(\%subdirInfo, $tagTablePtr);
|
|
12108
12202
|
# must re-encrypt if serial number or shutter count changes
|
|
@@ -12117,7 +12211,8 @@ sub ProcessNikonEncrypted($$$)
|
|
|
12117
12211
|
# add back any un-encrypted data at start
|
|
12118
12212
|
$rtnVal = substr($data, 0, $offset) . $rtnVal if $offset;
|
|
12119
12213
|
# re-encrypt data (symmetrical algorithm)
|
|
12120
|
-
$rtnVal = Decrypt(\$rtnVal, $
|
|
12214
|
+
$rtnVal = Decrypt(\$rtnVal, $start, $len, $serial, $count);
|
|
12215
|
+
$et->VPrint(2, $$et{INDENT}, " [recrypted $$tagInfo{Name}]");
|
|
12121
12216
|
}
|
|
12122
12217
|
} else {
|
|
12123
12218
|
$rtnVal = $et->ProcessBinaryData(\%subdirInfo, $tagTablePtr);
|