exiftool_vendored 12.56.0 → 12.57.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +21 -2
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +74 -30
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +7 -2
- data/bin/lib/Image/ExifTool/FlashPix.pm +4 -0
- data/bin/lib/Image/ExifTool/GPS.pm +7 -2
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- data/bin/lib/Image/ExifTool/MIE.pm +3 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +665 -845
- 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/Photoshop.pm +36 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +18 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +2 -0
- data/bin/lib/Image/ExifTool/README +11 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +2 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4654 -4628
- data/bin/lib/Image/ExifTool/TagNames.pod +194 -86
- data/bin/lib/Image/ExifTool/Writer.pl +36 -16
- data/bin/lib/Image/ExifTool.pm +38 -22
- 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.19';
|
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($$);
|
@@ -1112,6 +1113,14 @@ my %offLowNormalHighZ7 = (
|
|
1112
1113
|
3 => 'High',
|
1113
1114
|
);
|
1114
1115
|
|
1116
|
+
my %releaseModeZ7 = (
|
1117
|
+
0 => 'Continuous Low',
|
1118
|
+
1 => 'Continuous High',
|
1119
|
+
2 => 'Continuous High (Extended)',
|
1120
|
+
4 => 'Timer',
|
1121
|
+
5 => 'Single Frame',
|
1122
|
+
);
|
1123
|
+
|
1115
1124
|
my %secondarySlotFunctionZ9 = (
|
1116
1125
|
0 => 'Overflow',
|
1117
1126
|
1 => 'Backup',
|
@@ -1509,9 +1518,7 @@ my %base64coord = (
|
|
1509
1518
|
0x0006 => { Name => 'Sharpness', Writable => 'string' },
|
1510
1519
|
0x0007 => {
|
1511
1520
|
Name => 'FocusMode',
|
1512
|
-
DataMember => 'FocusMode',
|
1513
1521
|
Writable => 'string',
|
1514
|
-
RawConv => '$$self{FocusMode} = $val',
|
1515
1522
|
},
|
1516
1523
|
# FlashSetting (better named FlashSyncMode, ref 28) values:
|
1517
1524
|
# "Normal", "Slow", "Rear Slow", "RED-EYE", "RED-EYE SLOW"
|
@@ -1812,6 +1819,7 @@ my %base64coord = (
|
|
1812
1819
|
Name => 'ShutterMode',
|
1813
1820
|
Writable => 'int16u',
|
1814
1821
|
RawConv => '$$self{ShutterMode} = $val',
|
1822
|
+
DataMember => 'ShutterMode',
|
1815
1823
|
PrintConv => {
|
1816
1824
|
0 => 'Mechanical',
|
1817
1825
|
16 => 'Electronic',
|
@@ -2184,8 +2192,6 @@ my %base64coord = (
|
|
2184
2192
|
SubDirectory => {
|
2185
2193
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD810',
|
2186
2194
|
DecryptStart => 4,
|
2187
|
-
DecryptLen => 0x36f4 + 12,
|
2188
|
-
DecryptMore => 'Get32u(\$data, 0x84) + 12',
|
2189
2195
|
ByteOrder => 'LittleEndian',
|
2190
2196
|
},
|
2191
2197
|
},
|
@@ -2195,8 +2201,6 @@ my %base64coord = (
|
|
2195
2201
|
SubDirectory => {
|
2196
2202
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD850',
|
2197
2203
|
DecryptStart => 4,
|
2198
|
-
DecryptLen => 0x2efb + 12,
|
2199
|
-
DecryptMore => 'Get32u(\$data, 0xa0) + 12',
|
2200
2204
|
ByteOrder => 'LittleEndian',
|
2201
2205
|
},
|
2202
2206
|
},
|
@@ -2263,25 +2267,12 @@ my %base64coord = (
|
|
2263
2267
|
ByteOrder => 'LittleEndian',
|
2264
2268
|
},
|
2265
2269
|
},
|
2266
|
-
{ #28 (D5 firmware version 1.10a)
|
2267
|
-
Condition => '$$valPt =~ /^
|
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
|
-
ByteOrder => 'LittleEndian',
|
2275
|
-
},
|
2276
|
-
},
|
2277
|
-
{ # (D500 firmware version 1.00)
|
2278
|
-
Condition => '$$valPt =~ /^0239/',
|
2270
|
+
{ #28 (D500 firmware version 1.00 and D5 firmware version 1.10a)
|
2271
|
+
Condition => '$$valPt =~ /^023[89]/',
|
2279
2272
|
Name => 'ShotInfoD500',
|
2280
2273
|
SubDirectory => {
|
2281
2274
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD500',
|
2282
2275
|
DecryptStart => 4,
|
2283
|
-
DecryptLen => 0x2cb2 + 4,
|
2284
|
-
DecryptMore => 'Get32u(\$data, 0xa8) + 0x2ea5 - 0x2c90',
|
2285
2276
|
ByteOrder => 'LittleEndian',
|
2286
2277
|
},
|
2287
2278
|
},
|
@@ -2291,7 +2282,6 @@ my %base64coord = (
|
|
2291
2282
|
SubDirectory => {
|
2292
2283
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoD6',
|
2293
2284
|
DecryptStart => 4,
|
2294
|
-
DecryptLen => 0xc292 + 720, # thru decoded parts of Offset 32
|
2295
2285
|
ByteOrder => 'LittleEndian',
|
2296
2286
|
},
|
2297
2287
|
},
|
@@ -2312,8 +2302,6 @@ my %base64coord = (
|
|
2312
2302
|
SubDirectory => {
|
2313
2303
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ7II',
|
2314
2304
|
DecryptStart => 4,
|
2315
|
-
# TODO: eventually set the length dynamically according to actual offsets!
|
2316
|
-
DecryptLen => 0xd04e + 860, # thru decoded MenuSettingsZ7II
|
2317
2305
|
ByteOrder => 'LittleEndian',
|
2318
2306
|
},
|
2319
2307
|
},
|
@@ -2323,8 +2311,6 @@ my %base64coord = (
|
|
2323
2311
|
SubDirectory => {
|
2324
2312
|
TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
|
2325
2313
|
DecryptStart => 4,
|
2326
|
-
# TODO: eventually set the length dynamically according to actual offsets!
|
2327
|
-
DecryptLen => 0xec4b + 2196, # decoded thru end of Offset26
|
2328
2314
|
ByteOrder => 'LittleEndian',
|
2329
2315
|
},
|
2330
2316
|
},
|
@@ -2333,8 +2319,8 @@ my %base64coord = (
|
|
2333
2319
|
Name => 'ShotInfo02xx',
|
2334
2320
|
SubDirectory => {
|
2335
2321
|
TagTable => 'Image::ExifTool::Nikon::ShotInfo',
|
2336
|
-
ProcessProc => \&
|
2337
|
-
WriteProc => \&
|
2322
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2323
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2338
2324
|
DecryptStart => 4,
|
2339
2325
|
DecryptLen => 0x251,
|
2340
2326
|
ByteOrder => 'BigEndian',
|
@@ -2400,8 +2386,8 @@ my %base64coord = (
|
|
2400
2386
|
Name => 'ColorBalance0205',
|
2401
2387
|
SubDirectory => {
|
2402
2388
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
2403
|
-
ProcessProc => \&
|
2404
|
-
WriteProc => \&
|
2389
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2390
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2405
2391
|
DecryptStart => 4,
|
2406
2392
|
DecryptLen => 22, # 284 bytes encrypted, but don't need to decrypt it all
|
2407
2393
|
DirOffset => 14,
|
@@ -2412,8 +2398,8 @@ my %base64coord = (
|
|
2412
2398
|
Name => 'ColorBalance0209',
|
2413
2399
|
SubDirectory => {
|
2414
2400
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
|
2415
|
-
ProcessProc => \&
|
2416
|
-
WriteProc => \&
|
2401
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2402
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2417
2403
|
DecryptStart => 284,
|
2418
2404
|
DecryptLen => 18, # 324 bytes encrypted, but don't need to decrypt it all
|
2419
2405
|
DirOffset => 10,
|
@@ -2424,8 +2410,8 @@ my %base64coord = (
|
|
2424
2410
|
Name => 'ColorBalance02',
|
2425
2411
|
SubDirectory => {
|
2426
2412
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
2427
|
-
ProcessProc => \&
|
2428
|
-
WriteProc => \&
|
2413
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2414
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2429
2415
|
DecryptStart => 284,
|
2430
2416
|
DecryptLen => 14, # don't need to decrypt it all
|
2431
2417
|
DirOffset => 6,
|
@@ -2436,8 +2422,8 @@ 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
2428
|
DecryptLen => 24, # don't need to decrypt it all
|
2443
2429
|
DirOffset => 16,
|
@@ -2448,8 +2434,8 @@ my %base64coord = (
|
|
2448
2434
|
Name => 'ColorBalance0213',
|
2449
2435
|
SubDirectory => {
|
2450
2436
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
2451
|
-
ProcessProc => \&
|
2452
|
-
WriteProc => \&
|
2437
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2438
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2453
2439
|
DecryptStart => 284,
|
2454
2440
|
DecryptLen => 18, # don't need to decrypt it all
|
2455
2441
|
DirOffset => 10,
|
@@ -2460,8 +2446,8 @@ my %base64coord = (
|
|
2460
2446
|
Name => 'ColorBalance0215',
|
2461
2447
|
SubDirectory => {
|
2462
2448
|
TagTable => 'Image::ExifTool::Nikon::ColorBalance4',
|
2463
|
-
ProcessProc => \&
|
2464
|
-
WriteProc => \&
|
2449
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2450
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2465
2451
|
DecryptStart => 284,
|
2466
2452
|
DecryptLen => 12, # don't need to decrypt it all
|
2467
2453
|
DirOffset => 4,
|
@@ -2472,7 +2458,8 @@ my %base64coord = (
|
|
2472
2458
|
Condition => '$$valPt =~ /^0[26]/',
|
2473
2459
|
SubDirectory => {
|
2474
2460
|
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
|
2475
|
-
ProcessProc => \&
|
2461
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2462
|
+
WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
|
2476
2463
|
DecryptStart => 284,
|
2477
2464
|
DecryptLen => 10, # (arbitrary)
|
2478
2465
|
},
|
@@ -2482,7 +2469,8 @@ my %base64coord = (
|
|
2482
2469
|
Condition => '$$valPt =~ /^0[48]/',
|
2483
2470
|
SubDirectory => {
|
2484
2471
|
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
|
2485
|
-
ProcessProc => \&
|
2472
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2473
|
+
WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
|
2486
2474
|
DecryptStart => 4,
|
2487
2475
|
DecryptLen => 10, # (arbitrary)
|
2488
2476
|
},
|
@@ -2513,8 +2501,8 @@ my %base64coord = (
|
|
2513
2501
|
Name => 'LensData0201',
|
2514
2502
|
SubDirectory => {
|
2515
2503
|
TagTable => 'Image::ExifTool::Nikon::LensData01',
|
2516
|
-
ProcessProc => \&
|
2517
|
-
WriteProc => \&
|
2504
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2505
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2518
2506
|
DecryptStart => 4,
|
2519
2507
|
},
|
2520
2508
|
},
|
@@ -2523,8 +2511,8 @@ my %base64coord = (
|
|
2523
2511
|
Name => 'LensData0204',
|
2524
2512
|
SubDirectory => {
|
2525
2513
|
TagTable => 'Image::ExifTool::Nikon::LensData0204',
|
2526
|
-
ProcessProc => \&
|
2527
|
-
WriteProc => \&
|
2514
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2515
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2528
2516
|
DecryptStart => 4,
|
2529
2517
|
},
|
2530
2518
|
},
|
@@ -2533,8 +2521,8 @@ my %base64coord = (
|
|
2533
2521
|
Name => 'LensData0400',
|
2534
2522
|
SubDirectory => {
|
2535
2523
|
TagTable => 'Image::ExifTool::Nikon::LensData0400',
|
2536
|
-
ProcessProc => \&
|
2537
|
-
WriteProc => \&
|
2524
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2525
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2538
2526
|
DecryptStart => 4,
|
2539
2527
|
},
|
2540
2528
|
},
|
@@ -2543,8 +2531,8 @@ my %base64coord = (
|
|
2543
2531
|
Name => 'LensData0402',
|
2544
2532
|
SubDirectory => {
|
2545
2533
|
TagTable => 'Image::ExifTool::Nikon::LensData0402',
|
2546
|
-
ProcessProc => \&
|
2547
|
-
WriteProc => \&
|
2534
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2535
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2548
2536
|
DecryptStart => 4,
|
2549
2537
|
},
|
2550
2538
|
},
|
@@ -2553,8 +2541,8 @@ my %base64coord = (
|
|
2553
2541
|
Name => 'LensData0403',
|
2554
2542
|
SubDirectory => {
|
2555
2543
|
TagTable => 'Image::ExifTool::Nikon::LensData0403',
|
2556
|
-
ProcessProc => \&
|
2557
|
-
WriteProc => \&
|
2544
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2545
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2558
2546
|
DecryptStart => 4,
|
2559
2547
|
},
|
2560
2548
|
},
|
@@ -2563,8 +2551,8 @@ my %base64coord = (
|
|
2563
2551
|
Name => 'LensData0800',
|
2564
2552
|
SubDirectory => {
|
2565
2553
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|
2566
|
-
ProcessProc => \&
|
2567
|
-
WriteProc => \&
|
2554
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2555
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2568
2556
|
DecryptStart => 4,
|
2569
2557
|
ByteOrder => 'LittleEndian',
|
2570
2558
|
},
|
@@ -2573,8 +2561,8 @@ my %base64coord = (
|
|
2573
2561
|
Name => 'LensDataUnknown',
|
2574
2562
|
SubDirectory => {
|
2575
2563
|
TagTable => 'Image::ExifTool::Nikon::LensDataUnknown',
|
2576
|
-
ProcessProc => \&
|
2577
|
-
WriteProc => \&
|
2564
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2565
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2578
2566
|
DecryptStart => 4,
|
2579
2567
|
},
|
2580
2568
|
},
|
@@ -5305,12 +5293,14 @@ my %nikonFocalConversions = (
|
|
5305
5293
|
23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
|
5306
5294
|
24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
|
5307
5295
|
25 => 'Nikkor Z 40mm f/2', #28
|
5296
|
+
26 => 'Nikkor Z DX 18-140mm f/3.5-6.3 VR', #IB
|
5308
5297
|
27 => 'Nikkor Z MC 50mm f/2.8', #IB
|
5309
5298
|
28 => 'Nikkor Z 100-400mm f/4.5-5.6 VR S', #28
|
5310
5299
|
29 => 'Nikkor Z 28mm f/2.8', #IB
|
5311
5300
|
30 => 'Nikkor Z 400mm f/2.8 TC VR S', #28
|
5312
5301
|
31 => 'Nikkor Z 24-120 f/4', #28
|
5313
5302
|
32 => 'Nikkor Z 800mm f/6.3 VR S', #28
|
5303
|
+
35 => 'Nikkor Z 28-75mm f/2.8', #IB
|
5314
5304
|
36 => 'Nikkor Z 400mm f/4.5 VR S', #IB
|
5315
5305
|
37 => 'Nikkor Z 600mm f/4 TC VR S', #28
|
5316
5306
|
39 => 'Nikkor Z 17-28mm f/2.8', #IB
|
@@ -5521,8 +5511,8 @@ my %nikonFocalConversions = (
|
|
5521
5511
|
|
5522
5512
|
# shot information for D40 and D40X (encrypted) - ref PH
|
5523
5513
|
%Image::ExifTool::Nikon::ShotInfoD40 = (
|
5524
|
-
PROCESS_PROC => \&
|
5525
|
-
WRITE_PROC => \&
|
5514
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5515
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5526
5516
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5527
5517
|
VARS => { ID_LABEL => 'Index' },
|
5528
5518
|
IS_SUBDIR => [ 729 ],
|
@@ -5557,8 +5547,8 @@ my %nikonFocalConversions = (
|
|
5557
5547
|
|
5558
5548
|
# shot information for D80 (encrypted) - ref JD
|
5559
5549
|
%Image::ExifTool::Nikon::ShotInfoD80 = (
|
5560
|
-
PROCESS_PROC => \&
|
5561
|
-
WRITE_PROC => \&
|
5550
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5551
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5562
5552
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5563
5553
|
VARS => { ID_LABEL => 'Index' },
|
5564
5554
|
IS_SUBDIR => [ 748 ],
|
@@ -5637,8 +5627,8 @@ my %nikonFocalConversions = (
|
|
5637
5627
|
|
5638
5628
|
# shot information for D90 (encrypted) - ref PH
|
5639
5629
|
%Image::ExifTool::Nikon::ShotInfoD90 = (
|
5640
|
-
PROCESS_PROC => \&
|
5641
|
-
WRITE_PROC => \&
|
5630
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5631
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5642
5632
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5643
5633
|
VARS => { ID_LABEL => 'Index' },
|
5644
5634
|
IS_SUBDIR => [ 0x374 ],
|
@@ -5683,8 +5673,8 @@ my %nikonFocalConversions = (
|
|
5683
5673
|
|
5684
5674
|
# shot information for the D3 firmware 0.37 and 1.00 (encrypted) - ref PH
|
5685
5675
|
%Image::ExifTool::Nikon::ShotInfoD3a = (
|
5686
|
-
PROCESS_PROC => \&
|
5687
|
-
WRITE_PROC => \&
|
5676
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5677
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5688
5678
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5689
5679
|
VARS => { ID_LABEL => 'Index' },
|
5690
5680
|
IS_SUBDIR => [ 0x301 ],
|
@@ -5747,8 +5737,8 @@ my %nikonFocalConversions = (
|
|
5747
5737
|
|
5748
5738
|
# shot information for the D3 firmware 1.10, 2.00 and 2.01 (encrypted) - ref PH
|
5749
5739
|
%Image::ExifTool::Nikon::ShotInfoD3b = (
|
5750
|
-
PROCESS_PROC => \&
|
5751
|
-
WRITE_PROC => \&
|
5740
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5741
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5752
5742
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5753
5743
|
VARS => { ID_LABEL => 'Index' },
|
5754
5744
|
IS_SUBDIR => [ 0x30a ],
|
@@ -5842,8 +5832,8 @@ my %nikonFocalConversions = (
|
|
5842
5832
|
|
5843
5833
|
# shot information for the D3X firmware 1.00 (encrypted) - ref PH
|
5844
5834
|
%Image::ExifTool::Nikon::ShotInfoD3X = (
|
5845
|
-
PROCESS_PROC => \&
|
5846
|
-
WRITE_PROC => \&
|
5835
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5836
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5847
5837
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5848
5838
|
VARS => { ID_LABEL => 'Index' },
|
5849
5839
|
IS_SUBDIR => [ 0x30b ],
|
@@ -5888,8 +5878,8 @@ my %nikonFocalConversions = (
|
|
5888
5878
|
|
5889
5879
|
# shot information for the D3S firmware 0.16 and 1.00 (encrypted) - ref PH
|
5890
5880
|
%Image::ExifTool::Nikon::ShotInfoD3S = (
|
5891
|
-
PROCESS_PROC => \&
|
5892
|
-
WRITE_PROC => \&
|
5881
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5882
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5893
5883
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5894
5884
|
VARS => { ID_LABEL => 'Index' },
|
5895
5885
|
IS_SUBDIR => [ 0x2ce ],
|
@@ -5943,8 +5933,8 @@ my %nikonFocalConversions = (
|
|
5943
5933
|
|
5944
5934
|
# shot information for the D300 firmware 1.00 (encrypted) - ref JD
|
5945
5935
|
%Image::ExifTool::Nikon::ShotInfoD300a = (
|
5946
|
-
PROCESS_PROC => \&
|
5947
|
-
WRITE_PROC => \&
|
5936
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
5937
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
5948
5938
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
5949
5939
|
VARS => { ID_LABEL => 'Index' },
|
5950
5940
|
IS_SUBDIR => [ 790 ],
|
@@ -6036,8 +6026,8 @@ my %nikonFocalConversions = (
|
|
6036
6026
|
|
6037
6027
|
# shot information for the D300 firmware 1.10 (encrypted) - ref PH
|
6038
6028
|
%Image::ExifTool::Nikon::ShotInfoD300b = (
|
6039
|
-
PROCESS_PROC => \&
|
6040
|
-
WRITE_PROC => \&
|
6029
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6030
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6041
6031
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6042
6032
|
VARS => { ID_LABEL => 'Index' },
|
6043
6033
|
DATAMEMBER => [ 4 ],
|
@@ -6187,8 +6177,8 @@ my %nikonFocalConversions = (
|
|
6187
6177
|
|
6188
6178
|
# shot information for the D300S firmware 1.00 (encrypted) - ref PH
|
6189
6179
|
%Image::ExifTool::Nikon::ShotInfoD300S = (
|
6190
|
-
PROCESS_PROC => \&
|
6191
|
-
WRITE_PROC => \&
|
6180
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6181
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6192
6182
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6193
6183
|
VARS => { ID_LABEL => 'Index' },
|
6194
6184
|
IS_SUBDIR => [ 804 ],
|
@@ -6233,8 +6223,8 @@ my %nikonFocalConversions = (
|
|
6233
6223
|
|
6234
6224
|
# shot information for the D700 firmware 1.02f (encrypted) - ref 29
|
6235
6225
|
%Image::ExifTool::Nikon::ShotInfoD700 = (
|
6236
|
-
PROCESS_PROC => \&
|
6237
|
-
WRITE_PROC => \&
|
6226
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6227
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6238
6228
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6239
6229
|
VARS => { ID_LABEL => 'Index' },
|
6240
6230
|
IS_SUBDIR => [ 804 ],
|
@@ -6279,8 +6269,8 @@ my %nikonFocalConversions = (
|
|
6279
6269
|
|
6280
6270
|
# shot information for the D5000 firmware 1.00 (encrypted) - ref PH
|
6281
6271
|
%Image::ExifTool::Nikon::ShotInfoD5000 = (
|
6282
|
-
PROCESS_PROC => \&
|
6283
|
-
WRITE_PROC => \&
|
6272
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6273
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6284
6274
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6285
6275
|
VARS => { ID_LABEL => 'Index' },
|
6286
6276
|
IS_SUBDIR => [ 0x378 ],
|
@@ -6325,8 +6315,8 @@ my %nikonFocalConversions = (
|
|
6325
6315
|
|
6326
6316
|
# shot information for the D5100 firmware 1.00f (encrypted) - ref PH
|
6327
6317
|
%Image::ExifTool::Nikon::ShotInfoD5100 = (
|
6328
|
-
PROCESS_PROC => \&
|
6329
|
-
WRITE_PROC => \&
|
6318
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6319
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6330
6320
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6331
6321
|
VARS => { ID_LABEL => 'Index' },
|
6332
6322
|
IS_SUBDIR => [ 0x407 ],
|
@@ -6360,8 +6350,8 @@ my %nikonFocalConversions = (
|
|
6360
6350
|
|
6361
6351
|
# shot information for the D5200 firmware 1.00 (encrypted) - ref PH
|
6362
6352
|
%Image::ExifTool::Nikon::ShotInfoD5200 = (
|
6363
|
-
PROCESS_PROC => \&
|
6364
|
-
WRITE_PROC => \&
|
6353
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6354
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6365
6355
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6366
6356
|
VARS => { ID_LABEL => 'Index' },
|
6367
6357
|
IS_SUBDIR => [ 0xcd5 ],
|
@@ -6398,8 +6388,8 @@ my %nikonFocalConversions = (
|
|
6398
6388
|
|
6399
6389
|
# shot information for the D7000 firmware 1.01d (encrypted) - ref 29
|
6400
6390
|
%Image::ExifTool::Nikon::ShotInfoD7000 = (
|
6401
|
-
PROCESS_PROC => \&
|
6402
|
-
WRITE_PROC => \&
|
6391
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6392
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6403
6393
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6404
6394
|
VARS => { ID_LABEL => 'Index' },
|
6405
6395
|
IS_SUBDIR => [ 1028 ],
|
@@ -6443,8 +6433,8 @@ my %nikonFocalConversions = (
|
|
6443
6433
|
|
6444
6434
|
# shot information for the D800 firmware 1.01a (encrypted) - ref PH
|
6445
6435
|
%Image::ExifTool::Nikon::ShotInfoD800 = (
|
6446
|
-
PROCESS_PROC => \&
|
6447
|
-
WRITE_PROC => \&
|
6436
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6437
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6448
6438
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6449
6439
|
VARS => { ID_LABEL => 'Index' },
|
6450
6440
|
IS_SUBDIR => [ 0x6ec ],
|
@@ -6564,15 +6554,13 @@ my %nikonFocalConversions = (
|
|
6564
6554
|
|
6565
6555
|
# shot information for the D5 firmware 1.10a and D500 firmware 1.01 (encrypted) - ref 28
|
6566
6556
|
%Image::ExifTool::Nikon::ShotInfoD500 = (
|
6567
|
-
PROCESS_PROC => \&
|
6568
|
-
WRITE_PROC => \&
|
6557
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
6558
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
6569
6559
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
6570
|
-
VARS => { ID_LABEL => 'Index' },
|
6571
|
-
DATAMEMBER => [ 0x04
|
6572
|
-
|
6573
|
-
IS_SUBDIR => [ 0x0eeb ],
|
6560
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
6561
|
+
DATAMEMBER => [ 0x04 ],
|
6562
|
+
IS_SUBDIR => [ 0x10, 0x14, 0x2c, 0x50, 0x58, 0xa0, 0xa8 ],
|
6574
6563
|
WRITABLE => 1,
|
6575
|
-
FIRST_ENTRY => 0,
|
6576
6564
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6577
6565
|
NOTES => 'These tags are extracted from encrypted data in images from the D5 and D500.',
|
6578
6566
|
0x00 => {
|
@@ -6589,73 +6577,66 @@ my %nikonFocalConversions = (
|
|
6589
6577
|
},
|
6590
6578
|
0x10 => {
|
6591
6579
|
Name => 'RotationInfoOffset',
|
6592
|
-
DataMember => 'RotationInfoOffset',
|
6593
6580
|
Format => 'int32u',
|
6594
|
-
|
6595
|
-
|
6596
|
-
|
6581
|
+
SubDirectory => {
|
6582
|
+
TagTable => 'Image::ExifTool::Nikon::RotationInfoD500',
|
6583
|
+
Start => '$val',
|
6584
|
+
}
|
6597
6585
|
},
|
6598
6586
|
0x14 => {
|
6599
6587
|
Name => 'JPGInfoOffset',
|
6600
|
-
DataMember => 'JPGInfoOffset',
|
6601
6588
|
Format => 'int32u',
|
6602
|
-
|
6603
|
-
|
6604
|
-
|
6589
|
+
SubDirectory => {
|
6590
|
+
TagTable => 'Image::ExifTool::Nikon::JPGInfoD500',
|
6591
|
+
Start => '$val',
|
6592
|
+
}
|
6605
6593
|
},
|
6606
6594
|
0x2c => {
|
6607
|
-
Name => '
|
6608
|
-
DataMember => 'BracketingInfoOffset',
|
6595
|
+
Name => 'BracketingOffset',
|
6609
6596
|
Format => 'int32u',
|
6610
|
-
|
6611
|
-
|
6612
|
-
|
6597
|
+
SubDirectory => {
|
6598
|
+
TagTable => 'Image::ExifTool::Nikon::BracketingInfoD500',
|
6599
|
+
Start => '$val',
|
6600
|
+
}
|
6613
6601
|
},
|
6614
6602
|
0x50 => {
|
6615
6603
|
Name => 'ShootingMenuOffset',
|
6616
|
-
DataMember => 'ShootingMenuOffset',
|
6617
6604
|
Format => 'int32u',
|
6618
|
-
|
6619
|
-
|
6620
|
-
|
6605
|
+
SubDirectory => {
|
6606
|
+
TagTable => 'Image::ExifTool::Nikon::ShootingMenuD500',
|
6607
|
+
Start => '$val',
|
6608
|
+
}
|
6621
6609
|
},
|
6622
6610
|
0x58 => {
|
6623
6611
|
Name => 'CustomSettingsOffset',
|
6624
|
-
DataMember => 'CustomSettingsOffset',
|
6625
6612
|
Format => 'int32u',
|
6626
|
-
|
6627
|
-
|
6628
|
-
|
6613
|
+
SubDirectory => {
|
6614
|
+
TagTable => 'Image::ExifTool::Nikon::CustomSettingsD500',
|
6615
|
+
Start => '$val',
|
6616
|
+
}
|
6629
6617
|
},
|
6630
6618
|
0xa0 => {
|
6631
6619
|
Name => 'OrientationOffset',
|
6632
|
-
DataMember => 'OrientationOffset',
|
6633
6620
|
Format => 'int32u',
|
6634
|
-
|
6635
|
-
|
6636
|
-
|
6621
|
+
SubDirectory => {
|
6622
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
6623
|
+
Start => '$val',
|
6624
|
+
}
|
6637
6625
|
},
|
6638
6626
|
0xa8 => {
|
6639
6627
|
Name => 'OtherOffset',
|
6640
|
-
DataMember => 'OtherOffset',
|
6641
6628
|
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',
|
6629
|
+
SubDirectory => {
|
6630
|
+
TagTable => 'Image::ExifTool::Nikon::OtherInfoD500',
|
6631
|
+
Start => '$val',
|
6632
|
+
}
|
6657
6633
|
},
|
6658
|
-
|
6634
|
+
);
|
6635
|
+
|
6636
|
+
%Image::ExifTool::Nikon::RotationInfoD500 = (
|
6637
|
+
%binaryDataAttrs,
|
6638
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6639
|
+
0x1a => {
|
6659
6640
|
Name => 'Rotation',
|
6660
6641
|
Mask => 0x03,
|
6661
6642
|
PrintConv => {
|
@@ -6665,32 +6646,29 @@ my %nikonFocalConversions = (
|
|
6665
6646
|
3 => 'Rotate 180',
|
6666
6647
|
},
|
6667
6648
|
},
|
6668
|
-
|
6649
|
+
0x20 => {
|
6669
6650
|
Name => 'Interval',
|
6670
6651
|
# prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
|
6671
6652
|
Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
|
6672
6653
|
PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
|
6673
6654
|
},
|
6674
|
-
|
6655
|
+
0x24 => {
|
6675
6656
|
Name => 'IntervalFrame',
|
6676
6657
|
# prior version of the d% firmware do not support this tag, nor does the D500 (at least thru firmware 1.3)
|
6677
6658
|
Condition => '$$self{Model} eq "NIKON D5" and $$self{FirmwareVersion} ge "1.40"',
|
6678
6659
|
PrintConv => '$val > 0 ? sprintf("%.0f", $val) : ""',
|
6679
6660
|
},
|
6680
|
-
|
6661
|
+
0x0532 => {
|
6681
6662
|
Name => 'FlickerReductionIndicator',
|
6682
6663
|
Mask => 0x01,
|
6683
6664
|
PrintConv => { 0 => 'On', 1 => 'Off' },
|
6684
6665
|
},
|
6685
|
-
|
6686
|
-
|
6687
|
-
|
6688
|
-
|
6689
|
-
|
6690
|
-
|
6691
|
-
Hook => '$varSize = $$self{JPGInfoOffset} - 0x07b0',
|
6692
|
-
},
|
6693
|
-
0x07d4 => {
|
6666
|
+
);
|
6667
|
+
|
6668
|
+
%Image::ExifTool::Nikon::JPGInfoD500 = (
|
6669
|
+
%binaryDataAttrs,
|
6670
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6671
|
+
0x24 => {
|
6694
6672
|
Name => 'JPGCompression',
|
6695
6673
|
Mask => 0x01,
|
6696
6674
|
PrintConv => {
|
@@ -6698,16 +6676,12 @@ my %nikonFocalConversions = (
|
|
6698
6676
|
1 => 'Optimal Quality',
|
6699
6677
|
},
|
6700
6678
|
},
|
6701
|
-
|
6702
|
-
|
6703
|
-
|
6704
|
-
|
6705
|
-
|
6706
|
-
|
6707
|
-
# account for variable location of Shooting Menu data
|
6708
|
-
Hook => '$varSize = $$self{BracketingInfoOffset} - 0x086c',
|
6709
|
-
},
|
6710
|
-
0x087b => {
|
6679
|
+
);
|
6680
|
+
|
6681
|
+
%Image::ExifTool::Nikon::BracketingInfoD500 = (
|
6682
|
+
%binaryDataAttrs,
|
6683
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6684
|
+
0x0f => {
|
6711
6685
|
Name => 'AEBracketingSteps',
|
6712
6686
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
6713
6687
|
Mask => 0xff,
|
@@ -6765,7 +6739,7 @@ my %nikonFocalConversions = (
|
|
6765
6739
|
0xd6 => '5F3',
|
6766
6740
|
},
|
6767
6741
|
},
|
6768
|
-
|
6742
|
+
0x10 => {
|
6769
6743
|
Name => 'WBBracketingSteps',
|
6770
6744
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
6771
6745
|
Mask => 0xff,
|
@@ -6808,7 +6782,7 @@ my %nikonFocalConversions = (
|
|
6808
6782
|
0x28 => '9F 3',
|
6809
6783
|
},
|
6810
6784
|
},
|
6811
|
-
|
6785
|
+
0x17 => {
|
6812
6786
|
Name => 'ADLBracketingStep',
|
6813
6787
|
Mask => 0xf0,
|
6814
6788
|
PrintConv => {
|
@@ -6820,7 +6794,7 @@ my %nikonFocalConversions = (
|
|
6820
6794
|
8 => 'Auto',
|
6821
6795
|
},
|
6822
6796
|
},
|
6823
|
-
|
6797
|
+
0x18 => {
|
6824
6798
|
Name => 'ADLBracketingType',
|
6825
6799
|
Mask => 0x0f,
|
6826
6800
|
PrintConv => {
|
@@ -6831,23 +6805,12 @@ my %nikonFocalConversions = (
|
|
6831
6805
|
4 => '5 Shots',
|
6832
6806
|
},
|
6833
6807
|
},
|
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 => {
|
6808
|
+
);
|
6809
|
+
|
6810
|
+
%Image::ExifTool::Nikon::ShootingMenuD500 = (
|
6811
|
+
%binaryDataAttrs,
|
6812
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6813
|
+
0x00 => {
|
6851
6814
|
Name => 'PhotoShootingMenuBank',
|
6852
6815
|
Mask => 0x03,
|
6853
6816
|
PrintConv => {
|
@@ -6857,7 +6820,7 @@ my %nikonFocalConversions = (
|
|
6857
6820
|
3 => 'D',
|
6858
6821
|
},
|
6859
6822
|
},
|
6860
|
-
|
6823
|
+
0x02 => {
|
6861
6824
|
Name => 'PrimarySlot',
|
6862
6825
|
Condition => '$$self{Model} =~ /\bD500\b/',
|
6863
6826
|
Notes => 'D500 only',
|
@@ -6867,7 +6830,7 @@ my %nikonFocalConversions = (
|
|
6867
6830
|
1 => 'SD Card',
|
6868
6831
|
},
|
6869
6832
|
},
|
6870
|
-
|
6833
|
+
0x04 => {
|
6871
6834
|
Name => 'ISOAutoShutterTime',
|
6872
6835
|
Mask => 0x3f,
|
6873
6836
|
PrintConv => {
|
@@ -6910,7 +6873,7 @@ my %nikonFocalConversions = (
|
|
6910
6873
|
36 => 'Auto (Fastest)',
|
6911
6874
|
},
|
6912
6875
|
},
|
6913
|
-
|
6876
|
+
0x05 => {
|
6914
6877
|
Name => 'ISOAutoHiLimit',
|
6915
6878
|
Mask => 0xff,
|
6916
6879
|
PrintHex => 1,
|
@@ -6958,7 +6921,7 @@ my %nikonFocalConversions = (
|
|
6958
6921
|
0x72 => 'ISO Hi 5.0',
|
6959
6922
|
},
|
6960
6923
|
},
|
6961
|
-
|
6924
|
+
0x07 => {
|
6962
6925
|
Name => 'FlickerReduction',
|
6963
6926
|
Mask => 0x20,
|
6964
6927
|
PrintConv => {
|
@@ -6966,7 +6929,7 @@ my %nikonFocalConversions = (
|
|
6966
6929
|
1 => 'Disable',
|
6967
6930
|
},
|
6968
6931
|
},
|
6969
|
-
|
6932
|
+
7.1 => {
|
6970
6933
|
Name => 'PhotoShootingMenuBankImageArea',
|
6971
6934
|
Mask => 0x07,
|
6972
6935
|
PrintConv => {
|
@@ -6977,16 +6940,14 @@ my %nikonFocalConversions = (
|
|
6977
6940
|
4 => '1.3x (18x12)',
|
6978
6941
|
},
|
6979
6942
|
},
|
6980
|
-
|
6981
|
-
|
6982
|
-
|
6983
|
-
|
6984
|
-
|
6985
|
-
|
6986
|
-
|
6987
|
-
|
6988
|
-
},
|
6989
|
-
0x0eeb => [{
|
6943
|
+
);
|
6944
|
+
|
6945
|
+
%Image::ExifTool::Nikon::CustomSettingsD500 = (
|
6946
|
+
%binaryDataAttrs,
|
6947
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
6948
|
+
IS_SUBDIR => [ 0x00 ],
|
6949
|
+
VARS => { ALLOW_REPROCESS => 1 }, # (necessary because subdirectory is at offset 0)
|
6950
|
+
0x00 => [{
|
6990
6951
|
Name => 'CustomSettingsD5',
|
6991
6952
|
Condition => '$$self{Model} =~ /\bD5\b/',
|
6992
6953
|
Format => 'undef[90]',
|
@@ -7000,7 +6961,7 @@ my %nikonFocalConversions = (
|
|
7000
6961
|
TagTable => 'Image::ExifTool::NikonCustom::SettingsD500',
|
7001
6962
|
},
|
7002
6963
|
}],
|
7003
|
-
#
|
6964
|
+
# 0x7d => { #this decode works, but involves more bits than should be necessary
|
7004
6965
|
# Name => 'ShutterTrigger',
|
7005
6966
|
# Mask => 0xff,
|
7006
6967
|
# PrintConv => {
|
@@ -7009,51 +6970,13 @@ my %nikonFocalConversions = (
|
|
7009
6970
|
# 195 => 'Shutter Button',
|
7010
6971
|
# },
|
7011
6972
|
# },
|
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
|
-
},
|
6973
|
+
);
|
6974
|
+
|
6975
|
+
%Image::ExifTool::Nikon::OtherInfoD500 = (
|
6976
|
+
%binaryDataAttrs,
|
6977
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7055
6978
|
# (needs testing)
|
7056
|
-
#
|
6979
|
+
#0x22 => {
|
7057
6980
|
# Name => 'ExtendedPhotoShootingBanks',
|
7058
6981
|
# Mask => 0x01,
|
7059
6982
|
# PrintConv => {
|
@@ -7062,7 +6985,7 @@ my %nikonFocalConversions = (
|
|
7062
6985
|
# },
|
7063
6986
|
#},
|
7064
6987
|
# (may not be reliable and is found elsewhere)
|
7065
|
-
#
|
6988
|
+
#0x212 => {
|
7066
6989
|
# Name => 'Rotation',
|
7067
6990
|
# Condition => '$$self{Model} =~ /\bD500\b/',
|
7068
6991
|
# Notes => 'D500 firmware 1.1x',
|
@@ -7074,7 +6997,7 @@ my %nikonFocalConversions = (
|
|
7074
6997
|
# 3 => 'Rotate 180',
|
7075
6998
|
# },
|
7076
6999
|
#},
|
7077
|
-
|
7000
|
+
0x214 => { #PH
|
7078
7001
|
Name => 'NikonMeteringMode',
|
7079
7002
|
Condition => '$$self{Model} =~ /\bD500\b/', # (didn't seem to work for D5, but I need more samples)
|
7080
7003
|
Notes => 'D500 only',
|
@@ -7091,13 +7014,12 @@ my %nikonFocalConversions = (
|
|
7091
7014
|
|
7092
7015
|
# shot information for the D6 firmware 1.00 (encrypted) - ref 28
|
7093
7016
|
%Image::ExifTool::Nikon::ShotInfoD6 = (
|
7094
|
-
PROCESS_PROC => \&
|
7095
|
-
WRITE_PROC => \&
|
7017
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7018
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7096
7019
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7097
|
-
VARS => { ID_LABEL => 'Index' },
|
7098
|
-
|
7020
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
7021
|
+
IS_SUBDIR => [ 0x30, 0x9c, 0xa4 ],
|
7099
7022
|
WRITABLE => 1,
|
7100
|
-
FIRST_ENTRY => 0,
|
7101
7023
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7102
7024
|
NOTES => 'These tags are extracted from encrypted data in images from the D6.',
|
7103
7025
|
0x00 => {
|
@@ -7112,159 +7034,111 @@ my %nikonFocalConversions = (
|
|
7112
7034
|
},
|
7113
7035
|
0x24 => {
|
7114
7036
|
Name => 'NumberOffsets', # (number of entries in offset table. offsets are from start of ShotInfo data)
|
7115
|
-
DataMember => 'NumberOffsets',
|
7116
7037
|
Format => 'int32u',
|
7117
7038
|
Writable => 0,
|
7118
7039
|
Hidden => 1,
|
7119
7040
|
},
|
7120
7041
|
0x30 => {
|
7121
|
-
Name => '
|
7122
|
-
DataMember => 'Offset3',
|
7123
|
-
Format => 'int32u',
|
7124
|
-
Writable => 0,
|
7125
|
-
Hidden => 1,
|
7126
|
-
RawConv => '$$self{Offset3} = $val || 0x10000000; undef', # (ignore if 0)
|
7127
|
-
},
|
7128
|
-
0x60 => {
|
7129
|
-
Name => 'Offset15',
|
7130
|
-
DataMember => 'Offset15',
|
7042
|
+
Name => 'SequenceOffset',
|
7131
7043
|
Format => 'int32u',
|
7132
|
-
|
7133
|
-
|
7134
|
-
|
7044
|
+
SubDirectory => {
|
7045
|
+
TagTable => 'Image::ExifTool::Nikon::SeqInfoD6',
|
7046
|
+
Start => '$val',
|
7047
|
+
},
|
7135
7048
|
},
|
7136
7049
|
0x9c => {
|
7137
7050
|
Name => 'OrientationOffset',
|
7138
|
-
DataMember => 'OrientationOffset',
|
7139
7051
|
Format => 'int32u',
|
7140
|
-
|
7141
|
-
|
7142
|
-
|
7052
|
+
SubDirectory => {
|
7053
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
7054
|
+
Start => '$val',
|
7055
|
+
},
|
7143
7056
|
},
|
7144
7057
|
0xa4 => {
|
7145
|
-
Name => '
|
7146
|
-
DataMember => 'Offset32',
|
7058
|
+
Name => 'IntervalOffset',
|
7147
7059
|
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',
|
7060
|
+
SubDirectory => {
|
7061
|
+
TagTable => 'Image::ExifTool::Nikon::IntervalInfoD6',
|
7062
|
+
Start => '$val',
|
7063
|
+
}
|
7159
7064
|
},
|
7160
|
-
|
7065
|
+
);
|
7066
|
+
|
7067
|
+
%Image::ExifTool::Nikon::SeqInfoD6 = (
|
7068
|
+
%binaryDataAttrs,
|
7069
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7070
|
+
DATAMEMBER => [ 0x24, 0x28 ],
|
7071
|
+
0x24 => {
|
7161
7072
|
Name => 'IntervalShooting',
|
7162
7073
|
RawConv => '$$self{IntervalShooting} = $val',
|
7163
7074
|
Format => 'int16u',
|
7164
7075
|
PrintConv => q{
|
7165
7076
|
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
|
7077
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); #something like "Interval 1 of 3"
|
7078
|
+
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
7079
|
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}),
|
7080
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
7170
7081
|
},
|
7171
7082
|
},
|
7172
|
-
|
7083
|
+
0x28 => {
|
7173
7084
|
Name => 'IntervalFrame',
|
7174
7085
|
RawConv => '$$self{IntervalFrame} = $val',
|
7175
7086
|
Condition => '$$self{IntervalShooting} > 0',
|
7176
7087
|
Format => 'int16u',
|
7177
7088
|
Hidden => 1,
|
7178
7089
|
},
|
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 => {
|
7090
|
+
);
|
7091
|
+
|
7092
|
+
%Image::ExifTool::Nikon::IntervalInfoD6 = (
|
7093
|
+
%binaryDataAttrs,
|
7094
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7095
|
+
DATAMEMBER => [ 0x17c, 0x180, 0x214, 0x22c ],
|
7096
|
+
0x17c => {
|
7223
7097
|
Name => 'Intervals',
|
7224
7098
|
Format => 'int32u',
|
7225
7099
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
7226
7100
|
Condition => '$$self{IntervalShooting} > 0',
|
7227
7101
|
},
|
7228
|
-
|
7102
|
+
0x180 => {
|
7229
7103
|
Name => 'ShotsPerInterval',
|
7230
7104
|
Format => 'int32u',
|
7231
7105
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
7232
7106
|
Condition => '$$self{IntervalShooting} > 0',
|
7233
7107
|
},
|
7234
|
-
|
7108
|
+
0x184 => {
|
7235
7109
|
Name => 'IntervalExposureSmoothing',
|
7236
7110
|
Condition => '$$self{IntervalShooting} > 0',
|
7237
7111
|
Format => 'int8u',
|
7238
7112
|
PrintConv => \%offOn,
|
7239
7113
|
},
|
7240
|
-
|
7114
|
+
0x186 => {
|
7241
7115
|
Name => 'IntervalPriority',
|
7242
7116
|
Condition => '$$self{IntervalShooting} > 0',
|
7243
7117
|
Format => 'int8u',
|
7244
7118
|
PrintConv => \%offOn,
|
7245
7119
|
},
|
7246
|
-
|
7120
|
+
0x1a8 => {
|
7247
7121
|
Name => 'FocusShiftNumberShots',
|
7248
7122
|
},
|
7249
|
-
|
7123
|
+
0x1ac => {
|
7250
7124
|
Name => 'FocusShiftStepWidth',
|
7251
7125
|
},
|
7252
|
-
|
7126
|
+
0x1b0 => {
|
7253
7127
|
Name => 'FocusShiftInterval',
|
7254
7128
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
7255
7129
|
},
|
7256
|
-
|
7130
|
+
0x1b4 => {
|
7257
7131
|
Name => 'FocusShiftExposureLock',
|
7258
7132
|
PrintConv => \%offOn,
|
7259
7133
|
},
|
7260
|
-
#
|
7261
|
-
|
7134
|
+
#0x20a => HighISONoiseReduction
|
7135
|
+
0x20e => {
|
7262
7136
|
Name => 'DiffractionCompensation',
|
7263
7137
|
Format => 'int8u',
|
7264
7138
|
PrintConv => \%offOn,
|
7265
7139
|
},
|
7266
|
-
#
|
7267
|
-
|
7140
|
+
#0x20f => {Name => 'FlickerReductionShooting',}, #redundant with tag in NikonSettings
|
7141
|
+
0x214 => {
|
7268
7142
|
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
7143
|
RawConv => '$$self{FlashControlMode} = $val',
|
7270
7144
|
PrintConv => {
|
@@ -7275,14 +7149,14 @@ my %nikonFocalConversions = (
|
|
7275
7149
|
4 => 'Repeating Flash',
|
7276
7150
|
},
|
7277
7151
|
},
|
7278
|
-
|
7152
|
+
0x21a => {
|
7279
7153
|
Name => 'FlashGNDistance',
|
7280
7154
|
Condition => '$$self{FlashControlMode} == 2',
|
7281
7155
|
Unknown => 1,
|
7282
7156
|
ValueConv => '$val + 3',
|
7283
7157
|
PrintConv => \%flashGNDistance,
|
7284
7158
|
},
|
7285
|
-
|
7159
|
+
0x21e => {
|
7286
7160
|
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
7161
|
Condition => '$$self{FlashControlMode} >= 3',
|
7288
7162
|
Unknown => 1,
|
@@ -7291,7 +7165,7 @@ my %nikonFocalConversions = (
|
|
7291
7165
|
PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
|
7292
7166
|
PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
|
7293
7167
|
},
|
7294
|
-
|
7168
|
+
0x228 => {
|
7295
7169
|
Name => 'FlashRemoteControl',
|
7296
7170
|
Unknown => 1,
|
7297
7171
|
PrintConv => {
|
@@ -7300,12 +7174,12 @@ my %nikonFocalConversions = (
|
|
7300
7174
|
2 => 'Remote Repeating',
|
7301
7175
|
},
|
7302
7176
|
},
|
7303
|
-
|
7177
|
+
0x22c => {
|
7304
7178
|
Name => 'FlashMasterControlMode', #tag name chosen for compatibility with those found in FlashInfo0102 & FlashInfo0103
|
7305
7179
|
RawConv => '$$self{FlashGroupOptionsMasterMode} = $val',
|
7306
7180
|
PrintConv => \%flashGroupOptionsMode,
|
7307
7181
|
},
|
7308
|
-
|
7182
|
+
0x22e => {
|
7309
7183
|
Name => 'FlashMasterCompensation',
|
7310
7184
|
Unknown => 1,
|
7311
7185
|
Format => 'int8s',
|
@@ -7315,7 +7189,7 @@ my %nikonFocalConversions = (
|
|
7315
7189
|
PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
|
7316
7190
|
PrintConvInv => '$val',
|
7317
7191
|
},
|
7318
|
-
|
7192
|
+
0x232 => {
|
7319
7193
|
Name => 'FlashMasterOutput',
|
7320
7194
|
Unknown => 1,
|
7321
7195
|
Condition => '$$self{FlashGroupOptionsMasterMode} == 1', #only for Mode=M
|
@@ -7324,7 +7198,7 @@ my %nikonFocalConversions = (
|
|
7324
7198
|
PrintConv => '$val>0.99 ? "Full" : sprintf("%.1f%%",$val*100)',
|
7325
7199
|
PrintConvInv => '$val=~/(\d+)/ ? $1/100 : 1',
|
7326
7200
|
},
|
7327
|
-
|
7201
|
+
0x234 => {
|
7328
7202
|
Name => 'FlashWirelessOption',
|
7329
7203
|
Unknown => 1,
|
7330
7204
|
PrintConv => {
|
@@ -7332,7 +7206,7 @@ my %nikonFocalConversions = (
|
|
7332
7206
|
1 => 'Off',
|
7333
7207
|
},
|
7334
7208
|
},
|
7335
|
-
|
7209
|
+
0x2ca => {
|
7336
7210
|
Name => 'MovieType',
|
7337
7211
|
Unknown => 1,
|
7338
7212
|
PrintConv => {
|
@@ -7340,13 +7214,12 @@ my %nikonFocalConversions = (
|
|
7340
7214
|
1 => 'MP4',
|
7341
7215
|
},
|
7342
7216
|
},
|
7343
|
-
# note: DecryptLen currently set to 0xc9c6 + 720
|
7344
7217
|
);
|
7345
7218
|
|
7346
7219
|
# shot information for the D610 firmware 1.00 (encrypted) - ref PH
|
7347
7220
|
%Image::ExifTool::Nikon::ShotInfoD610 = (
|
7348
|
-
PROCESS_PROC => \&
|
7349
|
-
WRITE_PROC => \&
|
7221
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7222
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7350
7223
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7351
7224
|
VARS => { ID_LABEL => 'Index' },
|
7352
7225
|
IS_SUBDIR => [ 0x07cf ],
|
@@ -7376,20 +7249,15 @@ my %nikonFocalConversions = (
|
|
7376
7249
|
|
7377
7250
|
# shot information for the D810 firmware 1.00(PH)/1.01 (encrypted) - ref 28
|
7378
7251
|
%Image::ExifTool::Nikon::ShotInfoD810 = (
|
7379
|
-
PROCESS_PROC => \&
|
7380
|
-
WRITE_PROC => \&
|
7252
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7253
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7381
7254
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7382
|
-
VARS => { ID_LABEL => 'Index' },
|
7383
|
-
DATAMEMBER => [ 0x04
|
7384
|
-
IS_SUBDIR => [
|
7255
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
7256
|
+
DATAMEMBER => [ 0x04 ],
|
7257
|
+
IS_SUBDIR => [ 0x10, 0x24, 0x38, 0x40, 0x84 ],
|
7385
7258
|
WRITABLE => 1,
|
7386
|
-
FIRST_ENTRY => 0,
|
7387
7259
|
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
|
-
},
|
7260
|
+
NOTES => 'These tags are extracted from encrypted data in images from the D810.',
|
7393
7261
|
0x00 => {
|
7394
7262
|
Name => 'ShotInfoVersion',
|
7395
7263
|
Format => 'string[4]',
|
@@ -7404,39 +7272,64 @@ my %nikonFocalConversions = (
|
|
7404
7272
|
},
|
7405
7273
|
# 0x0c - number of entries in offset table (= 0x21)
|
7406
7274
|
# 0x10 - int32u[val 0x0c]: offset table
|
7275
|
+
0x10 => {
|
7276
|
+
Name => 'SettingsOffset',
|
7277
|
+
Format => 'int32u',
|
7278
|
+
SubDirectory => {
|
7279
|
+
TagTable => 'Image::ExifTool::Nikon::SettingsInfoD810',
|
7280
|
+
Start => '$val',
|
7281
|
+
},
|
7282
|
+
},
|
7407
7283
|
0x24 => {
|
7408
7284
|
Name => 'BracketingOffset',
|
7409
|
-
DataMember => 'BracketingOffset',
|
7410
7285
|
Format => 'int32u',
|
7411
|
-
|
7412
|
-
|
7413
|
-
|
7286
|
+
SubDirectory => {
|
7287
|
+
TagTable => 'Image::ExifTool::Nikon::BracketingInfoD810',
|
7288
|
+
Start => '$val',
|
7289
|
+
},
|
7414
7290
|
},
|
7415
7291
|
0x38 => {
|
7416
7292
|
Name => 'ISOAutoOffset',
|
7417
|
-
DataMember => 'ISOAutoOffset',
|
7418
7293
|
Format => 'int32u',
|
7419
|
-
|
7420
|
-
|
7421
|
-
|
7294
|
+
SubDirectory => {
|
7295
|
+
TagTable => 'Image::ExifTool::Nikon::ISOAutoInfoD810',
|
7296
|
+
Start => '$val',
|
7297
|
+
},
|
7422
7298
|
},
|
7423
7299
|
0x40 => {
|
7424
7300
|
Name => 'CustomSettingsOffset', # (relative offset from start of ShotInfo data)
|
7425
|
-
DataMember => 'CustomSettingsOffset',
|
7426
7301
|
Format => 'int32u',
|
7427
|
-
|
7428
|
-
|
7429
|
-
|
7302
|
+
SubDirectory => {
|
7303
|
+
TagTable => 'Image::ExifTool::NikonCustom::SettingsD810',
|
7304
|
+
Start => '$val',
|
7305
|
+
},
|
7430
7306
|
},
|
7431
7307
|
0x84 => {
|
7432
7308
|
Name => 'OrientationOffset',
|
7433
|
-
DataMember => 'OrientationOffset',
|
7434
7309
|
Format => 'int32u',
|
7435
|
-
|
7436
|
-
|
7437
|
-
|
7310
|
+
SubDirectory => {
|
7311
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
7312
|
+
Start => '$val',
|
7313
|
+
}
|
7438
7314
|
},
|
7439
|
-
|
7315
|
+
# (moves around too much and doesn't fit cleanly in the offset table)
|
7316
|
+
#0x38be => {
|
7317
|
+
# Name => 'Rotation',
|
7318
|
+
# Condition => '$$self{FirmwareVersion} =~ /^1\.0/',
|
7319
|
+
# Mask => 0x30,
|
7320
|
+
# PrintConv => {
|
7321
|
+
# 0 => 'Horizontal',
|
7322
|
+
# 1 => 'Rotate 270 CW',
|
7323
|
+
# 2 => 'Rotate 90 CW',
|
7324
|
+
# 3 => 'Rotate 180',
|
7325
|
+
# },
|
7326
|
+
#},
|
7327
|
+
);
|
7328
|
+
|
7329
|
+
%Image::ExifTool::Nikon::SettingsInfoD810 = (
|
7330
|
+
%binaryDataAttrs,
|
7331
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7332
|
+
0x13c => {
|
7440
7333
|
Name => 'SecondarySlotFunction',
|
7441
7334
|
Mask => 0x03,
|
7442
7335
|
PrintConv => {
|
@@ -7444,9 +7337,13 @@ my %nikonFocalConversions = (
|
|
7444
7337
|
2 => 'Backup',
|
7445
7338
|
3 => 'NEF Primary + JPG Secondary',
|
7446
7339
|
},
|
7447
|
-
Hook => '$varSize = $$self{BracketingOffset} - 0x1747',
|
7448
7340
|
},
|
7449
|
-
|
7341
|
+
);
|
7342
|
+
|
7343
|
+
%Image::ExifTool::Nikon::BracketingInfoD810 = (
|
7344
|
+
%binaryDataAttrs,
|
7345
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7346
|
+
0x0f => {
|
7450
7347
|
Name => 'AEBracketingSteps',
|
7451
7348
|
Mask => 0xff,
|
7452
7349
|
PrintHex => 1,
|
@@ -7503,7 +7400,7 @@ my %nikonFocalConversions = (
|
|
7503
7400
|
0xd6 => '5F3',
|
7504
7401
|
},
|
7505
7402
|
},
|
7506
|
-
|
7403
|
+
0x10 => {
|
7507
7404
|
Name => 'WBBracketingSteps',
|
7508
7405
|
Condition => '$$self{FILE_TYPE} ne "TIFF"', # (covers NEF and TIFF)
|
7509
7406
|
Mask => 0xff,
|
@@ -7546,7 +7443,7 @@ my %nikonFocalConversions = (
|
|
7546
7443
|
0x28 => '9F 3',
|
7547
7444
|
},
|
7548
7445
|
},
|
7549
|
-
|
7446
|
+
0x17 => {
|
7550
7447
|
Name => 'NikonMeteringMode',
|
7551
7448
|
Mask => 0x03,
|
7552
7449
|
PrintConv => {
|
@@ -7555,9 +7452,13 @@ my %nikonFocalConversions = (
|
|
7555
7452
|
2 => 'Spot',
|
7556
7453
|
3 => 'Highlight'
|
7557
7454
|
},
|
7558
|
-
Hook => '$varSize = $$self{ISOAutoOffset} - 0x1858',
|
7559
7455
|
},
|
7560
|
-
|
7456
|
+
);
|
7457
|
+
|
7458
|
+
%Image::ExifTool::Nikon::ISOAutoInfoD810 = (
|
7459
|
+
%binaryDataAttrs,
|
7460
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7461
|
+
0x04 => {
|
7561
7462
|
Name => 'ISOAutoShutterTime',
|
7562
7463
|
Mask => 0x3f,
|
7563
7464
|
PrintConv => {
|
@@ -7600,7 +7501,7 @@ my %nikonFocalConversions = (
|
|
7600
7501
|
36 => 'Auto (Fastest)',
|
7601
7502
|
},
|
7602
7503
|
},
|
7603
|
-
|
7504
|
+
0x05 => {
|
7604
7505
|
Name => 'ISOAutoHiLimit',
|
7605
7506
|
Mask => 0xff,
|
7606
7507
|
PrintHex => 1,
|
@@ -7647,69 +7548,18 @@ my %nikonFocalConversions = (
|
|
7647
7548
|
0x6c => 'ISO Hi 4.0',
|
7648
7549
|
0x72 => 'ISO Hi 5.0',
|
7649
7550
|
},
|
7650
|
-
Hook => '$varSize = $$self{CustomSettingsOffset} - 0x18ab',
|
7651
|
-
},
|
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
7551
|
},
|
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
7552
|
);
|
7702
7553
|
|
7703
7554
|
# shot information for the D850 firmware 1.00b (encrypted) - ref 28
|
7704
7555
|
%Image::ExifTool::Nikon::ShotInfoD850 = (
|
7705
|
-
PROCESS_PROC => \&
|
7706
|
-
WRITE_PROC => \&
|
7556
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7557
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7707
7558
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7708
|
-
VARS => { ID_LABEL => 'Index' },
|
7709
|
-
DATAMEMBER => [ 0x04
|
7710
|
-
IS_SUBDIR => [
|
7559
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x0c },
|
7560
|
+
DATAMEMBER => [ 0x04 ],
|
7561
|
+
IS_SUBDIR => [ 0x10, 0x4c, 0x58, 0xa0 ],
|
7711
7562
|
WRITABLE => 1,
|
7712
|
-
FIRST_ENTRY => 0,
|
7713
7563
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7714
7564
|
NOTES => 'These tags are extracted from encrypted data in images from the D850.',
|
7715
7565
|
0x00 => {
|
@@ -7724,23 +7574,44 @@ my %nikonFocalConversions = (
|
|
7724
7574
|
Writable => 0,
|
7725
7575
|
RawConv => '$$self{FirmwareVersion} = $val',
|
7726
7576
|
},
|
7577
|
+
0x10 => {
|
7578
|
+
Name => 'MenuSettingsOffset',
|
7579
|
+
Format => 'int32u',
|
7580
|
+
SubDirectory => {
|
7581
|
+
TagTable => 'Image::ExifTool::Nikon::MenuSettingsD850',
|
7582
|
+
Start => '$val',
|
7583
|
+
},
|
7584
|
+
},
|
7585
|
+
0x4c => {
|
7586
|
+
Name => 'MoreSettingsOffset',
|
7587
|
+
Format => 'int32u',
|
7588
|
+
SubDirectory => {
|
7589
|
+
TagTable => 'Image::ExifTool::Nikon::MoreSettingsD850',
|
7590
|
+
Start => '$val',
|
7591
|
+
},
|
7592
|
+
},
|
7727
7593
|
0x58 => {
|
7728
|
-
Name => 'CustomSettingsOffset',
|
7729
|
-
DataMember => 'CustomSettingsOffset',
|
7594
|
+
Name => 'CustomSettingsOffset',
|
7730
7595
|
Format => 'int32u',
|
7731
|
-
|
7732
|
-
|
7733
|
-
|
7596
|
+
SubDirectory => {
|
7597
|
+
TagTable => 'Image::ExifTool::NikonCustom::SettingsD850',
|
7598
|
+
Start => '$val',
|
7599
|
+
},
|
7734
7600
|
},
|
7735
7601
|
0xa0 => {
|
7736
7602
|
Name => 'OrientationOffset',
|
7737
|
-
DataMember => 'OrientationOffset',
|
7738
7603
|
Format => 'int32u',
|
7739
|
-
|
7740
|
-
|
7741
|
-
|
7604
|
+
SubDirectory => {
|
7605
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
7606
|
+
Start => '$val',
|
7607
|
+
},
|
7742
7608
|
},
|
7743
|
-
|
7609
|
+
);
|
7610
|
+
|
7611
|
+
%Image::ExifTool::Nikon::MenuSettingsD850 = (
|
7612
|
+
%binaryDataAttrs,
|
7613
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7614
|
+
0x06dd => {
|
7744
7615
|
Name => 'PhotoShootingMenuBankImageArea',
|
7745
7616
|
Mask => 0x07,
|
7746
7617
|
PrintConv => {
|
@@ -7751,7 +7622,12 @@ my %nikonFocalConversions = (
|
|
7751
7622
|
4 => '1:1 (24x24)',
|
7752
7623
|
},
|
7753
7624
|
},
|
7754
|
-
|
7625
|
+
);
|
7626
|
+
|
7627
|
+
%Image::ExifTool::Nikon::MoreSettingsD850 = (
|
7628
|
+
%binaryDataAttrs,
|
7629
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
7630
|
+
0x24 => {
|
7755
7631
|
Name => 'PhotoShootingMenuBank',
|
7756
7632
|
Condition => '$$self{FILE_TYPE} eq "JPEG"',
|
7757
7633
|
Notes => 'valid for JPEG images only',
|
@@ -7763,63 +7639,20 @@ my %nikonFocalConversions = (
|
|
7763
7639
|
3 => 'D',
|
7764
7640
|
},
|
7765
7641
|
},
|
7766
|
-
|
7642
|
+
0x25 => {
|
7767
7643
|
Name => 'PrimarySlot',
|
7768
7644
|
Mask => 0x80,
|
7769
7645
|
PrintConv => {
|
7770
7646
|
0 => 'XQD Card',
|
7771
7647
|
1 => 'SD Card',
|
7772
7648
|
},
|
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
|
-
},
|
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
7649
|
},
|
7817
|
-
# note: DecryptLen currently set to 0x2f07
|
7818
7650
|
);
|
7651
|
+
|
7819
7652
|
# shot information for the D4 firmware 1.00g (ref PH)
|
7820
7653
|
%Image::ExifTool::Nikon::ShotInfoD4 = (
|
7821
|
-
PROCESS_PROC => \&
|
7822
|
-
WRITE_PROC => \&
|
7654
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7655
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7823
7656
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7824
7657
|
VARS => { ID_LABEL => 'Index' },
|
7825
7658
|
IS_SUBDIR => [ 0x0751 ],
|
@@ -7850,12 +7683,12 @@ my %nikonFocalConversions = (
|
|
7850
7683
|
|
7851
7684
|
# shot information for the D4S firmware 1.01a (ref 28, encrypted)
|
7852
7685
|
%Image::ExifTool::Nikon::ShotInfoD4S = (
|
7853
|
-
PROCESS_PROC => \&
|
7854
|
-
WRITE_PROC => \&
|
7686
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7687
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
7855
7688
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
7856
7689
|
VARS => { ID_LABEL => 'Index' },
|
7857
7690
|
DATAMEMBER => [ 4 ],
|
7858
|
-
IS_SUBDIR => [ 0x189d, 0x193d ],
|
7691
|
+
IS_SUBDIR => [ 0x189d, 0x193d, 0x350b ],
|
7859
7692
|
WRITABLE => 1,
|
7860
7693
|
FIRST_ENTRY => 0,
|
7861
7694
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
@@ -8119,31 +7952,13 @@ my %nikonFocalConversions = (
|
|
8119
7952
|
# },
|
8120
7953
|
# },
|
8121
7954
|
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',
|
7955
|
+
Name => 'OrientationInfo',
|
7956
|
+
Format => 'undef[12]',
|
7957
|
+
SubDirectory => {
|
7958
|
+
# Note: pitch angle may be wrong sign for this model?
|
7959
|
+
# (pitch sign was changed without verification to use same decoding as other models)
|
7960
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
7961
|
+
},
|
8147
7962
|
},
|
8148
7963
|
0x3693 => {
|
8149
7964
|
Name => 'Rotation',
|
@@ -8160,15 +7975,13 @@ my %nikonFocalConversions = (
|
|
8160
7975
|
|
8161
7976
|
# shot information for the Z7II firmware 1.00 (encrypted) - ref 28
|
8162
7977
|
%Image::ExifTool::Nikon::ShotInfoZ7II = (
|
8163
|
-
PROCESS_PROC => \&
|
8164
|
-
WRITE_PROC => \&
|
7978
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
7979
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
8165
7980
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
8166
|
-
VARS => { ID_LABEL => 'Index' },
|
8167
|
-
DATAMEMBER => [ 0x04
|
8168
|
-
|
8169
|
-
IS_SUBDIR => [ 0xceb8 ],
|
7981
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
7982
|
+
DATAMEMBER => [ 0x04 ],
|
7983
|
+
IS_SUBDIR => [ 0x30, 0x38, 0x98, 0xa0 ],
|
8170
7984
|
WRITABLE => 1,
|
8171
|
-
FIRST_ENTRY => 0,
|
8172
7985
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8173
7986
|
NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
|
8174
7987
|
0x00 => {
|
@@ -8197,79 +8010,73 @@ my %nikonFocalConversions = (
|
|
8197
8010
|
},
|
8198
8011
|
0x24 => {
|
8199
8012
|
Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
|
8200
|
-
DataMember => 'NumberOffsets',
|
8201
8013
|
Format => 'int32u',
|
8202
8014
|
Writable => 0,
|
8203
8015
|
Hidden => 1,
|
8204
8016
|
},
|
8205
8017
|
0x30 => {
|
8206
|
-
Name => '
|
8207
|
-
DataMember => 'Offset3',
|
8018
|
+
Name => 'IntervalOffset',
|
8208
8019
|
Format => 'int32u',
|
8209
|
-
|
8210
|
-
|
8211
|
-
|
8020
|
+
SubDirectory => {
|
8021
|
+
TagTable => 'Image::ExifTool::Nikon::IntervalInfoZ7II',
|
8022
|
+
Start => '$val',
|
8023
|
+
}
|
8212
8024
|
},
|
8213
8025
|
0x38 => {
|
8214
|
-
Name => '
|
8215
|
-
DataMember => 'Offset5',
|
8026
|
+
Name => 'PortraitOffset',
|
8216
8027
|
Format => 'int32u',
|
8217
|
-
|
8218
|
-
|
8219
|
-
|
8028
|
+
SubDirectory => {
|
8029
|
+
TagTable => 'Image::ExifTool::Nikon::PortraitInfoZ7II',
|
8030
|
+
Start => '$val',
|
8031
|
+
}
|
8220
8032
|
},
|
8221
8033
|
0x98 => {
|
8222
8034
|
Name => 'OrientationOffset',
|
8223
|
-
DataMember => 'OrientationOffset',
|
8224
8035
|
Format => 'int32u',
|
8225
|
-
|
8226
|
-
|
8227
|
-
|
8036
|
+
SubDirectory => {
|
8037
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
8038
|
+
Start => '$val',
|
8039
|
+
}
|
8228
8040
|
},
|
8229
8041
|
0xa0 => {
|
8230
|
-
Name => '
|
8231
|
-
DataMember => 'Offset31',
|
8042
|
+
Name => 'MenuOffset',
|
8232
8043
|
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',
|
8044
|
+
SubDirectory => {
|
8045
|
+
TagTable => 'Image::ExifTool::Nikon::MenuInfoZ7II',
|
8046
|
+
Start => '$val',
|
8047
|
+
},
|
8244
8048
|
},
|
8245
|
-
|
8049
|
+
);
|
8050
|
+
|
8051
|
+
%Image::ExifTool::Nikon::IntervalInfoZ7II = (
|
8052
|
+
%binaryDataAttrs,
|
8053
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8054
|
+
DATAMEMBER => [ 0x24, 0x28 ],
|
8055
|
+
0x24 => {
|
8246
8056
|
Name => 'IntervalShooting',
|
8247
8057
|
RawConv => '$$self{IntervalShooting} = $val',
|
8248
8058
|
Format => 'int16u',
|
8249
8059
|
PrintConv => q{
|
8250
8060
|
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
|
8061
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); # something like "Interval 1 of 3"
|
8062
|
+
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
8063
|
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}),
|
8064
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
8255
8065
|
},
|
8256
8066
|
},
|
8257
|
-
|
8067
|
+
0x28 => {
|
8258
8068
|
Name => 'IntervalFrame',
|
8259
8069
|
RawConv => '$$self{IntervalFrame} = $val',
|
8260
8070
|
Condition => '$$self{IntervalShooting} > 0',
|
8261
8071
|
Format => 'int16u',
|
8262
8072
|
Hidden => 1,
|
8263
8073
|
},
|
8264
|
-
|
8265
|
-
|
8266
|
-
|
8267
|
-
|
8268
|
-
|
8269
|
-
|
8270
|
-
Hook => '$varSize = $$self{Offset5} - 0x7f00',
|
8271
|
-
},
|
8272
|
-
0x7fa0 => { #28
|
8074
|
+
);
|
8075
|
+
|
8076
|
+
%Image::ExifTool::Nikon::PortraitInfoZ7II = (
|
8077
|
+
%binaryDataAttrs,
|
8078
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8079
|
+
0xa0 => { #28
|
8273
8080
|
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
8081
|
# offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera
|
8275
8082
|
# offset5+161 128 is neutral; >128 increases Brightness; <128 decreases Brightness
|
@@ -8285,83 +8092,31 @@ my %nikonFocalConversions = (
|
|
8285
8092
|
return "$color $brightness"
|
8286
8093
|
},
|
8287
8094
|
},
|
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
|
-
},
|
8095
|
+
);
|
8296
8096
|
|
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]',
|
8097
|
+
%Image::ExifTool::Nikon::MenuInfoZ7II = (
|
8098
|
+
%binaryDataAttrs,
|
8099
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8100
|
+
IS_SUBDIR => [ 0x10 ],
|
8101
|
+
0x10 => {
|
8102
|
+
Name => 'MenuSettingsOffsetZ7II',
|
8103
|
+
Format => 'int32u',
|
8347
8104
|
SubDirectory => {
|
8348
8105
|
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ7II',
|
8106
|
+
Start => '$dirStart + $val',
|
8349
8107
|
},
|
8350
|
-
}
|
8351
|
-
# note: DecryptLen currently set to 0xd04e + 860 (offset for Z50 is 0xd04e)
|
8108
|
+
},
|
8352
8109
|
);
|
8353
8110
|
|
8354
8111
|
# shot information for the Z9 firmware 1.00 (encrypted) - ref 28
|
8355
8112
|
%Image::ExifTool::Nikon::ShotInfoZ9 = (
|
8356
|
-
PROCESS_PROC => \&
|
8357
|
-
WRITE_PROC => \&
|
8113
|
+
PROCESS_PROC => \&ProcessNikonEncrypted,
|
8114
|
+
WRITE_PROC => \&ProcessNikonEncrypted,
|
8358
8115
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
8359
|
-
VARS => { ID_LABEL => 'Index' },
|
8360
|
-
DATAMEMBER => [ 0x04
|
8361
|
-
|
8362
|
-
IS_SUBDIR => [ 0x44ec, 0x8225 ],
|
8116
|
+
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
8117
|
+
DATAMEMBER => [ 0x04 ],
|
8118
|
+
IS_SUBDIR => [ 0x30, 0x84, 0x8c ],
|
8363
8119
|
WRITABLE => 1,
|
8364
|
-
FIRST_ENTRY => 0,
|
8365
8120
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8366
8121
|
NOTES => 'These tags are extracted from encrypted data in images from the Z9.',
|
8367
8122
|
0x00 => {
|
@@ -8390,47 +8145,45 @@ my %nikonFocalConversions = (
|
|
8390
8145
|
},
|
8391
8146
|
0x24 => {
|
8392
8147
|
Name => 'NumberOffsets', # number of entries in offset table. offsets are from start of ShotInfo data.
|
8393
|
-
DataMember => 'NumberOffsets',
|
8394
8148
|
Format => 'int32u',
|
8395
8149
|
Writable => 0,
|
8396
8150
|
Hidden => 1,
|
8397
8151
|
},
|
8152
|
+
# subdirectories, referenced by offsets (not processed if offset is zero)
|
8398
8153
|
0x30 => {
|
8399
|
-
Name => 'SequenceOffset',
|
8400
|
-
DataMember => 'SequenceOffset',
|
8154
|
+
Name => 'SequenceOffset',
|
8401
8155
|
Format => 'int32u',
|
8402
|
-
|
8403
|
-
|
8404
|
-
|
8156
|
+
SubDirectory => {
|
8157
|
+
TagTable => 'Image::ExifTool::Nikon::SeqInfoZ9',
|
8158
|
+
Start => '$val',
|
8159
|
+
},
|
8405
8160
|
},
|
8406
8161
|
0x84 => {
|
8407
|
-
Name => '
|
8408
|
-
|
8162
|
+
Name => 'OrientOffset',
|
8163
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8409
8164
|
Format => 'int32u',
|
8410
|
-
|
8411
|
-
|
8412
|
-
|
8165
|
+
SubDirectory => {
|
8166
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
8167
|
+
Start => '$val',
|
8168
|
+
},
|
8413
8169
|
},
|
8414
8170
|
0x8c => {
|
8415
|
-
Name => 'MenuOffset',
|
8416
|
-
DataMember => 'MenuOffset6',
|
8171
|
+
Name => 'MenuOffset',
|
8417
8172
|
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',
|
8173
|
+
SubDirectory => {
|
8174
|
+
TagTable => 'Image::ExifTool::Nikon::MenuInfoZ9',
|
8175
|
+
Start => '$val',
|
8176
|
+
},
|
8430
8177
|
},
|
8431
|
-
|
8178
|
+
);
|
8179
|
+
|
8180
|
+
%Image::ExifTool::Nikon::SeqInfoZ9 = (
|
8181
|
+
%binaryDataAttrs,
|
8182
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8183
|
+
DATAMEMBER => [ 0x20, 0x28, 0x2a ],
|
8184
|
+
0x0020 => {
|
8432
8185
|
Name => 'FocusShiftShooting',
|
8433
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8186
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8434
8187
|
RawConv => '$$self{FocusShiftShooting} = $val',
|
8435
8188
|
PrintConv => q{
|
8436
8189
|
return 'Off' if $val == 0 ;
|
@@ -8438,86 +8191,70 @@ my %nikonFocalConversions = (
|
|
8438
8191
|
return "On: $i"
|
8439
8192
|
},
|
8440
8193
|
},
|
8441
|
-
|
8194
|
+
0x0028 => {
|
8442
8195
|
Name => 'IntervalShooting',
|
8443
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8196
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8444
8197
|
RawConv => '$$self{IntervalShooting} = $val',
|
8445
8198
|
Format => 'int16u',
|
8446
8199
|
PrintConv => q{
|
8447
8200
|
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
|
8201
|
+
my $i = sprintf("Interval %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0); # something like "Interval 1 of 3"
|
8202
|
+
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
8203
|
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}),
|
8204
|
+
#$val == 0 ? 'Off' : sprintf("On: Interval %.0f of %.0f Frame %.0f of %.0f",$val, $$self{IntervalShootingIntervals}||0, $$self{IntervalFrame}||0, $$self{IntervalShootingShotsPerInterval}||0),
|
8452
8205
|
},
|
8453
8206
|
},
|
8454
|
-
|
8455
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8207
|
+
0x002a => {
|
8456
8208
|
Name => 'IntervalFrame',
|
8457
8209
|
RawConv => '$$self{IntervalFrame} = $val',
|
8458
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8210
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8459
8211
|
Format => 'int16u',
|
8460
8212
|
Hidden => 1,
|
8461
8213
|
},
|
8462
|
-
|
8463
|
-
|
8464
|
-
|
8465
|
-
|
8466
|
-
|
8467
|
-
|
8468
|
-
|
8469
|
-
|
8470
|
-
},
|
8471
|
-
0x4411 => {
|
8472
|
-
Name => 'Hook5',
|
8473
|
-
Condition => '$$self{ShutterMode} eq 96', # C30/C60/C120 jpgs only
|
8474
|
-
Hidden => 1,
|
8475
|
-
RawConv => 'undef',
|
8476
|
-
# account for variable location of menu settings data
|
8477
|
-
Hook => '$varSize = $$self{MenuSettingsZ9Offset} - 0x44ec',
|
8478
|
-
},
|
8479
|
-
0x44ec => [
|
8214
|
+
);
|
8215
|
+
|
8216
|
+
%Image::ExifTool::Nikon::MenuInfoZ9 = (
|
8217
|
+
%binaryDataAttrs,
|
8218
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8219
|
+
IS_SUBDIR => [ 0x10 ],
|
8220
|
+
# 0x00 - int32u size of this directory
|
8221
|
+
0x10 => [
|
8480
8222
|
{
|
8481
|
-
Name => '
|
8482
|
-
Condition => '$$self{
|
8483
|
-
Format => '
|
8223
|
+
Name => 'MenuSettingsOffsetZ9',
|
8224
|
+
Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} lt "03.00"',
|
8225
|
+
Format => 'int32u',
|
8484
8226
|
Notes => 'Firmware versions 2.11 and earlier',
|
8485
8227
|
SubDirectory => {
|
8486
8228
|
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9',
|
8229
|
+
Start => '$dirStart + $val',
|
8487
8230
|
},
|
8488
8231
|
},
|
8489
8232
|
{
|
8490
|
-
Name => '
|
8233
|
+
Name => 'MenuSettingsOffsetZ9v3',
|
8491
8234
|
Notes => 'Firmware versions 3.0 and later',
|
8492
|
-
|
8493
|
-
Format => 'undef[1948]',
|
8235
|
+
Format => 'int32u',
|
8494
8236
|
SubDirectory => {
|
8495
|
-
TagTable => 'Image::ExifTool::Nikon::
|
8237
|
+
TagTable => 'Image::ExifTool::Nikon::MenuSettingsZ9v3',
|
8238
|
+
Start => '$dirStart + $val',
|
8496
8239
|
},
|
8497
8240
|
},
|
8498
8241
|
],
|
8499
|
-
|
8500
|
-
|
8501
|
-
|
8502
|
-
|
8503
|
-
|
8504
|
-
|
8505
|
-
# account for variable location of OrientationInfo data
|
8506
|
-
Hook => '$varSize = $$self{OrientationOffset} - 0x80c5',
|
8507
|
-
},
|
8508
|
-
0x80c5 => {
|
8242
|
+
);
|
8243
|
+
|
8244
|
+
%Image::ExifTool::Nikon::OrientationInfo = (
|
8245
|
+
%binaryDataAttrs,
|
8246
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8247
|
+
0 => {
|
8509
8248
|
Name => 'RollAngle',
|
8510
|
-
|
8511
|
-
Format => 'fixed32u',
|
8249
|
+
Format => 'fixed32u',
|
8512
8250
|
Notes => 'converted to degrees of clockwise camera roll',
|
8513
8251
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
8514
8252
|
ValueConvInv => '$val >= 0 ? $val : $val + 360',
|
8515
8253
|
PrintConv => 'sprintf("%.1f", $val)',
|
8516
8254
|
PrintConvInv => '$val',
|
8517
8255
|
},
|
8518
|
-
|
8256
|
+
4 => {
|
8519
8257
|
Name => 'PitchAngle',
|
8520
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8521
8258
|
Format => 'fixed32u',
|
8522
8259
|
Notes => 'converted to degrees of upward camera tilt',
|
8523
8260
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
@@ -8525,9 +8262,8 @@ my %nikonFocalConversions = (
|
|
8525
8262
|
PrintConv => 'sprintf("%.1f", $val)',
|
8526
8263
|
PrintConvInv => '$val',
|
8527
8264
|
},
|
8528
|
-
|
8265
|
+
8 => {
|
8529
8266
|
Name => 'YawAngle',
|
8530
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8531
8267
|
Format => 'fixed32u',
|
8532
8268
|
Notes => 'the camera yaw angle when shooting in portrait orientation',
|
8533
8269
|
ValueConv => '$val <= 180 ? $val : $val - 360',
|
@@ -8535,51 +8271,25 @@ my %nikonFocalConversions = (
|
|
8535
8271
|
PrintConv => 'sprintf("%.1f", $val)',
|
8536
8272
|
PrintConvInv => '$val',
|
8537
8273
|
},
|
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
8274
|
);
|
8577
8275
|
|
8578
8276
|
%Image::ExifTool::Nikon::MenuSettingsZ7II = (
|
8579
8277
|
%binaryDataAttrs,
|
8580
8278
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8581
|
-
DATAMEMBER => [ 176, 180, 328, 352, 858 ],
|
8279
|
+
DATAMEMBER => [ 90, 176, 180, 328, 352, 858 ],
|
8582
8280
|
NOTES => 'These tags are used by the Z5, Z6, Z7, Z6II, Z7II, Z50 and Zfc.',
|
8281
|
+
#48 SelfTimer' #0=> no 1=> yes works for Z7II firmware 1.40, but not 1.30. Follow-up required.
|
8282
|
+
90 => {
|
8283
|
+
Name => 'SingleFrame', #0=> Single Frame 1=> one of the continuous modes
|
8284
|
+
Hidden => 1,
|
8285
|
+
RawConv => '$$self{SingleFrame} = $val',
|
8286
|
+
},
|
8287
|
+
92 => {
|
8288
|
+
Name => 'ReleaseMode',
|
8289
|
+
#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
|
8290
|
+
ValueConv => '$$self{SingleFrame} == 0 ? 5 : $val', #map single frame to a unique value for PrintConv
|
8291
|
+
PrintConv => \%releaseModeZ7,
|
8292
|
+
},
|
8583
8293
|
160 => {
|
8584
8294
|
Name => 'IntervalDurationHours',
|
8585
8295
|
Format => 'int32u',
|
@@ -8814,34 +8524,34 @@ my %nikonFocalConversions = (
|
|
8814
8524
|
Name => 'Intervals',
|
8815
8525
|
Format => 'int32u',
|
8816
8526
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
8817
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8527
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8818
8528
|
},
|
8819
8529
|
192 => {
|
8820
8530
|
Name => 'ShotsPerInterval',
|
8821
8531
|
Format => 'int32u',
|
8822
8532
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
8823
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8533
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8824
8534
|
},
|
8825
8535
|
#220 NEFCompression 0=> 'Lossless' 1=> 'High Efficiency*' 4=> 'High Efficientcy'
|
8826
8536
|
232 => {
|
8827
8537
|
Name => 'FocusShiftNumberShots', #1-300
|
8828
8538
|
RawConv => '$$self{FocusShiftNumberShots} = $val',
|
8829
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8539
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8830
8540
|
},
|
8831
8541
|
236 => {
|
8832
8542
|
Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
|
8833
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8543
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8834
8544
|
},
|
8835
8545
|
240 => {
|
8836
8546
|
Name => 'FocusShiftInterval',
|
8837
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8547
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8838
8548
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
8839
8549
|
},
|
8840
8550
|
244 => {
|
8841
8551
|
Name => 'FocusShiftExposureLock',
|
8842
8552
|
Unknown => 1,
|
8843
8553
|
PrintConv => \%offOn,
|
8844
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8554
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8845
8555
|
},
|
8846
8556
|
274 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
|
8847
8557
|
276 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, #single tag from both Photo & Video menus
|
@@ -8996,13 +8706,13 @@ my %nikonFocalConversions = (
|
|
8996
8706
|
1565 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
|
8997
8707
|
1572 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
|
8998
8708
|
1573 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
|
8999
|
-
1608 => { Name => 'EnergySavingMode', PrintConv
|
8709
|
+
1608 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
|
9000
8710
|
1632 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
|
9001
8711
|
1636 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
|
9002
8712
|
1645 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
|
9003
8713
|
);
|
9004
8714
|
|
9005
|
-
%Image::ExifTool::Nikon::
|
8715
|
+
%Image::ExifTool::Nikon::MenuSettingsZ9v3 = (
|
9006
8716
|
%binaryDataAttrs,
|
9007
8717
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
9008
8718
|
DATAMEMBER => [ 154, 204, 208, 248, 444, 554 ],
|
@@ -9022,33 +8732,33 @@ my %nikonFocalConversions = (
|
|
9022
8732
|
Name => 'Intervals',
|
9023
8733
|
Format => 'int32u',
|
9024
8734
|
RawConv => '$$self{IntervalShootingIntervals} = $val',
|
9025
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8735
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9026
8736
|
},
|
9027
8737
|
208 => {
|
9028
8738
|
Name => 'ShotsPerInterval',
|
9029
8739
|
Format => 'int32u',
|
9030
8740
|
RawConv => '$$self{IntervalShootingShotsPerInterval} = $val',
|
9031
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8741
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9032
8742
|
},
|
9033
8743
|
248 => {
|
9034
8744
|
Name => 'FocusShiftNumberShots', #1-300
|
9035
8745
|
RawConv => '$$self{FocusShiftNumberShots} = $val',
|
9036
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8746
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9037
8747
|
},
|
9038
8748
|
252 => {
|
9039
8749
|
Name => 'FocusShiftStepWidth', #1(Narrow) to 10 (Wide)
|
9040
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8750
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9041
8751
|
},
|
9042
8752
|
256 => {
|
9043
8753
|
Name => 'FocusShiftInterval',
|
9044
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8754
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9045
8755
|
PrintConv => '$val == 1? "1 Second" : sprintf("%.0f Seconds",$val)',
|
9046
8756
|
},
|
9047
8757
|
260 => {
|
9048
8758
|
Name => 'FocusShiftExposureLock',
|
9049
8759
|
Unknown => 1,
|
9050
8760
|
PrintConv => \%offOn,
|
9051
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8761
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9052
8762
|
},
|
9053
8763
|
290 => { Name => 'PhotoShootingMenuBank', PrintConv => \%banksZ9 },
|
9054
8764
|
292 => { Name => 'ExtendedMenuBanks', PrintConv => \%offOn }, # single tag from both Photo & Video menus
|
@@ -9192,7 +8902,7 @@ my %nikonFocalConversions = (
|
|
9192
8902
|
1613 => { Name => 'SetClockFromLocationData', PrintConv => \%offOn, Unknown => 1 },
|
9193
8903
|
1620 => { Name => 'AirplaneMode', PrintConv => \%offOn, Unknown => 1 },
|
9194
8904
|
1621 => { Name => 'EmptySlotRelease', PrintConv => { 0 => 'Disable Release', 1 => 'Enable Release' }, Unknown => 1 },
|
9195
|
-
1656 => { Name => 'EnergySavingMode', PrintConv
|
8905
|
+
1656 => { Name => 'EnergySavingMode', PrintConv => \%offOn, Unknown => 1 },
|
9196
8906
|
1680 => { Name => 'RecordLocationData', PrintConv => \%offOn, Unknown => 1 },
|
9197
8907
|
1684 => { Name => 'USBPowerDelivery', PrintConv => \%offOn, Unknown => 1 },
|
9198
8908
|
1693 => { Name => 'SensorShield', PrintConv => { 0 => 'Stays Open', 1 => 'Closes' }, Unknown => 1 },
|
@@ -9200,7 +8910,7 @@ my %nikonFocalConversions = (
|
|
9200
8910
|
Name => 'FocusShiftAutoReset',
|
9201
8911
|
Unknown => 1,
|
9202
8912
|
PrintConv => \%offOn,
|
9203
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
8913
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{FocusShiftShooting} > 0', #not valid for C30/C60/C120
|
9204
8914
|
},
|
9205
8915
|
1810 => { #CSd4-a
|
9206
8916
|
Name => 'PreReleaseBurstLength',
|
@@ -11258,8 +10968,8 @@ my %nikonFocalConversions = (
|
|
11258
10968
|
Name => 'LensData0201',
|
11259
10969
|
SubDirectory => {
|
11260
10970
|
TagTable => 'Image::ExifTool::Nikon::LensData01',
|
11261
|
-
ProcessProc => \&
|
11262
|
-
WriteProc => \&
|
10971
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
10972
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11263
10973
|
DecryptStart => 4,
|
11264
10974
|
},
|
11265
10975
|
},
|
@@ -11268,8 +10978,8 @@ my %nikonFocalConversions = (
|
|
11268
10978
|
Name => 'LensData0204',
|
11269
10979
|
SubDirectory => {
|
11270
10980
|
TagTable => 'Image::ExifTool::Nikon::LensData0204',
|
11271
|
-
ProcessProc => \&
|
11272
|
-
WriteProc => \&
|
10981
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
10982
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11273
10983
|
DecryptStart => 4,
|
11274
10984
|
},
|
11275
10985
|
},
|
@@ -11278,8 +10988,8 @@ my %nikonFocalConversions = (
|
|
11278
10988
|
Name => 'LensData0400',
|
11279
10989
|
SubDirectory => {
|
11280
10990
|
TagTable => 'Image::ExifTool::Nikon::LensData0400',
|
11281
|
-
ProcessProc => \&
|
11282
|
-
WriteProc => \&
|
10991
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
10992
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11283
10993
|
DecryptStart => 4,
|
11284
10994
|
},
|
11285
10995
|
},
|
@@ -11288,8 +10998,8 @@ my %nikonFocalConversions = (
|
|
11288
10998
|
Name => 'LensData0402',
|
11289
10999
|
SubDirectory => {
|
11290
11000
|
TagTable => 'Image::ExifTool::Nikon::LensData0402',
|
11291
|
-
ProcessProc => \&
|
11292
|
-
WriteProc => \&
|
11001
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
11002
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11293
11003
|
DecryptStart => 4,
|
11294
11004
|
},
|
11295
11005
|
},
|
@@ -11298,8 +11008,8 @@ my %nikonFocalConversions = (
|
|
11298
11008
|
Name => 'LensData0403',
|
11299
11009
|
SubDirectory => {
|
11300
11010
|
TagTable => 'Image::ExifTool::Nikon::LensData0403',
|
11301
|
-
ProcessProc => \&
|
11302
|
-
WriteProc => \&
|
11011
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
11012
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11303
11013
|
DecryptStart => 4,
|
11304
11014
|
},
|
11305
11015
|
},
|
@@ -11308,8 +11018,8 @@ my %nikonFocalConversions = (
|
|
11308
11018
|
Name => 'LensData0800',
|
11309
11019
|
SubDirectory => {
|
11310
11020
|
TagTable => 'Image::ExifTool::Nikon::LensData0800',
|
11311
|
-
ProcessProc => \&
|
11312
|
-
WriteProc => \&
|
11021
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
11022
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11313
11023
|
DecryptStart => 4,
|
11314
11024
|
ByteOrder => 'LittleEndian',
|
11315
11025
|
# 0x5a0c - NikonMeteringMode for some Z6 ver1.00 samples (ref PH)
|
@@ -11319,8 +11029,8 @@ my %nikonFocalConversions = (
|
|
11319
11029
|
Name => 'LensDataUnknown',
|
11320
11030
|
SubDirectory => {
|
11321
11031
|
TagTable => 'Image::ExifTool::Nikon::LensDataUnknown',
|
11322
|
-
ProcessProc => \&
|
11323
|
-
WriteProc => \&
|
11032
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
11033
|
+
WriteProc => \&ProcessNikonEncrypted,
|
11324
11034
|
DecryptStart => 4,
|
11325
11035
|
},
|
11326
11036
|
},
|
@@ -11835,37 +11545,54 @@ my @xlat = (
|
|
11835
11545
|
0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f ]
|
11836
11546
|
);
|
11837
11547
|
|
11548
|
+
my ($ci0, $cj0, $ck0, $decryptStart); # decryption parameters
|
11549
|
+
|
11838
11550
|
# Decrypt Nikon data block (ref 4)
|
11839
|
-
# Inputs: 0) reference to data block, 1)
|
11840
|
-
#
|
11841
|
-
#
|
11551
|
+
# Inputs: 0) reference to data block, 1) optional start offset (default 0)
|
11552
|
+
# 2) optional number of bytes to decode (default to the end of the data)
|
11553
|
+
# 3) optional serial number key (undef to continue previous decryption)
|
11554
|
+
# 4) optional shutter count key
|
11842
11555
|
# Returns: data block with specified data decrypted
|
11843
|
-
|
11556
|
+
# Notes: The first time this is called for a given encrypted data block the serial/count
|
11557
|
+
# keys must be defined, and $start must be the offset for initialization of the
|
11558
|
+
# decryption parameters (ie. the beginning of the encrypted data, which isn't
|
11559
|
+
# necessarily inside the data block if $len is zero). Subsequent calls for
|
11560
|
+
# the same data block do not specify the serial/count keys, and may be used
|
11561
|
+
# to decrypt data at any start point within the full data block.
|
11562
|
+
sub Decrypt($;$$$$)
|
11844
11563
|
{
|
11845
|
-
my ($dataPt, $
|
11846
|
-
my ($
|
11564
|
+
my ($dataPt, $start, $len, $serial, $count) = @_;
|
11565
|
+
my ($ch, $cj, $ck);
|
11847
11566
|
|
11848
11567
|
$start or $start = 0;
|
11849
11568
|
my $maxLen = length($$dataPt) - $start;
|
11850
11569
|
$len = $maxLen if not defined $len or $len > $maxLen;
|
11851
|
-
|
11852
|
-
|
11853
|
-
|
11854
|
-
$key ^= ($count >> ($
|
11570
|
+
if (defined $serial and defined $count) {
|
11571
|
+
# initialize decryption parameters
|
11572
|
+
my $key = 0;
|
11573
|
+
$key ^= ($count >> ($_*8)) & 0xff foreach 0..3;
|
11574
|
+
$ci0 = $xlat[0][$serial & 0xff];
|
11575
|
+
$cj0 = $xlat[1][$key];
|
11576
|
+
$ck0 = 0x60;
|
11577
|
+
undef $decryptStart;
|
11578
|
+
}
|
11579
|
+
if (defined $decryptStart) {
|
11580
|
+
# initialize decryption parameters for this start position
|
11581
|
+
my $n = $start - $decryptStart;
|
11582
|
+
$cj = ($cj0 + $ci0 * ($n * $ck0 + ($n * ($n - 1))/2)) & 0xff;
|
11583
|
+
$ck = ($ck0 + $n) & 0xff;
|
11584
|
+
} else {
|
11585
|
+
$decryptStart = $start;
|
11586
|
+
($cj, $ck) = ($cj0, $ck0);
|
11855
11587
|
}
|
11856
|
-
|
11857
|
-
my
|
11858
|
-
|
11859
|
-
|
11860
|
-
foreach $dat (@data) {
|
11861
|
-
$cj = ($cj + $ci * $ck) & 0xff;
|
11588
|
+
return $$dataPt if $len <= 0;
|
11589
|
+
my @data = unpack('C*', substr($$dataPt, $start, $len));
|
11590
|
+
foreach $ch (@data) {
|
11591
|
+
$cj = ($cj + $ci0 * $ck) & 0xff;
|
11862
11592
|
$ck = ($ck + 1) & 0xff;
|
11863
|
-
$
|
11593
|
+
$ch ^= $cj;
|
11864
11594
|
}
|
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;
|
11595
|
+
return substr($$dataPt, 0, $start) . pack('C*', @data) . substr($$dataPt, $start+$len);
|
11869
11596
|
}
|
11870
11597
|
|
11871
11598
|
#------------------------------------------------------------------------------
|
@@ -12001,6 +11728,110 @@ sub ProcessNikonMOV($$$)
|
|
12001
11728
|
return 1;
|
12002
11729
|
}
|
12003
11730
|
|
11731
|
+
#------------------------------------------------------------------------------
|
11732
|
+
# Prepare to process NIKON_OFFSETS directory and decrypt necessary data
|
11733
|
+
# Inputs: 0) ExifTool ref, 1) data ref, 2) tag table ref, 3) decrypt start,
|
11734
|
+
# 4) serial key, 5) count key, 6) decrypt mode (0=piecewise,
|
11735
|
+
# 1=continuous to end of last known section, 2=all)
|
11736
|
+
# Returns: end of decrypted data (or undef for piecewise decryption)
|
11737
|
+
sub PrepareNikonOffsets($$$$$$$)
|
11738
|
+
{
|
11739
|
+
my ($et, $dataPt, $tagTablePtr, $start, $serial, $count, $decryptMode) = @_;
|
11740
|
+
my $offset = $$tagTablePtr{VARS}{NIKON_OFFSETS};
|
11741
|
+
my $unknown = $et->Options('Unknown');
|
11742
|
+
my $dataLen = length $$dataPt;
|
11743
|
+
return undef if $offset + 4 > $dataLen or $offset < $start;
|
11744
|
+
my $dpos = $offset + 4; # decrypt the first 4 bytes
|
11745
|
+
$$dataPt = Decrypt($dataPt, $start, $dpos - $start, $serial, $count);
|
11746
|
+
my $numOffsets = Get32u($dataPt, $offset);
|
11747
|
+
my $more = $numOffsets * 4;
|
11748
|
+
return undef if $offset + 4 + $more > $dataLen;
|
11749
|
+
$$dataPt = Decrypt($dataPt, $dpos, $more);
|
11750
|
+
$dpos += $more;
|
11751
|
+
my $doneAlready = $$tagTablePtr{VARS}{NIKON_OFFSETS_DONE};
|
11752
|
+
$$tagTablePtr{VARS}{NIKON_OFFSETS_DONE} = 1;
|
11753
|
+
my ($i, @offInfo);
|
11754
|
+
for ($i=0; $i<$numOffsets; ++$i) {
|
11755
|
+
my $pos = $offset + 4 + 4 * $i;
|
11756
|
+
my $off = Get32u($dataPt, $pos) or next;
|
11757
|
+
my $tagInfo = $$tagTablePtr{$pos};
|
11758
|
+
if ($tagInfo) {
|
11759
|
+
if (not $doneAlready and ref $tagInfo eq 'HASH' and
|
11760
|
+
not $$tagInfo{Unknown} and $$tagInfo{SubDirectory})
|
11761
|
+
{
|
11762
|
+
# determine length of subdirectory up to end of last known tag
|
11763
|
+
my $subdir = $$tagInfo{SubDirectory};
|
11764
|
+
my $tbl = GetTagTable($$subdir{TagTable});
|
11765
|
+
my ($last) = sort { $b <=> $a } TagTableKeys($tbl);
|
11766
|
+
my $lastInfo = $$tbl{$last};
|
11767
|
+
$lastInfo = $$lastInfo[0] if ref $lastInfo eq 'ARRAY';
|
11768
|
+
# (can't pre-determine known length of offset-based subdirectories)
|
11769
|
+
unless ($$lastInfo{SubDirectory}) {
|
11770
|
+
my $fmt = $$lastInfo{Format} || $$tbl{FORMAT} || 'int8u';
|
11771
|
+
my $nm = $fmt =~ s/\[(\d+)\]$// ? $1 : 1;
|
11772
|
+
my $sz = Image::ExifTool::FormatSize($fmt);
|
11773
|
+
$$subdir{KnownLen} = int($last) + $sz * $nm if $sz;
|
11774
|
+
}
|
11775
|
+
}
|
11776
|
+
} elsif ($unknown > 1) {
|
11777
|
+
# create new table for unknown information
|
11778
|
+
my $tbl = sprintf('Image::ExifTool::Nikon::UnknownInfo%.2x', $pos);
|
11779
|
+
no strict 'refs';
|
11780
|
+
unless (%$tbl) {
|
11781
|
+
%$tbl = ( %binaryDataAttrs, GROUPS => { 0=>'MakerNotes', 2=>'Unknown' } );
|
11782
|
+
GetTagTable($tbl);
|
11783
|
+
}
|
11784
|
+
# add unknown entry in offset table for this subdirectory
|
11785
|
+
$tagInfo = AddTagToTable($tagTablePtr, $pos, {
|
11786
|
+
Name => sprintf('UnknownOffset%.2x', $pos),
|
11787
|
+
Format => 'int32u',
|
11788
|
+
SubDirectory => { TagTable => $tbl },
|
11789
|
+
Unknown => 2,
|
11790
|
+
});
|
11791
|
+
}
|
11792
|
+
if ($off) {
|
11793
|
+
my $known = ($tagInfo and (ref $tagInfo ne 'HASH' or not $$tagInfo{Unknown})) ? 1 : 0;
|
11794
|
+
push @offInfo, [ $pos, $off, $known ];
|
11795
|
+
}
|
11796
|
+
}
|
11797
|
+
my $end;
|
11798
|
+
# sort offsets in ascending order, and use the differences to calculate
|
11799
|
+
# directory lengths and update the SubDirectory DirLen's accordingly
|
11800
|
+
my @sorted = sort { $$a[1] <=> $$b[1] or $$a[0] <=> $$b[0] } @offInfo;
|
11801
|
+
push @sorted, [ 0, length($$dataPt), 0 ];
|
11802
|
+
for ($i=0; $i<@sorted-1; ++$i) {
|
11803
|
+
my $pos = $sorted[$i][0];
|
11804
|
+
my $len = $sorted[$i+1][1] - $sorted[$i][1];
|
11805
|
+
# set DirLen in SubDirectory entry
|
11806
|
+
my $tagInfo = $$tagTablePtr{$pos};
|
11807
|
+
my $subdir;
|
11808
|
+
if (ref $tagInfo eq 'HASH' and defined($subdir=$$tagInfo{SubDirectory})) {
|
11809
|
+
$$tagInfo{SubDirectory}{DirLen} = $len;
|
11810
|
+
}
|
11811
|
+
if ($decryptMode) {
|
11812
|
+
# keep track of end of last known directory
|
11813
|
+
$end = $sorted[$i+1][1] if $sorted[$i][2];
|
11814
|
+
} elsif ($tagInfo and (ref $tagInfo ne 'HASH' or not $$tagInfo{Unknown})) {
|
11815
|
+
# decrypt data piecewise as necessary
|
11816
|
+
my $n = $len;
|
11817
|
+
if ($subdir and $$subdir{KnownLen}) {
|
11818
|
+
$n = $$subdir{KnownLen};
|
11819
|
+
if ($n > $len) {
|
11820
|
+
$et->Warn("Data too short for $$tagInfo{Name}",1);
|
11821
|
+
$n = $len;
|
11822
|
+
}
|
11823
|
+
}
|
11824
|
+
$$dataPt = Decrypt($dataPt, $sorted[$i][1], $n);
|
11825
|
+
}
|
11826
|
+
}
|
11827
|
+
if ($decryptMode) {
|
11828
|
+
# decrypt the remaining required data
|
11829
|
+
$end = length $$dataPt if $decryptMode == 2 or not $end or $end < $dpos;
|
11830
|
+
$$dataPt = Decrypt($dataPt, $dpos, $end - $dpos);
|
11831
|
+
}
|
11832
|
+
return $end;
|
11833
|
+
}
|
11834
|
+
|
12004
11835
|
#------------------------------------------------------------------------------
|
12005
11836
|
# Read/Write Nikon Encrypted data block
|
12006
11837
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -12025,15 +11856,17 @@ sub ProcessNikonEncrypted($$$)
|
|
12025
11856
|
delete $$et{NikonCountKey};
|
12026
11857
|
return 0;
|
12027
11858
|
}
|
12028
|
-
my $
|
11859
|
+
my $oldOrder = GetByteOrder();
|
11860
|
+
my $isWriting = $$dirInfo{IsWriting};
|
11861
|
+
my $verbose = $isWriting ? 0 : $et->Options('Verbose');
|
12029
11862
|
my $tagInfo = $$dirInfo{TagInfo};
|
12030
11863
|
my $dirStart = $$dirInfo{DirStart};
|
12031
11864
|
my $data = substr(${$$dirInfo{DataPt}}, $dirStart, $$dirInfo{DirLen});
|
12032
11865
|
|
12033
|
-
my ($start, $len, $
|
11866
|
+
my ($start, $len, $offset, $byteOrder, $recrypt, $newSerial, $newCount, $didDecrypt);
|
12034
11867
|
|
12035
11868
|
# must re-encrypt when writing if serial number or shutter count changes
|
12036
|
-
if (
|
11869
|
+
if ($isWriting) {
|
12037
11870
|
if ($$et{NewNikonSerialKey}) {
|
12038
11871
|
$newSerial = $$et{NewNikonSerialKey};
|
12039
11872
|
$recrypt = 1;
|
@@ -12044,46 +11877,32 @@ sub ProcessNikonEncrypted($$$)
|
|
12044
11877
|
}
|
12045
11878
|
}
|
12046
11879
|
if ($tagInfo and $$tagInfo{SubDirectory}) {
|
12047
|
-
$
|
11880
|
+
my $subdir = $$tagInfo{SubDirectory};
|
11881
|
+
$start = $$subdir{DecryptStart} || 0;
|
11882
|
+
# DirOffset, if specified, is relative to start of encrypted data
|
11883
|
+
$offset = defined $$subdir{DirOffset} ? $$subdir{DirOffset} + $start : 0;
|
11884
|
+
$byteOrder = $$subdir{ByteOrder};
|
11885
|
+
SetByteOrder($byteOrder) if $byteOrder;
|
11886
|
+
# prepare for processing NIKON_OFFSETS directory if necessary
|
11887
|
+
if ($$tagTablePtr{VARS} and $$tagTablePtr{VARS}{NIKON_OFFSETS}) {
|
11888
|
+
my $unknown = $et->Options('Verbose') > 2 || $et->Options('Unknown') > 1;
|
11889
|
+
# decrypt mode: 0=piecewise, 1=continuous to end of last known section, 2=all
|
11890
|
+
my $dMode = $isWriting ? ($recrypt ? 2 : 1) : ($unknown ? 2 : 0);
|
11891
|
+
$len = PrepareNikonOffsets($et, \$data, $tagTablePtr, $start, $serial, $count, $dMode);
|
11892
|
+
$didDecrypt = 1;
|
12048
11893
|
# may decrypt only part of the information to save time
|
12049
|
-
|
12050
|
-
$len = $$
|
12051
|
-
$more = $$tagInfo{SubDirectory}{DecryptMore};
|
11894
|
+
} elsif ($verbose < 3 and $et->Options('Unknown') < 2 and not $recrypt) {
|
11895
|
+
$len = $$subdir{DecryptLen};
|
12052
11896
|
}
|
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
11897
|
} else {
|
12061
|
-
$offset = 0;
|
11898
|
+
$start = $offset = 0;
|
12062
11899
|
}
|
12063
11900
|
my $maxLen = length($data) - $start;
|
12064
11901
|
# decrypt all the data unless DecryptLen is given
|
12065
|
-
unless
|
12066
|
-
$len = $maxLen;
|
12067
|
-
undef $more; # (can't decrypt more than this)
|
12068
|
-
}
|
11902
|
+
$len = $maxLen unless $len and $len < $maxLen;
|
12069
11903
|
|
12070
|
-
$data = Decrypt(\$data, $
|
11904
|
+
$data = Decrypt(\$data, $start, $len, $serial, $count) unless $didDecrypt;
|
12071
11905
|
|
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
11906
|
if ($verbose > 2) {
|
12088
11907
|
$et->VerboseDir("Decrypted $$tagInfo{Name}");
|
12089
11908
|
$et->VerboseDump(\$data,
|
@@ -12102,7 +11921,7 @@ sub ProcessNikonEncrypted($$$)
|
|
12102
11921
|
Base => $$dirInfo{Base},
|
12103
11922
|
);
|
12104
11923
|
my $rtnVal;
|
12105
|
-
if (
|
11924
|
+
if ($isWriting) {
|
12106
11925
|
my $changed = $$et{CHANGED};
|
12107
11926
|
$rtnVal = $et->WriteBinaryData(\%subdirInfo, $tagTablePtr);
|
12108
11927
|
# must re-encrypt if serial number or shutter count changes
|
@@ -12117,7 +11936,8 @@ sub ProcessNikonEncrypted($$$)
|
|
12117
11936
|
# add back any un-encrypted data at start
|
12118
11937
|
$rtnVal = substr($data, 0, $offset) . $rtnVal if $offset;
|
12119
11938
|
# re-encrypt data (symmetrical algorithm)
|
12120
|
-
$rtnVal = Decrypt(\$rtnVal, $
|
11939
|
+
$rtnVal = Decrypt(\$rtnVal, $start, $len, $serial, $count);
|
11940
|
+
$et->VPrint(2, $$et{INDENT}, " [recrypted $$tagInfo{Name}]");
|
12121
11941
|
}
|
12122
11942
|
} else {
|
12123
11943
|
$rtnVal = $et->ProcessBinaryData(\%subdirInfo, $tagTablePtr);
|