line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
2
|
|
|
|
|
|
|
# File: Panasonic.pm |
3
|
|
|
|
|
|
|
# |
4
|
|
|
|
|
|
|
# Description: Panasonic/Leica maker notes tags |
5
|
|
|
|
|
|
|
# |
6
|
|
|
|
|
|
|
# Revisions: 11/10/2004 - P. Harvey Created |
7
|
|
|
|
|
|
|
# |
8
|
|
|
|
|
|
|
# References: 1) http://www.compton.nu/panasonic.html (based on FZ10) |
9
|
|
|
|
|
|
|
# 2) Derived from DMC-FZ3 samples from dpreview.com |
10
|
|
|
|
|
|
|
# 3) http://johnst.org/sw/exiftags/ |
11
|
|
|
|
|
|
|
# 4) Tels (http://bloodgate.com/) private communication (tests with FZ5) |
12
|
|
|
|
|
|
|
# 7) http://homepage3.nifty.com/kamisaka/makernote/makernote_pana.htm (2007/10/02) |
13
|
|
|
|
|
|
|
# 8) Marcel Coenen private communication (DMC-FZ50) |
14
|
|
|
|
|
|
|
# 9) http://forums.dpreview.com/forums/read.asp?forum=1033&message=22756430 |
15
|
|
|
|
|
|
|
# 10) http://bretteville.com/pdfs/M8Metadata_v2.pdf |
16
|
|
|
|
|
|
|
# 11) http://www.digital-leica.com/lens_codes/index.html |
17
|
|
|
|
|
|
|
# (now https://www.l-camera-forum.com/leica-news/leica-lens-codes/) |
18
|
|
|
|
|
|
|
# 12) Joerg - http://www.cpanforum.com/threads/11602 (LX3 firmware 2.0) |
19
|
|
|
|
|
|
|
# 13) Michael Byczkowski private communication (Leica M9) |
20
|
|
|
|
|
|
|
# 14) Carl Bretteville private communication (M9) |
21
|
|
|
|
|
|
|
# 15) Zdenek Mihula private communication (TZ8) |
22
|
|
|
|
|
|
|
# 16) Olaf Ulrich private communication |
23
|
|
|
|
|
|
|
# 17) https://exiftool.org/forum/index.php/topic,4922.0.html |
24
|
|
|
|
|
|
|
# 18) Thomas Modes private communication (G6) |
25
|
|
|
|
|
|
|
# 19) https://exiftool.org/forum/index.php/topic,5533.0.html |
26
|
|
|
|
|
|
|
# 20) Bernd-Michael Kemper private communication (DMC-GX80/85) |
27
|
|
|
|
|
|
|
# 21) Klaus Homeister forum post |
28
|
|
|
|
|
|
|
# 22) Daniel Beichl private communication (G9) |
29
|
|
|
|
|
|
|
# 23) Tim Gray private communication (M10 Monochrom) |
30
|
|
|
|
|
|
|
# JD) Jens Duttke private communication (TZ3,FZ30,FZ50) |
31
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
package Image::ExifTool::Panasonic; |
34
|
|
|
|
|
|
|
|
35
|
29
|
|
|
29
|
|
5189
|
use strict; |
|
29
|
|
|
|
|
88
|
|
|
29
|
|
|
|
|
1194
|
|
36
|
29
|
|
|
29
|
|
188
|
use vars qw($VERSION %leicaLensTypes); |
|
29
|
|
|
|
|
90
|
|
|
29
|
|
|
|
|
1784
|
|
37
|
29
|
|
|
29
|
|
212
|
use Image::ExifTool qw(:DataAccess :Utils); |
|
29
|
|
|
|
|
66
|
|
|
29
|
|
|
|
|
6965
|
|
38
|
29
|
|
|
29
|
|
1701
|
use Image::ExifTool::Exif; |
|
29
|
|
|
|
|
173
|
|
|
29
|
|
|
|
|
186196
|
|
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
$VERSION = '2.18'; |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
sub ProcessLeicaLEIC($$$); |
43
|
|
|
|
|
|
|
sub WhiteBalanceConv($;$$); |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
# Leica lens types (ref 10) |
46
|
|
|
|
|
|
|
%leicaLensTypes = ( |
47
|
|
|
|
|
|
|
OTHER => sub { |
48
|
|
|
|
|
|
|
my ($val, $inv, $conv) = @_; |
49
|
|
|
|
|
|
|
return undef if $inv or not $val =~ s/ .*//; |
50
|
|
|
|
|
|
|
return $$conv{$val}; |
51
|
|
|
|
|
|
|
}, |
52
|
|
|
|
|
|
|
Notes => q{ |
53
|
|
|
|
|
|
|
the LensType value is obtained by splitting the stored value into 2 |
54
|
|
|
|
|
|
|
integers: The stored value divided by 4, and its lower 2 bits. The second |
55
|
|
|
|
|
|
|
number is used only if necessary to identify certain manually coded lenses |
56
|
|
|
|
|
|
|
on the M9, or the focal length of some multi-focal lenses. |
57
|
|
|
|
|
|
|
}, |
58
|
|
|
|
|
|
|
# All M9 codes (two numbers: first the LensID then the lower 2 bits) |
59
|
|
|
|
|
|
|
# are ref PH with samples from ref 13. From ref 10, the lower 2 bits of |
60
|
|
|
|
|
|
|
# the LensType value give the frame selector position for most lenses, |
61
|
|
|
|
|
|
|
# although for the 28-35-50mm (at least) it gives the focal length selection. |
62
|
|
|
|
|
|
|
# The M9 also gives the focal length selection but for other lenses the |
63
|
|
|
|
|
|
|
# lower 3 bits don't change with frame selector position except for the lens |
64
|
|
|
|
|
|
|
# shows as uncoded for certain lenses and some incorrect positions of the |
65
|
|
|
|
|
|
|
# frame selector. The bits are zero for uncoded lenses when manually coding |
66
|
|
|
|
|
|
|
# from the menu on the M9. - PH |
67
|
|
|
|
|
|
|
# Frame selector bits (from ref 10, M8): |
68
|
|
|
|
|
|
|
# 1 => '28/90mm frame lines engaged', |
69
|
|
|
|
|
|
|
# 2 => '24/35mm frame lines engaged', |
70
|
|
|
|
|
|
|
# 3 => '50/75mm frame lines engaged', |
71
|
|
|
|
|
|
|
'0 0' => 'Uncoded lens', |
72
|
|
|
|
|
|
|
# |
73
|
|
|
|
|
|
|
# NOTE: MUST ADD ENTRY TO %frameSelectorBits below when a new lens is added!!!! |
74
|
|
|
|
|
|
|
# |
75
|
|
|
|
|
|
|
# model number(s): |
76
|
|
|
|
|
|
|
1 => 'Elmarit-M 21mm f/2.8', # 11134 |
77
|
|
|
|
|
|
|
3 => 'Elmarit-M 28mm f/2.8 (III)', # 11804 |
78
|
|
|
|
|
|
|
4 => 'Tele-Elmarit-M 90mm f/2.8 (II)', # 11800 |
79
|
|
|
|
|
|
|
5 => 'Summilux-M 50mm f/1.4 (II)', # 11868/11856/11114 |
80
|
|
|
|
|
|
|
6 => 'Summicron-M 35mm f/2 (IV)', # 11310/11311 |
81
|
|
|
|
|
|
|
'6 0' => 'Summilux-M 35mm f/1.4', # 11869/11870/11860 |
82
|
|
|
|
|
|
|
7 => 'Summicron-M 90mm f/2 (II)', # 11136/11137 |
83
|
|
|
|
|
|
|
9 => 'Elmarit-M 135mm f/2.8 (I/II)', # 11829 |
84
|
|
|
|
|
|
|
'9 0' => 'Apo-Telyt-M 135mm f/3.4', # 11889 |
85
|
|
|
|
|
|
|
11 => 'Summaron-M 28mm f/5.6', # ? (ref IB) |
86
|
|
|
|
|
|
|
12 => 'Thambar-M 90mm f/2.2', # ? (ref IB) |
87
|
|
|
|
|
|
|
16 => 'Tri-Elmar-M 16-18-21mm f/4 ASPH.',# 11626 |
88
|
|
|
|
|
|
|
'16 1' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 16mm)', |
89
|
|
|
|
|
|
|
'16 2' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 18mm)', |
90
|
|
|
|
|
|
|
'16 3' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 21mm)', |
91
|
|
|
|
|
|
|
23 => 'Summicron-M 50mm f/2 (III)', # 11817, version (I) in camera menu |
92
|
|
|
|
|
|
|
24 => 'Elmarit-M 21mm f/2.8 ASPH.', # 11135/11897 |
93
|
|
|
|
|
|
|
25 => 'Elmarit-M 24mm f/2.8 ASPH.', # 11878/11898 |
94
|
|
|
|
|
|
|
26 => 'Summicron-M 28mm f/2 ASPH.', # 11604 |
95
|
|
|
|
|
|
|
27 => 'Elmarit-M 28mm f/2.8 (IV)', # 11809 |
96
|
|
|
|
|
|
|
28 => 'Elmarit-M 28mm f/2.8 ASPH.', # 11606 |
97
|
|
|
|
|
|
|
29 => 'Summilux-M 35mm f/1.4 ASPH.', # 11874/11883 |
98
|
|
|
|
|
|
|
'29 0' => 'Summilux-M 35mm f/1.4 ASPHERICAL', # 11873 (different from "ASPH." model!) |
99
|
|
|
|
|
|
|
30 => 'Summicron-M 35mm f/2 ASPH.', # 11879/11882 |
100
|
|
|
|
|
|
|
31 => 'Noctilux-M 50mm f/1', # 11821/11822 |
101
|
|
|
|
|
|
|
'31 0' => 'Noctilux-M 50mm f/1.2', # 11820 |
102
|
|
|
|
|
|
|
32 => 'Summilux-M 50mm f/1.4 ASPH.', # 11891/11892 |
103
|
|
|
|
|
|
|
33 => 'Summicron-M 50mm f/2 (IV, V)', # 11819/11825/11826/11816, version (II,III) in camera menu |
104
|
|
|
|
|
|
|
34 => 'Elmar-M 50mm f/2.8', # 11831/11823/11825 |
105
|
|
|
|
|
|
|
35 => 'Summilux-M 75mm f/1.4', # 11814/11815/11810 |
106
|
|
|
|
|
|
|
36 => 'Apo-Summicron-M 75mm f/2 ASPH.', # 11637 |
107
|
|
|
|
|
|
|
37 => 'Apo-Summicron-M 90mm f/2 ASPH.', # 11884/11885 |
108
|
|
|
|
|
|
|
38 => 'Elmarit-M 90mm f/2.8', # 11807/11808, version (II) in camera menu |
109
|
|
|
|
|
|
|
39 => 'Macro-Elmar-M 90mm f/4', # 11633/11634 |
110
|
|
|
|
|
|
|
'39 0' => 'Tele-Elmar-M 135mm f/4 (II)',# 11861 |
111
|
|
|
|
|
|
|
40 => 'Macro-Adapter M', # 14409 |
112
|
|
|
|
|
|
|
41 => 'Apo-Summicron-M 50mm f/2 ASPH.', #IB |
113
|
|
|
|
|
|
|
'41 3' => 'Apo-Summicron-M 50mm f/2 ASPH.', #16 |
114
|
|
|
|
|
|
|
42 => 'Tri-Elmar-M 28-35-50mm f/4 ASPH.',# 11625 |
115
|
|
|
|
|
|
|
'42 1' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 28mm)', |
116
|
|
|
|
|
|
|
'42 2' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 35mm)', |
117
|
|
|
|
|
|
|
'42 3' => 'Tri-Elmar-M 28-35-50mm f/4 ASPH. (at 50mm)', |
118
|
|
|
|
|
|
|
43 => 'Summarit-M 35mm f/2.5', # ? (ref PH) |
119
|
|
|
|
|
|
|
44 => 'Summarit-M 50mm f/2.5', # ? (ref PH) |
120
|
|
|
|
|
|
|
45 => 'Summarit-M 75mm f/2.5', # ? (ref PH) |
121
|
|
|
|
|
|
|
46 => 'Summarit-M 90mm f/2.5', # ? |
122
|
|
|
|
|
|
|
47 => 'Summilux-M 21mm f/1.4 ASPH.', # ? (ref 11) |
123
|
|
|
|
|
|
|
48 => 'Summilux-M 24mm f/1.4 ASPH.', # ? (ref 11) |
124
|
|
|
|
|
|
|
49 => 'Noctilux-M 50mm f/0.95 ASPH.', # ? (ref 11) |
125
|
|
|
|
|
|
|
50 => 'Elmar-M 24mm f/3.8 ASPH.', # ? (ref 11) |
126
|
|
|
|
|
|
|
51 => 'Super-Elmar-M 21mm f/3.4 Asph', # ? (ref 16, frameSelectorBits=1) |
127
|
|
|
|
|
|
|
'51 2' => 'Super-Elmar-M 14mm f/3.8 Asph', # ? (ref 16) |
128
|
|
|
|
|
|
|
52 => 'Apo-Telyt-M 18mm f/3.8 ASPH.', # ? (ref PH/11) |
129
|
|
|
|
|
|
|
53 => 'Apo-Telyt-M 135mm f/3.4', #IB |
130
|
|
|
|
|
|
|
'53 2' => 'Apo-Telyt-M 135mm f/3.4', #16 |
131
|
|
|
|
|
|
|
'53 3' => 'Apo-Summicron-M 50mm f/2 (VI)', #LR |
132
|
|
|
|
|
|
|
58 => 'Noctilux-M 75mm f/1.25 ASPH.', # ? (ref IB) |
133
|
|
|
|
|
|
|
); |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
# M9 frame selector bits for each lens |
136
|
|
|
|
|
|
|
# 1 = towards lens = 28/90mm or 21mm or Adapter (or Elmarit-M 135mm f/2.8) |
137
|
|
|
|
|
|
|
# 2 = away from lens = 24/35mm (or 35/135mm on the M9) |
138
|
|
|
|
|
|
|
# 3 = middle position = 50/75mm or 18mm |
139
|
|
|
|
|
|
|
my %frameSelectorBits = ( |
140
|
|
|
|
|
|
|
1 => 1, |
141
|
|
|
|
|
|
|
3 => 1, |
142
|
|
|
|
|
|
|
4 => 1, |
143
|
|
|
|
|
|
|
5 => 3, |
144
|
|
|
|
|
|
|
6 => 2, |
145
|
|
|
|
|
|
|
7 => 1, |
146
|
|
|
|
|
|
|
9 => 1, # (because lens has special magnifier for the rangefinder) |
147
|
|
|
|
|
|
|
16 => 1, # or 2 or 3 |
148
|
|
|
|
|
|
|
23 => 3, |
149
|
|
|
|
|
|
|
24 => 1, |
150
|
|
|
|
|
|
|
25 => 2, |
151
|
|
|
|
|
|
|
26 => 1, |
152
|
|
|
|
|
|
|
27 => 1, |
153
|
|
|
|
|
|
|
28 => 1, |
154
|
|
|
|
|
|
|
29 => 2, |
155
|
|
|
|
|
|
|
30 => 2, |
156
|
|
|
|
|
|
|
31 => 3, |
157
|
|
|
|
|
|
|
32 => 3, |
158
|
|
|
|
|
|
|
33 => 3, |
159
|
|
|
|
|
|
|
34 => 3, |
160
|
|
|
|
|
|
|
35 => 3, |
161
|
|
|
|
|
|
|
36 => 3, |
162
|
|
|
|
|
|
|
37 => 1, |
163
|
|
|
|
|
|
|
38 => 1, |
164
|
|
|
|
|
|
|
39 => 1, |
165
|
|
|
|
|
|
|
40 => 1, |
166
|
|
|
|
|
|
|
42 => 1, # or 2 or 3 |
167
|
|
|
|
|
|
|
43 => 2, # (NC) |
168
|
|
|
|
|
|
|
44 => 3, # (NC) |
169
|
|
|
|
|
|
|
45 => 3, |
170
|
|
|
|
|
|
|
46 => 1, # (NC) |
171
|
|
|
|
|
|
|
47 => 1, # (NC) |
172
|
|
|
|
|
|
|
48 => 2, # (NC) |
173
|
|
|
|
|
|
|
49 => 3, # (NC) |
174
|
|
|
|
|
|
|
50 => 2, # (NC) |
175
|
|
|
|
|
|
|
51 => 1, # or 2 (ref 16) |
176
|
|
|
|
|
|
|
52 => 3, |
177
|
|
|
|
|
|
|
53 => 2, #16 |
178
|
|
|
|
|
|
|
); |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
# conversions for ShootingMode and SceneMode |
181
|
|
|
|
|
|
|
my %shootingMode = ( |
182
|
|
|
|
|
|
|
1 => 'Normal', |
183
|
|
|
|
|
|
|
2 => 'Portrait', |
184
|
|
|
|
|
|
|
3 => 'Scenery', |
185
|
|
|
|
|
|
|
4 => 'Sports', |
186
|
|
|
|
|
|
|
5 => 'Night Portrait', |
187
|
|
|
|
|
|
|
6 => 'Program', |
188
|
|
|
|
|
|
|
7 => 'Aperture Priority', |
189
|
|
|
|
|
|
|
8 => 'Shutter Priority', |
190
|
|
|
|
|
|
|
9 => 'Macro', |
191
|
|
|
|
|
|
|
10 => 'Spot', #7 |
192
|
|
|
|
|
|
|
11 => 'Manual', |
193
|
|
|
|
|
|
|
12 => 'Movie Preview', #PH (LZ6) |
194
|
|
|
|
|
|
|
13 => 'Panning', |
195
|
|
|
|
|
|
|
14 => 'Simple', #PH (LZ6) |
196
|
|
|
|
|
|
|
15 => 'Color Effects', #7 |
197
|
|
|
|
|
|
|
16 => 'Self Portrait', #PH (TZ5) |
198
|
|
|
|
|
|
|
17 => 'Economy', #7 |
199
|
|
|
|
|
|
|
18 => 'Fireworks', |
200
|
|
|
|
|
|
|
19 => 'Party', |
201
|
|
|
|
|
|
|
20 => 'Snow', |
202
|
|
|
|
|
|
|
21 => 'Night Scenery', |
203
|
|
|
|
|
|
|
22 => 'Food', #7 |
204
|
|
|
|
|
|
|
23 => 'Baby', #JD |
205
|
|
|
|
|
|
|
24 => 'Soft Skin', #PH (LZ6) |
206
|
|
|
|
|
|
|
25 => 'Candlelight', #PH (LZ6) |
207
|
|
|
|
|
|
|
26 => 'Starry Night', #PH (LZ6) |
208
|
|
|
|
|
|
|
27 => 'High Sensitivity', #7 (LZ6) |
209
|
|
|
|
|
|
|
28 => 'Panorama Assist', #7 |
210
|
|
|
|
|
|
|
29 => 'Underwater', #7 |
211
|
|
|
|
|
|
|
30 => 'Beach', #PH (LZ6) |
212
|
|
|
|
|
|
|
31 => 'Aerial Photo', #PH (LZ6) |
213
|
|
|
|
|
|
|
32 => 'Sunset', #PH (LZ6) |
214
|
|
|
|
|
|
|
33 => 'Pet', #JD |
215
|
|
|
|
|
|
|
34 => 'Intelligent ISO', #PH (LZ6) |
216
|
|
|
|
|
|
|
35 => 'Clipboard', #7 |
217
|
|
|
|
|
|
|
36 => 'High Speed Continuous Shooting', #7 |
218
|
|
|
|
|
|
|
37 => 'Intelligent Auto', #7 |
219
|
|
|
|
|
|
|
39 => 'Multi-aspect', #PH (TZ5) |
220
|
|
|
|
|
|
|
41 => 'Transform', #PH (FS7) |
221
|
|
|
|
|
|
|
42 => 'Flash Burst', #PH (FZ28) |
222
|
|
|
|
|
|
|
43 => 'Pin Hole', #PH (FZ28) |
223
|
|
|
|
|
|
|
44 => 'Film Grain', #PH (FZ28) |
224
|
|
|
|
|
|
|
45 => 'My Color', #PH (GF1) |
225
|
|
|
|
|
|
|
46 => 'Photo Frame', #PH (FS7) |
226
|
|
|
|
|
|
|
48 => 'Movie', #PH (GM1) |
227
|
|
|
|
|
|
|
# 49 - seen for FS4 (snow?) |
228
|
|
|
|
|
|
|
51 => 'HDR', #12 |
229
|
|
|
|
|
|
|
52 => 'Peripheral Defocus', #Horst Wandres |
230
|
|
|
|
|
|
|
55 => 'Handheld Night Shot', #PH (FZ47) |
231
|
|
|
|
|
|
|
57 => '3D', #PH (3D1) |
232
|
|
|
|
|
|
|
59 => 'Creative Control', #PH (FZ47) |
233
|
|
|
|
|
|
|
60 => 'Intelligent Auto Plus', #20 |
234
|
|
|
|
|
|
|
62 => 'Panorama', #17 |
235
|
|
|
|
|
|
|
63 => 'Glass Through', #17 |
236
|
|
|
|
|
|
|
64 => 'HDR', #17 |
237
|
|
|
|
|
|
|
66 => 'Digital Filter', #PH (GF5 "Impressive Art", "Cross Process", "Color Select", "Star") |
238
|
|
|
|
|
|
|
67 => 'Clear Portrait', #18 |
239
|
|
|
|
|
|
|
68 => 'Silky Skin', #18 |
240
|
|
|
|
|
|
|
69 => 'Backlit Softness', #18 |
241
|
|
|
|
|
|
|
70 => 'Clear in Backlight', #18 |
242
|
|
|
|
|
|
|
71 => 'Relaxing Tone', #18 |
243
|
|
|
|
|
|
|
72 => "Sweet Child's Face", #18 |
244
|
|
|
|
|
|
|
73 => 'Distinct Scenery', #18 |
245
|
|
|
|
|
|
|
74 => 'Bright Blue Sky', #18 |
246
|
|
|
|
|
|
|
75 => 'Romantic Sunset Glow', #18 |
247
|
|
|
|
|
|
|
76 => 'Vivid Sunset Glow', #18 |
248
|
|
|
|
|
|
|
77 => 'Glistening Water', #18 |
249
|
|
|
|
|
|
|
78 => 'Clear Nightscape', #18 |
250
|
|
|
|
|
|
|
79 => 'Cool Night Sky', #18 |
251
|
|
|
|
|
|
|
80 => 'Warm Glowing Nightscape', #18 |
252
|
|
|
|
|
|
|
81 => 'Artistic Nightscape', #18 |
253
|
|
|
|
|
|
|
82 => 'Glittering Illuminations', #18 |
254
|
|
|
|
|
|
|
83 => 'Clear Night Portrait', #18 |
255
|
|
|
|
|
|
|
84 => 'Soft Image of a Flower', #18 |
256
|
|
|
|
|
|
|
85 => 'Appetizing Food', #18 |
257
|
|
|
|
|
|
|
86 => 'Cute Dessert', #18 |
258
|
|
|
|
|
|
|
87 => 'Freeze Animal Motion', #18 |
259
|
|
|
|
|
|
|
88 => 'Clear Sports Shot', #18 |
260
|
|
|
|
|
|
|
89 => 'Monochrome', #18 |
261
|
|
|
|
|
|
|
90 => 'Creative Control', #18 |
262
|
|
|
|
|
|
|
92 => 'Handheld Night Shot', #forum11523 |
263
|
|
|
|
|
|
|
); |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Main = ( |
266
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
267
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
268
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' }, |
269
|
|
|
|
|
|
|
WRITABLE => 1, |
270
|
|
|
|
|
|
|
0x01 => { |
271
|
|
|
|
|
|
|
Name => 'ImageQuality', |
272
|
|
|
|
|
|
|
Writable => 'int16u', |
273
|
|
|
|
|
|
|
Notes => 'quality of the main image, which may be in a different file', |
274
|
|
|
|
|
|
|
PrintConv => { |
275
|
|
|
|
|
|
|
1 => 'TIFF', #PH (FZ20) |
276
|
|
|
|
|
|
|
2 => 'High', |
277
|
|
|
|
|
|
|
3 => 'Normal', |
278
|
|
|
|
|
|
|
# 5 - seen this for 1920x1080, 30fps SZ7 video - PH |
279
|
|
|
|
|
|
|
6 => 'Very High', #3 (Leica) |
280
|
|
|
|
|
|
|
7 => 'RAW', #3 (Leica) |
281
|
|
|
|
|
|
|
9 => 'Motion Picture', #PH (LZ6) |
282
|
|
|
|
|
|
|
11 => 'Full HD Movie', #PH (V-LUX) |
283
|
|
|
|
|
|
|
12 => '4k Movie', #PH (V-LUX) |
284
|
|
|
|
|
|
|
}, |
285
|
|
|
|
|
|
|
}, |
286
|
|
|
|
|
|
|
0x02 => { |
287
|
|
|
|
|
|
|
Name => 'FirmwareVersion', |
288
|
|
|
|
|
|
|
Writable => 'undef', |
289
|
|
|
|
|
|
|
Notes => q{ |
290
|
|
|
|
|
|
|
for some camera models such as the FZ30 this may be an internal production |
291
|
|
|
|
|
|
|
reference number and not the actual firmware version |
292
|
|
|
|
|
|
|
}, # (ref http://www.stevesforums.com/forums/view_topic.php?id=87764&forum_id=23&) |
293
|
|
|
|
|
|
|
# (can be either binary or ascii -- add decimal points if binary) |
294
|
|
|
|
|
|
|
ValueConv => '$val=~/[\0-\x2f]/ ? join(" ",unpack("C*",$val)) : $val', |
295
|
|
|
|
|
|
|
ValueConvInv => q{ |
296
|
|
|
|
|
|
|
$val =~ /(\d+ ){3}\d+/ and $val = pack('C*',split(' ', $val)); |
297
|
|
|
|
|
|
|
length($val) == 4 or warn "Version must be 4 numbers\n"; |
298
|
|
|
|
|
|
|
return $val; |
299
|
|
|
|
|
|
|
}, |
300
|
|
|
|
|
|
|
PrintConv => '$val=~tr/ /./; $val', |
301
|
|
|
|
|
|
|
PrintConvInv => '$val=~tr/./ /; $val', |
302
|
|
|
|
|
|
|
}, |
303
|
|
|
|
|
|
|
0x03 => { |
304
|
|
|
|
|
|
|
Name => 'WhiteBalance', |
305
|
|
|
|
|
|
|
Writable => 'int16u', |
306
|
|
|
|
|
|
|
PrintConv => { |
307
|
|
|
|
|
|
|
1 => 'Auto', |
308
|
|
|
|
|
|
|
2 => 'Daylight', |
309
|
|
|
|
|
|
|
3 => 'Cloudy', |
310
|
|
|
|
|
|
|
4 => 'Incandescent', #PH |
311
|
|
|
|
|
|
|
5 => 'Manual', |
312
|
|
|
|
|
|
|
8 => 'Flash', |
313
|
|
|
|
|
|
|
10 => 'Black & White', #3 (Leica) |
314
|
|
|
|
|
|
|
11 => 'Manual 2', #PH (FZ8) |
315
|
|
|
|
|
|
|
12 => 'Shade', #PH (FS7) |
316
|
|
|
|
|
|
|
13 => 'Kelvin', #PeterK (NC) |
317
|
|
|
|
|
|
|
14 => 'Manual 3', #forum9296 |
318
|
|
|
|
|
|
|
15 => 'Manual 4', #forum9296 |
319
|
|
|
|
|
|
|
# also seen 18,26 (forum9296) |
320
|
|
|
|
|
|
|
19 => 'Auto (cool)', #PH (Leica C-Lux) |
321
|
|
|
|
|
|
|
}, |
322
|
|
|
|
|
|
|
}, |
323
|
|
|
|
|
|
|
0x07 => { |
324
|
|
|
|
|
|
|
Name => 'FocusMode', |
325
|
|
|
|
|
|
|
Writable => 'int16u', |
326
|
|
|
|
|
|
|
PrintConv => { |
327
|
|
|
|
|
|
|
1 => 'Auto', |
328
|
|
|
|
|
|
|
2 => 'Manual', |
329
|
|
|
|
|
|
|
4 => 'Auto, Focus button', #4 |
330
|
|
|
|
|
|
|
5 => 'Auto, Continuous', #4 |
331
|
|
|
|
|
|
|
6 => 'AF-S', #18 (also seen for GF1 - PH) |
332
|
|
|
|
|
|
|
7 => 'AF-C', #18 |
333
|
|
|
|
|
|
|
8 => 'AF-F', #18 (auto-focus flexible) |
334
|
|
|
|
|
|
|
}, |
335
|
|
|
|
|
|
|
}, |
336
|
|
|
|
|
|
|
0x0f => [ |
337
|
|
|
|
|
|
|
{ |
338
|
|
|
|
|
|
|
Name => 'AFAreaMode', |
339
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /DMC-FZ10\b/', #JD |
340
|
|
|
|
|
|
|
Writable => 'int8u', |
341
|
|
|
|
|
|
|
Count => 2, |
342
|
|
|
|
|
|
|
Notes => 'DMC-FZ10', |
343
|
|
|
|
|
|
|
PrintConv => { |
344
|
|
|
|
|
|
|
'0 1' => 'Spot Mode On', |
345
|
|
|
|
|
|
|
'0 16' => 'Spot Mode Off', |
346
|
|
|
|
|
|
|
}, |
347
|
|
|
|
|
|
|
},{ |
348
|
|
|
|
|
|
|
Name => 'AFAreaMode', |
349
|
|
|
|
|
|
|
Writable => 'int8u', |
350
|
|
|
|
|
|
|
Count => 2, |
351
|
|
|
|
|
|
|
Notes => 'other models', |
352
|
|
|
|
|
|
|
PrintConv => { #PH |
353
|
|
|
|
|
|
|
'0 1' => '9-area', # (FS7) |
354
|
|
|
|
|
|
|
'0 16' => '3-area (high speed)', # (FZ8) |
355
|
|
|
|
|
|
|
'0 23' => '23-area', #PH (FZ47,NC) |
356
|
|
|
|
|
|
|
'0 49' => '49-area', #20 |
357
|
|
|
|
|
|
|
'0 225' => '225-area', #22 |
358
|
|
|
|
|
|
|
'1 0' => 'Spot Focusing', # (FZ8) |
359
|
|
|
|
|
|
|
'1 1' => '5-area', # (FZ8) |
360
|
|
|
|
|
|
|
'16' => 'Normal?', # (only mode for DMC-LC20) |
361
|
|
|
|
|
|
|
'16 0' => '1-area', # (FZ8) |
362
|
|
|
|
|
|
|
'16 16' => '1-area (high speed)', # (FZ8) |
363
|
|
|
|
|
|
|
# '32 0' is Face Detect for FS7, and Face Detect or Focus Tracking |
364
|
|
|
|
|
|
|
# for the DMC-FZ200 (ref 17), and Auto is DMC-L1 guess, |
365
|
|
|
|
|
|
|
'32 0' => 'Tracking', |
366
|
|
|
|
|
|
|
'32 1' => '3-area (left)?', # (DMC-L1 guess) |
367
|
|
|
|
|
|
|
'32 2' => '3-area (center)?', # (DMC-L1 guess) |
368
|
|
|
|
|
|
|
'32 3' => '3-area (right)?', # (DMC-L1 guess) |
369
|
|
|
|
|
|
|
'64 0' => 'Face Detect', |
370
|
|
|
|
|
|
|
'64 1' => 'Face Detect (animal detect on)', #forum11194 |
371
|
|
|
|
|
|
|
'64 2' => 'Face Detect (animal detect off)', #forum11194 |
372
|
|
|
|
|
|
|
'128 0' => 'Pinpoint focus', #18/forum11194 |
373
|
|
|
|
|
|
|
'240 0' => 'Tracking', #22 |
374
|
|
|
|
|
|
|
}, |
375
|
|
|
|
|
|
|
}, |
376
|
|
|
|
|
|
|
], |
377
|
|
|
|
|
|
|
0x1a => { |
378
|
|
|
|
|
|
|
Name => 'ImageStabilization', |
379
|
|
|
|
|
|
|
Writable => 'int16u', |
380
|
|
|
|
|
|
|
PrintConv => { |
381
|
|
|
|
|
|
|
2 => 'On, Optical', |
382
|
|
|
|
|
|
|
3 => 'Off', |
383
|
|
|
|
|
|
|
4 => 'On, Mode 2', |
384
|
|
|
|
|
|
|
5 => 'On, Optical Panning', #18 |
385
|
|
|
|
|
|
|
# GF1 also has a "Mode 3" - PH |
386
|
|
|
|
|
|
|
6 => 'On, Body-only', #PH (GX7, sensor shift?) |
387
|
|
|
|
|
|
|
7 => 'On, Body-only Panning', #forum11194 |
388
|
|
|
|
|
|
|
9 => 'Dual IS', #20 |
389
|
|
|
|
|
|
|
10 => 'Dual IS Panning', #forum11194 |
390
|
|
|
|
|
|
|
11 => 'Dual2 IS', #forum9298 |
391
|
|
|
|
|
|
|
12 => 'Dual2 IS Panning', #forum11194 |
392
|
|
|
|
|
|
|
}, |
393
|
|
|
|
|
|
|
}, |
394
|
|
|
|
|
|
|
0x1c => { |
395
|
|
|
|
|
|
|
Name => 'MacroMode', |
396
|
|
|
|
|
|
|
Writable => 'int16u', |
397
|
|
|
|
|
|
|
PrintConv => { |
398
|
|
|
|
|
|
|
1 => 'On', |
399
|
|
|
|
|
|
|
2 => 'Off', |
400
|
|
|
|
|
|
|
0x101 => 'Tele-Macro', #7 |
401
|
|
|
|
|
|
|
0x201 => 'Macro Zoom', #PH (FS7) |
402
|
|
|
|
|
|
|
}, |
403
|
|
|
|
|
|
|
}, |
404
|
|
|
|
|
|
|
0x1f => { |
405
|
|
|
|
|
|
|
Name => 'ShootingMode', |
406
|
|
|
|
|
|
|
Writable => 'int16u', |
407
|
|
|
|
|
|
|
PrintConvColumns => 2, |
408
|
|
|
|
|
|
|
PrintConv => \%shootingMode, |
409
|
|
|
|
|
|
|
}, |
410
|
|
|
|
|
|
|
0x20 => { |
411
|
|
|
|
|
|
|
Name => 'Audio', |
412
|
|
|
|
|
|
|
Writable => 'int16u', |
413
|
|
|
|
|
|
|
PrintConv => { |
414
|
|
|
|
|
|
|
1 => 'Yes', |
415
|
|
|
|
|
|
|
2 => 'No', |
416
|
|
|
|
|
|
|
3 => 'Stereo', #PH (NC) |
417
|
|
|
|
|
|
|
}, |
418
|
|
|
|
|
|
|
}, |
419
|
|
|
|
|
|
|
0x21 => { #2 |
420
|
|
|
|
|
|
|
Name => 'DataDump', |
421
|
|
|
|
|
|
|
Writable => 0, |
422
|
|
|
|
|
|
|
Binary => 1, |
423
|
|
|
|
|
|
|
}, |
424
|
|
|
|
|
|
|
# 0x22 - normally 0, but 2 for 'Simple' ShootingMode in LZ6 sample - PH |
425
|
|
|
|
|
|
|
0x23 => { |
426
|
|
|
|
|
|
|
Name => 'WhiteBalanceBias', |
427
|
|
|
|
|
|
|
Format => 'int16s', |
428
|
|
|
|
|
|
|
Writable => 'int16s', |
429
|
|
|
|
|
|
|
ValueConv => '$val / 3', |
430
|
|
|
|
|
|
|
ValueConvInv => '$val * 3', |
431
|
|
|
|
|
|
|
PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', |
432
|
|
|
|
|
|
|
PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', |
433
|
|
|
|
|
|
|
}, |
434
|
|
|
|
|
|
|
0x24 => { |
435
|
|
|
|
|
|
|
Name => 'FlashBias', |
436
|
|
|
|
|
|
|
Format => 'int16s', |
437
|
|
|
|
|
|
|
Writable => 'int16s', |
438
|
|
|
|
|
|
|
ValueConv => '$val / 3', #17 (older models may not have factor of 3? - PH) |
439
|
|
|
|
|
|
|
ValueConvInv => '$val * 3', |
440
|
|
|
|
|
|
|
PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', |
441
|
|
|
|
|
|
|
PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', |
442
|
|
|
|
|
|
|
}, |
443
|
|
|
|
|
|
|
0x25 => { #PH |
444
|
|
|
|
|
|
|
Name => 'InternalSerialNumber', |
445
|
|
|
|
|
|
|
Writable => 'undef', |
446
|
|
|
|
|
|
|
Count => 16, |
447
|
|
|
|
|
|
|
Notes => q{ |
448
|
|
|
|
|
|
|
this number is unique, and contains the date of manufacture, but is not the |
449
|
|
|
|
|
|
|
same as the number printed on the camera body |
450
|
|
|
|
|
|
|
}, |
451
|
|
|
|
|
|
|
PrintConv => q{ |
452
|
|
|
|
|
|
|
return $val unless $val=~/^([A-Z][0-9A-Z]{2})(\d{2})(\d{2})(\d{2})(\d{4})/; |
453
|
|
|
|
|
|
|
my $yr = $2 + ($2 < 70 ? 2000 : 1900); |
454
|
|
|
|
|
|
|
return "($1) $yr:$3:$4 no. $5"; |
455
|
|
|
|
|
|
|
}, |
456
|
|
|
|
|
|
|
PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_', |
457
|
|
|
|
|
|
|
}, |
458
|
|
|
|
|
|
|
0x26 => { #PH |
459
|
|
|
|
|
|
|
Name => 'PanasonicExifVersion', |
460
|
|
|
|
|
|
|
Writable => 'undef', |
461
|
|
|
|
|
|
|
}, |
462
|
|
|
|
|
|
|
0x27 => { |
463
|
|
|
|
|
|
|
Name => 'VideoFrameRate', |
464
|
|
|
|
|
|
|
Writable => 'int16u', |
465
|
|
|
|
|
|
|
Notes => 'only valid for older models', |
466
|
|
|
|
|
|
|
PrintConv => { |
467
|
|
|
|
|
|
|
OTHER => sub { shift }, |
468
|
|
|
|
|
|
|
0 => 'n/a', |
469
|
|
|
|
|
|
|
}, |
470
|
|
|
|
|
|
|
}, |
471
|
|
|
|
|
|
|
0x28 => { |
472
|
|
|
|
|
|
|
Name => 'ColorEffect', |
473
|
|
|
|
|
|
|
Writable => 'int16u', |
474
|
|
|
|
|
|
|
# FX30 manual: (ColorMode) natural, vivid, cool, warm, b/w, sepia |
475
|
|
|
|
|
|
|
PrintConv => { |
476
|
|
|
|
|
|
|
1 => 'Off', |
477
|
|
|
|
|
|
|
2 => 'Warm', |
478
|
|
|
|
|
|
|
3 => 'Cool', |
479
|
|
|
|
|
|
|
4 => 'Black & White', |
480
|
|
|
|
|
|
|
5 => 'Sepia', |
481
|
|
|
|
|
|
|
6 => 'Happy', #PH (FX70) (yes, really. you wouldn't want sad colors now would you?) |
482
|
|
|
|
|
|
|
8 => 'Vivid', #PH (SZ3) |
483
|
|
|
|
|
|
|
}, |
484
|
|
|
|
|
|
|
}, |
485
|
|
|
|
|
|
|
0x29 => { #JD |
486
|
|
|
|
|
|
|
Name => 'TimeSincePowerOn', |
487
|
|
|
|
|
|
|
Writable => 'int32u', |
488
|
|
|
|
|
|
|
Notes => q{ |
489
|
|
|
|
|
|
|
time in 1/100 s from when the camera was powered on to when the image is |
490
|
|
|
|
|
|
|
written to memory card |
491
|
|
|
|
|
|
|
}, |
492
|
|
|
|
|
|
|
ValueConv => '$val / 100', |
493
|
|
|
|
|
|
|
ValueConvInv => '$val * 100', |
494
|
|
|
|
|
|
|
PrintConv => sub { # convert to format "[DD days ]HH:MM:SS.ss" |
495
|
|
|
|
|
|
|
my $val = shift; |
496
|
|
|
|
|
|
|
my $str = ''; |
497
|
|
|
|
|
|
|
if ($val >= 24 * 3600) { |
498
|
|
|
|
|
|
|
my $d = int($val / (24 * 3600)); |
499
|
|
|
|
|
|
|
$str .= "$d days "; |
500
|
|
|
|
|
|
|
$val -= $d * 24 * 3600; |
501
|
|
|
|
|
|
|
} |
502
|
|
|
|
|
|
|
my $h = int($val / 3600); |
503
|
|
|
|
|
|
|
$val -= $h * 3600; |
504
|
|
|
|
|
|
|
my $m = int($val / 60); |
505
|
|
|
|
|
|
|
$val -= $m * 60; |
506
|
|
|
|
|
|
|
my $ss = sprintf('%05.2f', $val); |
507
|
|
|
|
|
|
|
if ($ss >= 60) { |
508
|
|
|
|
|
|
|
$ss = '00.00'; |
509
|
|
|
|
|
|
|
++$m >= 60 and $m -= 60, ++$h; |
510
|
|
|
|
|
|
|
} |
511
|
|
|
|
|
|
|
return sprintf("%s%.2d:%.2d:%s",$str,$h,$m,$ss); |
512
|
|
|
|
|
|
|
}, |
513
|
|
|
|
|
|
|
PrintConvInv => sub { |
514
|
|
|
|
|
|
|
my $val = shift; |
515
|
|
|
|
|
|
|
my @vals = ($val =~ /\d+(?:\.\d*)?/g); |
516
|
|
|
|
|
|
|
my $sec = 0; |
517
|
|
|
|
|
|
|
$sec += 24 * 3600 * shift(@vals) if @vals > 3; |
518
|
|
|
|
|
|
|
$sec += 3600 * shift(@vals) if @vals > 2; |
519
|
|
|
|
|
|
|
$sec += 60 * shift(@vals) if @vals > 1; |
520
|
|
|
|
|
|
|
$sec += shift(@vals) if @vals; |
521
|
|
|
|
|
|
|
return $sec; |
522
|
|
|
|
|
|
|
}, |
523
|
|
|
|
|
|
|
}, |
524
|
|
|
|
|
|
|
0x2a => { #4 |
525
|
|
|
|
|
|
|
Name => 'BurstMode', |
526
|
|
|
|
|
|
|
Writable => 'int16u', |
527
|
|
|
|
|
|
|
Notes => 'decoding may be different for some models', |
528
|
|
|
|
|
|
|
PrintConv => { |
529
|
|
|
|
|
|
|
0 => 'Off', |
530
|
|
|
|
|
|
|
1 => 'On', #PH (TZ5) [was "Low/High Quality" from ref 4] |
531
|
|
|
|
|
|
|
2 => 'Auto Exposure Bracketing (AEB)', #17 |
532
|
|
|
|
|
|
|
3 => 'Focus Bracketing', #forum11194 |
533
|
|
|
|
|
|
|
4 => 'Unlimited', #PH (TZ5) |
534
|
|
|
|
|
|
|
8 => 'White Balance Bracketing', #18 |
535
|
|
|
|
|
|
|
17 => 'On (with flash)', #forum5597 |
536
|
|
|
|
|
|
|
18 => 'Aperture Bracketing', #forum11194 |
537
|
|
|
|
|
|
|
}, |
538
|
|
|
|
|
|
|
}, |
539
|
|
|
|
|
|
|
0x2b => { #4 |
540
|
|
|
|
|
|
|
Name => 'SequenceNumber', |
541
|
|
|
|
|
|
|
Writable => 'int32u', |
542
|
|
|
|
|
|
|
}, |
543
|
|
|
|
|
|
|
0x2c => [ |
544
|
|
|
|
|
|
|
{ |
545
|
|
|
|
|
|
|
Name => 'ContrastMode', |
546
|
|
|
|
|
|
|
Condition => q{ |
547
|
|
|
|
|
|
|
$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/ and |
548
|
|
|
|
|
|
|
# tested for DC-GH6, but rule out other DC- models just in case - PH |
549
|
|
|
|
|
|
|
$$self{Model} !~ /^DC-/ |
550
|
|
|
|
|
|
|
}, |
551
|
|
|
|
|
|
|
Flags => 'PrintHex', |
552
|
|
|
|
|
|
|
Writable => 'int16u', |
553
|
|
|
|
|
|
|
Notes => q{ |
554
|
|
|
|
|
|
|
this decoding seems to work for some models such as the LC1, LX2, FZ7, FZ8, |
555
|
|
|
|
|
|
|
FZ18 and FZ50, but may not be correct for other models such as the FX10, G1, L1, |
556
|
|
|
|
|
|
|
L10 and LC80 |
557
|
|
|
|
|
|
|
}, |
558
|
|
|
|
|
|
|
PrintConv => { |
559
|
|
|
|
|
|
|
0x00 => 'Normal', |
560
|
|
|
|
|
|
|
0x01 => 'Low', |
561
|
|
|
|
|
|
|
0x02 => 'High', |
562
|
|
|
|
|
|
|
# 0x03 - observed with LZ6 and TZ5 in Fireworks mode |
563
|
|
|
|
|
|
|
# and GX7 in Fantasy/Retro/OldDays/HighKey - PH |
564
|
|
|
|
|
|
|
# 0x04 - observed in MP4 movie with GM1 (EXIF and 0x39 Contrast "Normal") - PH |
565
|
|
|
|
|
|
|
0x05 => 'Normal 2', #forum1194 |
566
|
|
|
|
|
|
|
0x06 => 'Medium Low', #PH (FZ18) |
567
|
|
|
|
|
|
|
0x07 => 'Medium High', #PH (FZ18) |
568
|
|
|
|
|
|
|
# 0x08 - GX7 in DynamicMonochrome mode |
569
|
|
|
|
|
|
|
0x0d => 'High Dynamic', #PH (FZ47 in ?) |
570
|
|
|
|
|
|
|
# 0x13 - seen for LX100 (PH) |
571
|
|
|
|
|
|
|
0x18 => 'Dynamic Range (film-like)', #forum11194 |
572
|
|
|
|
|
|
|
0x2e => 'Match Filter Effects Toy', #forum11194 |
573
|
|
|
|
|
|
|
0x37 => 'Match Photo Style L. Monochrome', #forum11194 |
574
|
|
|
|
|
|
|
# DMC-LC1 values: |
575
|
|
|
|
|
|
|
0x100 => 'Low', |
576
|
|
|
|
|
|
|
0x110 => 'Normal', |
577
|
|
|
|
|
|
|
0x120 => 'High', |
578
|
|
|
|
|
|
|
} |
579
|
|
|
|
|
|
|
},{ |
580
|
|
|
|
|
|
|
Name => 'ContrastMode', |
581
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /^DMC-(GF\d+|G2)$/', |
582
|
|
|
|
|
|
|
Notes => 'these values are used by the G2, GF1, GF2, GF3, GF5 and GF6', |
583
|
|
|
|
|
|
|
Writable => 'int16u', |
584
|
|
|
|
|
|
|
PrintConv => { # (decoded for GF1 unless otherwise noted) |
585
|
|
|
|
|
|
|
0 => '-2', |
586
|
|
|
|
|
|
|
1 => '-1', |
587
|
|
|
|
|
|
|
2 => 'Normal', |
588
|
|
|
|
|
|
|
3 => '+1', |
589
|
|
|
|
|
|
|
4 => '+2', |
590
|
|
|
|
|
|
|
# Note: Other Contrast tags will be "Normal" in any of these modes: |
591
|
|
|
|
|
|
|
5 => 'Normal 2', # 5 - seen for Portrait (FX80) and Normal (GF6) |
592
|
|
|
|
|
|
|
7 => 'Nature (Color Film)', # (GF1,G2; GF3 "Miniature") |
593
|
|
|
|
|
|
|
9 => 'Expressive', #(GF3) |
594
|
|
|
|
|
|
|
12 => 'Smooth (Color Film) or Pure (My Color)', #(GF1,G2 "Smooth Color") |
595
|
|
|
|
|
|
|
17 => 'Dynamic (B&W Film)', #(GF1,G2) |
596
|
|
|
|
|
|
|
22 => 'Smooth (B&W Film)', #(GF1,G2) |
597
|
|
|
|
|
|
|
25 => 'High Dynamic', #(GF5) |
598
|
|
|
|
|
|
|
26 => 'Retro', #(GF5) |
599
|
|
|
|
|
|
|
27 => 'Dynamic (Color Film)', #(GF1,G2) (GF3 "High Key") |
600
|
|
|
|
|
|
|
28 => 'Low Key', #(GF5) |
601
|
|
|
|
|
|
|
29 => 'Toy Effect', #(GF5) |
602
|
|
|
|
|
|
|
32 => 'Vibrant (Color Film) or Expressive (My Color)', # (GF1; G2 "Vibrant"; GF2,GF5 "Expressive") |
603
|
|
|
|
|
|
|
33 => 'Elegant (My Color)', |
604
|
|
|
|
|
|
|
37 => 'Nostalgic (Color Film)', # (GF1,G2; GF5 "Sepia") |
605
|
|
|
|
|
|
|
41 => 'Dynamic Art (My Color)', # (GF5 "High Key") |
606
|
|
|
|
|
|
|
42 => 'Retro (My Color)', |
607
|
|
|
|
|
|
|
45 => 'Cinema', #(GF2) |
608
|
|
|
|
|
|
|
47 => 'Dynamic Mono', #(GF5) |
609
|
|
|
|
|
|
|
50 => 'Impressive Art', #(GF5) |
610
|
|
|
|
|
|
|
51 => 'Cross Process', #(GF5) |
611
|
|
|
|
|
|
|
100 => 'High Dynamic 2', #Exiv2 (G6) |
612
|
|
|
|
|
|
|
101 => 'Retro 2', #Exiv2 (G6) |
613
|
|
|
|
|
|
|
102 => 'High Key 2', #Exiv2 (G6) |
614
|
|
|
|
|
|
|
103 => 'Low Key 2', #Exiv2 (G6) |
615
|
|
|
|
|
|
|
104 => 'Toy Effect 2', #Exiv2 (G6) |
616
|
|
|
|
|
|
|
107 => 'Expressive 2', #(GF6) |
617
|
|
|
|
|
|
|
112 => 'Sepia', #Exiv2 (G6) |
618
|
|
|
|
|
|
|
117 => 'Miniature', #Exiv2 (G6) |
619
|
|
|
|
|
|
|
122 => 'Dynamic Monochrome', #(GF6) |
620
|
|
|
|
|
|
|
127 => 'Old Days', #Exiv2 (G6) |
621
|
|
|
|
|
|
|
132 => 'Dynamic Monochrome 2', #Exiv2 (G6) |
622
|
|
|
|
|
|
|
135 => 'Impressive Art 2', #Exiv2 (G6) |
623
|
|
|
|
|
|
|
136 => 'Cross Process 2', #Exiv2 (G6) |
624
|
|
|
|
|
|
|
137 => 'Toy Pop', #Exiv2 (G6) |
625
|
|
|
|
|
|
|
138 => 'Fantasy', #Exiv2 (G6) |
626
|
|
|
|
|
|
|
256 => 'Normal 3', #Exiv2 (G6) |
627
|
|
|
|
|
|
|
272 => 'Standard', #Exiv2 (G6) |
628
|
|
|
|
|
|
|
288 => 'High', #Exiv2 (G6) |
629
|
|
|
|
|
|
|
# more new modes for GF6: |
630
|
|
|
|
|
|
|
# ? => 'Old Days', |
631
|
|
|
|
|
|
|
# ? => 'Toy Pop', |
632
|
|
|
|
|
|
|
# ? => 'Bleach Bypass', |
633
|
|
|
|
|
|
|
# ? => 'Fantasy', |
634
|
|
|
|
|
|
|
# ? => 'Star Filter', |
635
|
|
|
|
|
|
|
# ? => 'One Point Color', |
636
|
|
|
|
|
|
|
# ? => 'Sunshine', |
637
|
|
|
|
|
|
|
}, |
638
|
|
|
|
|
|
|
},{ |
639
|
|
|
|
|
|
|
Name => 'ContrastMode', |
640
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /^DMC-(TZ10|ZS7)$/', |
641
|
|
|
|
|
|
|
Notes => 'these values are used by the TZ10 and ZS7', |
642
|
|
|
|
|
|
|
Writable => 'int16u', |
643
|
|
|
|
|
|
|
PrintConv => { |
644
|
|
|
|
|
|
|
0 => 'Normal', |
645
|
|
|
|
|
|
|
1 => '-2', |
646
|
|
|
|
|
|
|
2 => '+2', |
647
|
|
|
|
|
|
|
5 => '-1', |
648
|
|
|
|
|
|
|
6 => '+1', |
649
|
|
|
|
|
|
|
}, |
650
|
|
|
|
|
|
|
},{ |
651
|
|
|
|
|
|
|
Name => 'ContrastMode', |
652
|
|
|
|
|
|
|
Writable => 'int16u', |
653
|
|
|
|
|
|
|
}, |
654
|
|
|
|
|
|
|
], |
655
|
|
|
|
|
|
|
0x2d => { |
656
|
|
|
|
|
|
|
Name => 'NoiseReduction', |
657
|
|
|
|
|
|
|
Writable => 'int16u', |
658
|
|
|
|
|
|
|
Notes => 'the encoding for this value is not consistent between models', |
659
|
|
|
|
|
|
|
PrintConv => { |
660
|
|
|
|
|
|
|
0 => 'Standard', |
661
|
|
|
|
|
|
|
1 => 'Low (-1)', |
662
|
|
|
|
|
|
|
2 => 'High (+1)', |
663
|
|
|
|
|
|
|
3 => 'Lowest (-2)', #JD |
664
|
|
|
|
|
|
|
4 => 'Highest (+2)', #JD |
665
|
|
|
|
|
|
|
5 => '+5', #PH (NC) |
666
|
|
|
|
|
|
|
6 => '+6', # (NC) seen for DC-S1/S1R (IB) |
667
|
|
|
|
|
|
|
65531 => '-5', # LX100/FZ2500 "NR1" test shots at imaging-resource (PH) |
668
|
|
|
|
|
|
|
65532 => '-4', |
669
|
|
|
|
|
|
|
65533 => '-3', |
670
|
|
|
|
|
|
|
65534 => '-2', |
671
|
|
|
|
|
|
|
65535 => '-1', |
672
|
|
|
|
|
|
|
}, |
673
|
|
|
|
|
|
|
}, |
674
|
|
|
|
|
|
|
0x2e => { #4 |
675
|
|
|
|
|
|
|
Name => 'SelfTimer', |
676
|
|
|
|
|
|
|
Writable => 'int16u', |
677
|
|
|
|
|
|
|
PrintConv => { |
678
|
|
|
|
|
|
|
0 => 'Off (0)', #forum11529 |
679
|
|
|
|
|
|
|
1 => 'Off', |
680
|
|
|
|
|
|
|
2 => '10 s', |
681
|
|
|
|
|
|
|
3 => '2 s', |
682
|
|
|
|
|
|
|
4 => '10 s / 3 pictures', #17 |
683
|
|
|
|
|
|
|
258 => '2 s after shutter pressed', #forum11194 |
684
|
|
|
|
|
|
|
266 => '10 s after shutter pressed', #forum11194 |
685
|
|
|
|
|
|
|
778 => '3 photos after 10 s', #forum11194 |
686
|
|
|
|
|
|
|
}, |
687
|
|
|
|
|
|
|
}, |
688
|
|
|
|
|
|
|
# 0x2f - values: 1 (LZ6,FX10K) |
689
|
|
|
|
|
|
|
0x30 => { #7 |
690
|
|
|
|
|
|
|
Name => 'Rotation', |
691
|
|
|
|
|
|
|
Writable => 'int16u', |
692
|
|
|
|
|
|
|
PrintConv => { |
693
|
|
|
|
|
|
|
1 => 'Horizontal (normal)', |
694
|
|
|
|
|
|
|
3 => 'Rotate 180', #PH |
695
|
|
|
|
|
|
|
6 => 'Rotate 90 CW', #PH (ref 7 gives 270 CW) |
696
|
|
|
|
|
|
|
8 => 'Rotate 270 CW', #PH (ref 7 gives 90 CW) |
697
|
|
|
|
|
|
|
}, |
698
|
|
|
|
|
|
|
}, |
699
|
|
|
|
|
|
|
0x31 => { #PH (FS7) |
700
|
|
|
|
|
|
|
Name => 'AFAssistLamp', |
701
|
|
|
|
|
|
|
Writable => 'int16u', |
702
|
|
|
|
|
|
|
PrintConv => { |
703
|
|
|
|
|
|
|
1 => 'Fired', |
704
|
|
|
|
|
|
|
2 => 'Enabled but Not Used', |
705
|
|
|
|
|
|
|
3 => 'Disabled but Required', |
706
|
|
|
|
|
|
|
4 => 'Disabled and Not Required', |
707
|
|
|
|
|
|
|
# have seen a value of 5 - PH |
708
|
|
|
|
|
|
|
# values possibly related to FOC-L? - JD |
709
|
|
|
|
|
|
|
}, |
710
|
|
|
|
|
|
|
}, |
711
|
|
|
|
|
|
|
0x32 => { #7 |
712
|
|
|
|
|
|
|
Name => 'ColorMode', |
713
|
|
|
|
|
|
|
Writable => 'int16u', |
714
|
|
|
|
|
|
|
PrintConv => { |
715
|
|
|
|
|
|
|
0 => 'Normal', |
716
|
|
|
|
|
|
|
1 => 'Natural', |
717
|
|
|
|
|
|
|
2 => 'Vivid', |
718
|
|
|
|
|
|
|
# have seen 3 for GF2 - PH |
719
|
|
|
|
|
|
|
}, |
720
|
|
|
|
|
|
|
}, |
721
|
|
|
|
|
|
|
0x33 => { #JD |
722
|
|
|
|
|
|
|
Name => 'BabyAge', |
723
|
|
|
|
|
|
|
Writable => 'string', |
724
|
|
|
|
|
|
|
Notes => 'or pet age', #PH |
725
|
|
|
|
|
|
|
PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val', |
726
|
|
|
|
|
|
|
PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"', |
727
|
|
|
|
|
|
|
}, |
728
|
|
|
|
|
|
|
0x34 => { #7/PH |
729
|
|
|
|
|
|
|
Name => 'OpticalZoomMode', |
730
|
|
|
|
|
|
|
Writable => 'int16u', |
731
|
|
|
|
|
|
|
PrintConv => { |
732
|
|
|
|
|
|
|
1 => 'Standard', |
733
|
|
|
|
|
|
|
2 => 'Extended', |
734
|
|
|
|
|
|
|
}, |
735
|
|
|
|
|
|
|
}, |
736
|
|
|
|
|
|
|
0x35 => { #9 |
737
|
|
|
|
|
|
|
Name => 'ConversionLens', |
738
|
|
|
|
|
|
|
Writable => 'int16u', |
739
|
|
|
|
|
|
|
PrintConv => { #PH (unconfirmed) |
740
|
|
|
|
|
|
|
1 => 'Off', |
741
|
|
|
|
|
|
|
2 => 'Wide', |
742
|
|
|
|
|
|
|
3 => 'Telephoto', |
743
|
|
|
|
|
|
|
4 => 'Macro', |
744
|
|
|
|
|
|
|
}, |
745
|
|
|
|
|
|
|
}, |
746
|
|
|
|
|
|
|
0x36 => { #8 |
747
|
|
|
|
|
|
|
Name => 'TravelDay', |
748
|
|
|
|
|
|
|
Writable => 'int16u', |
749
|
|
|
|
|
|
|
PrintConv => '$val == 65535 ? "n/a" : $val', |
750
|
|
|
|
|
|
|
PrintConvInv => '$val =~ /(\d+)/ ? $1 : $val', |
751
|
|
|
|
|
|
|
}, |
752
|
|
|
|
|
|
|
# 0x37 - values: 0,1,2 (LZ6, 0 for movie preview); 257 (FX10K); 0,256 (TZ5, 0 for movie preview) |
753
|
|
|
|
|
|
|
# --> may indicate battery power (forum11388) |
754
|
|
|
|
|
|
|
0x38 => { #forum11388 |
755
|
|
|
|
|
|
|
Name => 'BatteryLevel', |
756
|
|
|
|
|
|
|
Writable => 'int16u', |
757
|
|
|
|
|
|
|
PrintConv => { |
758
|
|
|
|
|
|
|
1 => 'Full', |
759
|
|
|
|
|
|
|
2 => 'Medium', |
760
|
|
|
|
|
|
|
3 => 'Low', |
761
|
|
|
|
|
|
|
4 => 'Near Empty', |
762
|
|
|
|
|
|
|
7 => 'Near Full', |
763
|
|
|
|
|
|
|
8 => 'Medium Low', |
764
|
|
|
|
|
|
|
256 => 'n/a', |
765
|
|
|
|
|
|
|
}, |
766
|
|
|
|
|
|
|
}, |
767
|
|
|
|
|
|
|
0x39 => { #7 (L1/L10) |
768
|
|
|
|
|
|
|
Name => 'Contrast', |
769
|
|
|
|
|
|
|
Format => 'int16s', |
770
|
|
|
|
|
|
|
Writable => 'int16u', |
771
|
|
|
|
|
|
|
%Image::ExifTool::Exif::printParameter, |
772
|
|
|
|
|
|
|
}, |
773
|
|
|
|
|
|
|
0x3a => { |
774
|
|
|
|
|
|
|
Name => 'WorldTimeLocation', |
775
|
|
|
|
|
|
|
Writable => 'int16u', |
776
|
|
|
|
|
|
|
PrintConv => { |
777
|
|
|
|
|
|
|
1 => 'Home', |
778
|
|
|
|
|
|
|
2 => 'Destination', |
779
|
|
|
|
|
|
|
}, |
780
|
|
|
|
|
|
|
}, |
781
|
|
|
|
|
|
|
0x3b => { #PH (TZ5/FS7) |
782
|
|
|
|
|
|
|
# (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) |
783
|
|
|
|
|
|
|
Name => 'TextStamp', |
784
|
|
|
|
|
|
|
Writable => 'int16u', |
785
|
|
|
|
|
|
|
PrintConv => { 1 => 'Off', 2 => 'On' }, |
786
|
|
|
|
|
|
|
}, |
787
|
|
|
|
|
|
|
0x3c => { #PH |
788
|
|
|
|
|
|
|
Name => 'ProgramISO', # (maybe should rename this ISOSetting?) |
789
|
|
|
|
|
|
|
Writable => 'int16u', # (new models store a long here) |
790
|
|
|
|
|
|
|
PrintConv => { |
791
|
|
|
|
|
|
|
OTHER => sub { shift }, |
792
|
|
|
|
|
|
|
65534 => 'Intelligent ISO', #PH (FS7) |
793
|
|
|
|
|
|
|
65535 => 'n/a', |
794
|
|
|
|
|
|
|
-1 => 'n/a', |
795
|
|
|
|
|
|
|
}, |
796
|
|
|
|
|
|
|
}, |
797
|
|
|
|
|
|
|
0x3d => { #PH |
798
|
|
|
|
|
|
|
Name => 'AdvancedSceneType', |
799
|
|
|
|
|
|
|
Writable => 'int16u', |
800
|
|
|
|
|
|
|
Notes => 'used together with SceneMode to derive Composite AdvancedSceneMode', |
801
|
|
|
|
|
|
|
# see forum11194 for more info |
802
|
|
|
|
|
|
|
}, |
803
|
|
|
|
|
|
|
0x3e => { #PH (TZ5/FS7) |
804
|
|
|
|
|
|
|
# (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) |
805
|
|
|
|
|
|
|
Name => 'TextStamp', |
806
|
|
|
|
|
|
|
Writable => 'int16u', |
807
|
|
|
|
|
|
|
PrintConv => { 1 => 'Off', 2 => 'On' }, |
808
|
|
|
|
|
|
|
}, |
809
|
|
|
|
|
|
|
0x3f => { #PH (TZ7) |
810
|
|
|
|
|
|
|
Name => 'FacesDetected', |
811
|
|
|
|
|
|
|
Writable => 'int16u', |
812
|
|
|
|
|
|
|
}, |
813
|
|
|
|
|
|
|
0x40 => { #7 (L1/L10) |
814
|
|
|
|
|
|
|
Name => 'Saturation', |
815
|
|
|
|
|
|
|
Format => 'int16s', |
816
|
|
|
|
|
|
|
Writable => 'int16u', |
817
|
|
|
|
|
|
|
%Image::ExifTool::Exif::printParameter, |
818
|
|
|
|
|
|
|
}, |
819
|
|
|
|
|
|
|
0x41 => { #7 (L1/L10) |
820
|
|
|
|
|
|
|
Name => 'Sharpness', |
821
|
|
|
|
|
|
|
Format => 'int16s', |
822
|
|
|
|
|
|
|
Writable => 'int16u', |
823
|
|
|
|
|
|
|
%Image::ExifTool::Exif::printParameter, |
824
|
|
|
|
|
|
|
}, |
825
|
|
|
|
|
|
|
0x42 => { #7 (DMC-L1) |
826
|
|
|
|
|
|
|
Name => 'FilmMode', |
827
|
|
|
|
|
|
|
Writable => 'int16u', |
828
|
|
|
|
|
|
|
PrintConv => { |
829
|
|
|
|
|
|
|
0 => 'n/a', #PH (eg. FZ100 "Photo Frame" ShootingMode) |
830
|
|
|
|
|
|
|
1 => 'Standard (color)', |
831
|
|
|
|
|
|
|
2 => 'Dynamic (color)', |
832
|
|
|
|
|
|
|
3 => 'Nature (color)', |
833
|
|
|
|
|
|
|
4 => 'Smooth (color)', |
834
|
|
|
|
|
|
|
5 => 'Standard (B&W)', |
835
|
|
|
|
|
|
|
6 => 'Dynamic (B&W)', |
836
|
|
|
|
|
|
|
7 => 'Smooth (B&W)', |
837
|
|
|
|
|
|
|
# 8 => 'My Film 1'? (from owner manual) |
838
|
|
|
|
|
|
|
# 9 => 'My Film 2'? |
839
|
|
|
|
|
|
|
10 => 'Nostalgic', #(GH1) |
840
|
|
|
|
|
|
|
11 => 'Vibrant', #(GH1) |
841
|
|
|
|
|
|
|
# 12 => 'Multi Film'? (in the GH1 specs) |
842
|
|
|
|
|
|
|
}, |
843
|
|
|
|
|
|
|
}, |
844
|
|
|
|
|
|
|
0x43 => { #forum9369 |
845
|
|
|
|
|
|
|
Name => 'JPEGQuality', |
846
|
|
|
|
|
|
|
Writable => 'int16u', |
847
|
|
|
|
|
|
|
PrintConv => { |
848
|
|
|
|
|
|
|
0 => 'n/a (Movie)', |
849
|
|
|
|
|
|
|
2 => 'High', |
850
|
|
|
|
|
|
|
3 => 'Standard', |
851
|
|
|
|
|
|
|
6 => 'Very High', |
852
|
|
|
|
|
|
|
255 => 'n/a (RAW only)', |
853
|
|
|
|
|
|
|
}, |
854
|
|
|
|
|
|
|
}, |
855
|
|
|
|
|
|
|
0x44 => { |
856
|
|
|
|
|
|
|
Name => 'ColorTempKelvin', |
857
|
|
|
|
|
|
|
Format => 'int16u', |
858
|
|
|
|
|
|
|
}, |
859
|
|
|
|
|
|
|
0x45 => { #19 |
860
|
|
|
|
|
|
|
Name => 'BracketSettings', |
861
|
|
|
|
|
|
|
Writable => 'int16u', |
862
|
|
|
|
|
|
|
PrintConv => { |
863
|
|
|
|
|
|
|
0 => 'No Bracket', |
864
|
|
|
|
|
|
|
1 => '3 Images, Sequence 0/-/+', |
865
|
|
|
|
|
|
|
2 => '3 Images, Sequence -/0/+', |
866
|
|
|
|
|
|
|
3 => '5 Images, Sequence 0/-/+', |
867
|
|
|
|
|
|
|
4 => '5 Images, Sequence -/0/+', |
868
|
|
|
|
|
|
|
5 => '7 Images, Sequence 0/-/+', |
869
|
|
|
|
|
|
|
6 => '7 Images, Sequence -/0/+', |
870
|
|
|
|
|
|
|
}, |
871
|
|
|
|
|
|
|
}, |
872
|
|
|
|
|
|
|
0x46 => { #PH/JD |
873
|
|
|
|
|
|
|
Name => 'WBShiftAB', |
874
|
|
|
|
|
|
|
Format => 'int16s', |
875
|
|
|
|
|
|
|
Writable => 'int16u', |
876
|
|
|
|
|
|
|
Notes => 'positive is a shift toward blue', |
877
|
|
|
|
|
|
|
}, |
878
|
|
|
|
|
|
|
0x47 => { #PH/JD |
879
|
|
|
|
|
|
|
Name => 'WBShiftGM', |
880
|
|
|
|
|
|
|
Format => 'int16s', |
881
|
|
|
|
|
|
|
Writable => 'int16u', |
882
|
|
|
|
|
|
|
Notes => 'positive is a shift toward green', |
883
|
|
|
|
|
|
|
}, |
884
|
|
|
|
|
|
|
0x48 => { #17 |
885
|
|
|
|
|
|
|
Name => 'FlashCurtain', |
886
|
|
|
|
|
|
|
Writable => 'int16u', |
887
|
|
|
|
|
|
|
PrintConv => { |
888
|
|
|
|
|
|
|
0 => 'n/a', |
889
|
|
|
|
|
|
|
1 => '1st', |
890
|
|
|
|
|
|
|
2 => '2nd', |
891
|
|
|
|
|
|
|
}, |
892
|
|
|
|
|
|
|
}, |
893
|
|
|
|
|
|
|
0x49 => { #19 |
894
|
|
|
|
|
|
|
Name => 'LongExposureNoiseReduction', # (indicates availability, forum11194) |
895
|
|
|
|
|
|
|
Writable => 'int16u', |
896
|
|
|
|
|
|
|
PrintConv => { |
897
|
|
|
|
|
|
|
1 => 'Off', |
898
|
|
|
|
|
|
|
2 => 'On' |
899
|
|
|
|
|
|
|
} |
900
|
|
|
|
|
|
|
}, |
901
|
|
|
|
|
|
|
# 0x4a - int16u: 0 |
902
|
|
|
|
|
|
|
0x4b => { #PH |
903
|
|
|
|
|
|
|
Name => 'PanasonicImageWidth', |
904
|
|
|
|
|
|
|
Writable => 'int32u', |
905
|
|
|
|
|
|
|
}, |
906
|
|
|
|
|
|
|
0x4c => { #PH |
907
|
|
|
|
|
|
|
Name => 'PanasonicImageHeight', |
908
|
|
|
|
|
|
|
Writable => 'int32u', |
909
|
|
|
|
|
|
|
}, |
910
|
|
|
|
|
|
|
0x4d => { #PH (FS7) |
911
|
|
|
|
|
|
|
Name => 'AFPointPosition', |
912
|
|
|
|
|
|
|
Writable => 'rational64u', |
913
|
|
|
|
|
|
|
Count => 2, |
914
|
|
|
|
|
|
|
Notes => 'X Y coordinates of primary AF area center, in the range 0.0 to 1.0', |
915
|
|
|
|
|
|
|
PrintConv => q{ |
916
|
|
|
|
|
|
|
return 'none' if $val eq '16777216 16777216'; |
917
|
|
|
|
|
|
|
my @a = split ' ', $val; |
918
|
|
|
|
|
|
|
sprintf("%.2g %.2g",@a); |
919
|
|
|
|
|
|
|
}, |
920
|
|
|
|
|
|
|
PrintConvInv => '$val eq "none" ? "16777216 16777216" : $val', |
921
|
|
|
|
|
|
|
}, |
922
|
|
|
|
|
|
|
0x4e => { #PH |
923
|
|
|
|
|
|
|
Name => 'FaceDetInfo', |
924
|
|
|
|
|
|
|
PrintConv => 'length $val', |
925
|
|
|
|
|
|
|
SubDirectory => { |
926
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::FaceDetInfo', |
927
|
|
|
|
|
|
|
}, |
928
|
|
|
|
|
|
|
}, |
929
|
|
|
|
|
|
|
# 0x4f,0x50 - int16u: 0 |
930
|
|
|
|
|
|
|
0x51 => { |
931
|
|
|
|
|
|
|
Name => 'LensType', |
932
|
|
|
|
|
|
|
Writable => 'string', |
933
|
|
|
|
|
|
|
ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces |
934
|
|
|
|
|
|
|
ValueConvInv => '$val', |
935
|
|
|
|
|
|
|
}, |
936
|
|
|
|
|
|
|
0x52 => { #7 (DMC-L1) |
937
|
|
|
|
|
|
|
Name => 'LensSerialNumber', |
938
|
|
|
|
|
|
|
Writable => 'string', |
939
|
|
|
|
|
|
|
ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces |
940
|
|
|
|
|
|
|
ValueConvInv => '$val', |
941
|
|
|
|
|
|
|
}, |
942
|
|
|
|
|
|
|
0x53 => { #7 (DMC-L1) |
943
|
|
|
|
|
|
|
Name => 'AccessoryType', |
944
|
|
|
|
|
|
|
Writable => 'string', |
945
|
|
|
|
|
|
|
ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces |
946
|
|
|
|
|
|
|
ValueConvInv => '$val', |
947
|
|
|
|
|
|
|
}, |
948
|
|
|
|
|
|
|
0x54 => { #19 |
949
|
|
|
|
|
|
|
Name => 'AccessorySerialNumber', |
950
|
|
|
|
|
|
|
Writable => 'string', |
951
|
|
|
|
|
|
|
ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces |
952
|
|
|
|
|
|
|
ValueConvInv => '$val', |
953
|
|
|
|
|
|
|
}, |
954
|
|
|
|
|
|
|
# 0x55 - int16u: 1 (see forum9372) |
955
|
|
|
|
|
|
|
# 0x57 - int16u: 0 |
956
|
|
|
|
|
|
|
0x59 => { #PH (FS7) |
957
|
|
|
|
|
|
|
Name => 'Transform', |
958
|
|
|
|
|
|
|
Writable => 'undef', |
959
|
|
|
|
|
|
|
Notes => 'decoded as two 16-bit signed integers', |
960
|
|
|
|
|
|
|
Format => 'int16s', |
961
|
|
|
|
|
|
|
Count => 2, |
962
|
|
|
|
|
|
|
PrintConv => { |
963
|
|
|
|
|
|
|
'-3 2' => 'Slim High', |
964
|
|
|
|
|
|
|
'-1 1' => 'Slim Low', |
965
|
|
|
|
|
|
|
'0 0' => 'Off', |
966
|
|
|
|
|
|
|
'1 1' => 'Stretch Low', |
967
|
|
|
|
|
|
|
'3 2' => 'Stretch High', |
968
|
|
|
|
|
|
|
}, |
969
|
|
|
|
|
|
|
}, |
970
|
|
|
|
|
|
|
# 0x5a - int16u: 0,2 |
971
|
|
|
|
|
|
|
# 0x5b - int16u: 0 |
972
|
|
|
|
|
|
|
# 0x5c - int16u: 0,2 |
973
|
|
|
|
|
|
|
0x5d => { #PH (GF1, FZ35) |
974
|
|
|
|
|
|
|
Name => 'IntelligentExposure', |
975
|
|
|
|
|
|
|
Notes => 'not valid for some models', # (doesn't change in ZS7 and GH1 images) |
976
|
|
|
|
|
|
|
Writable => 'int16u', |
977
|
|
|
|
|
|
|
PrintConv => { |
978
|
|
|
|
|
|
|
0 => 'Off', |
979
|
|
|
|
|
|
|
1 => 'Low', |
980
|
|
|
|
|
|
|
2 => 'Standard', |
981
|
|
|
|
|
|
|
3 => 'High', |
982
|
|
|
|
|
|
|
}, |
983
|
|
|
|
|
|
|
}, |
984
|
|
|
|
|
|
|
# 0x5e,0x5f - undef[4] |
985
|
|
|
|
|
|
|
0x60 => { #18 |
986
|
|
|
|
|
|
|
Name => 'LensFirmwareVersion', |
987
|
|
|
|
|
|
|
Writable => 'undef', |
988
|
|
|
|
|
|
|
Format => 'int8u', |
989
|
|
|
|
|
|
|
Count => 4, |
990
|
|
|
|
|
|
|
PrintConv => '$val=~tr/ /./; $val', |
991
|
|
|
|
|
|
|
PrintConvInv => '$val=~tr/./ /; $val', |
992
|
|
|
|
|
|
|
}, |
993
|
|
|
|
|
|
|
0x61 => { #PH |
994
|
|
|
|
|
|
|
Name => 'FaceRecInfo', |
995
|
|
|
|
|
|
|
SubDirectory => { |
996
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::FaceRecInfo', |
997
|
|
|
|
|
|
|
}, |
998
|
|
|
|
|
|
|
}, |
999
|
|
|
|
|
|
|
0x62 => { #PH (FS7) |
1000
|
|
|
|
|
|
|
Name => 'FlashWarning', |
1001
|
|
|
|
|
|
|
Writable => 'int16u', |
1002
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => 'Yes (flash required but disabled)' }, |
1003
|
|
|
|
|
|
|
}, |
1004
|
|
|
|
|
|
|
0x63 => { #PH |
1005
|
|
|
|
|
|
|
# not sure exactly what this means, but in my samples this is |
1006
|
|
|
|
|
|
|
# FacesRecognized bytes of 0x01, padded with 0x00 to a length of 4 - PH |
1007
|
|
|
|
|
|
|
Name => 'RecognizedFaceFlags', |
1008
|
|
|
|
|
|
|
Format => 'int8u', |
1009
|
|
|
|
|
|
|
Count => 4, |
1010
|
|
|
|
|
|
|
Writable => 'undef', |
1011
|
|
|
|
|
|
|
Unknown => 1, |
1012
|
|
|
|
|
|
|
}, |
1013
|
|
|
|
|
|
|
0x65 => { #15 |
1014
|
|
|
|
|
|
|
Name => 'Title', |
1015
|
|
|
|
|
|
|
Format => 'string', |
1016
|
|
|
|
|
|
|
Writable => 'undef', # (Count 64) |
1017
|
|
|
|
|
|
|
}, |
1018
|
|
|
|
|
|
|
0x66 => { #15 |
1019
|
|
|
|
|
|
|
Name => 'BabyName', |
1020
|
|
|
|
|
|
|
Notes => 'or pet name', |
1021
|
|
|
|
|
|
|
Format => 'string', |
1022
|
|
|
|
|
|
|
Writable => 'undef', # (Count 64) |
1023
|
|
|
|
|
|
|
}, |
1024
|
|
|
|
|
|
|
0x67 => { #15 |
1025
|
|
|
|
|
|
|
Name => 'Location', |
1026
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1027
|
|
|
|
|
|
|
Format => 'string', |
1028
|
|
|
|
|
|
|
Writable => 'undef', # (Count 64) |
1029
|
|
|
|
|
|
|
}, |
1030
|
|
|
|
|
|
|
# 0x68 - int8u: 1 |
1031
|
|
|
|
|
|
|
0x69 => { #PH (ZS7) |
1032
|
|
|
|
|
|
|
Name => 'Country', # (Country/Region) |
1033
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1034
|
|
|
|
|
|
|
Format => 'string', |
1035
|
|
|
|
|
|
|
Writable => 'undef', # (Count 72) |
1036
|
|
|
|
|
|
|
}, |
1037
|
|
|
|
|
|
|
# 0x6a - int8u: 1 |
1038
|
|
|
|
|
|
|
0x6b => { #PH (ZS7) |
1039
|
|
|
|
|
|
|
Name => 'State', # (State/Province/Count -- what is Count?) |
1040
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1041
|
|
|
|
|
|
|
Format => 'string', |
1042
|
|
|
|
|
|
|
Writable => 'undef', # (Count 72) |
1043
|
|
|
|
|
|
|
}, |
1044
|
|
|
|
|
|
|
# 0x6c - int8u: 1 |
1045
|
|
|
|
|
|
|
0x6d => { #PH (ZS7) (also see forum5997) |
1046
|
|
|
|
|
|
|
Name => 'City', # (City/Town) |
1047
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1048
|
|
|
|
|
|
|
Format => 'string', |
1049
|
|
|
|
|
|
|
Writable => 'undef', # (Count 72) |
1050
|
|
|
|
|
|
|
Notes => 'City/Town as stored by some models, or County/Township for others', |
1051
|
|
|
|
|
|
|
}, |
1052
|
|
|
|
|
|
|
# 0x6e - int8u: 1 |
1053
|
|
|
|
|
|
|
0x6f => { #PH (ZS7) |
1054
|
|
|
|
|
|
|
Name => 'Landmark', # (Landmark) |
1055
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1056
|
|
|
|
|
|
|
Format => 'string', |
1057
|
|
|
|
|
|
|
Writable => 'undef', # (Count 128) |
1058
|
|
|
|
|
|
|
}, |
1059
|
|
|
|
|
|
|
0x70 => { #PH (ZS7) |
1060
|
|
|
|
|
|
|
Name => 'IntelligentResolution', |
1061
|
|
|
|
|
|
|
Writable => 'int8u', |
1062
|
|
|
|
|
|
|
PrintConv => { |
1063
|
|
|
|
|
|
|
0 => 'Off', |
1064
|
|
|
|
|
|
|
# Note: I think these values make sense for the GH2, but meanings |
1065
|
|
|
|
|
|
|
# may be different for other models |
1066
|
|
|
|
|
|
|
1 => 'Low', |
1067
|
|
|
|
|
|
|
2 => 'Standard', |
1068
|
|
|
|
|
|
|
3 => 'High', |
1069
|
|
|
|
|
|
|
4 => 'Extended', |
1070
|
|
|
|
|
|
|
}, |
1071
|
|
|
|
|
|
|
}, |
1072
|
|
|
|
|
|
|
# 0x71 - undef[128] (maybe text stamp text?) |
1073
|
|
|
|
|
|
|
0x77 => { #18 |
1074
|
|
|
|
|
|
|
Name => 'BurstSpeed', |
1075
|
|
|
|
|
|
|
Writable => 'int16u', |
1076
|
|
|
|
|
|
|
Notes => 'images per second', |
1077
|
|
|
|
|
|
|
}, |
1078
|
|
|
|
|
|
|
# 0x72,0x73,0x74,0x75,0x77,0x78: 0 |
1079
|
|
|
|
|
|
|
# 0x76: 0, (3 for G6 with HDR on, ref 18) |
1080
|
|
|
|
|
|
|
0x76 => { #18/21 |
1081
|
|
|
|
|
|
|
Name => 'HDRShot', |
1082
|
|
|
|
|
|
|
Writable => 'int16u', |
1083
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 3 => 'On' }, |
1084
|
|
|
|
|
|
|
}, |
1085
|
|
|
|
|
|
|
0x79 => { #PH (GH2) |
1086
|
|
|
|
|
|
|
Name => 'IntelligentD-Range', |
1087
|
|
|
|
|
|
|
Writable => 'int16u', |
1088
|
|
|
|
|
|
|
PrintConv => { |
1089
|
|
|
|
|
|
|
0 => 'Off', |
1090
|
|
|
|
|
|
|
1 => 'Low', |
1091
|
|
|
|
|
|
|
2 => 'Standard', |
1092
|
|
|
|
|
|
|
3 => 'High', |
1093
|
|
|
|
|
|
|
}, |
1094
|
|
|
|
|
|
|
}, |
1095
|
|
|
|
|
|
|
# 0x7a,0x7b: 0 |
1096
|
|
|
|
|
|
|
0x7c => { #18 |
1097
|
|
|
|
|
|
|
Name => 'ClearRetouch', |
1098
|
|
|
|
|
|
|
Writable => 'int16u', |
1099
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'On' }, |
1100
|
|
|
|
|
|
|
}, |
1101
|
|
|
|
|
|
|
0x80 => { #forum5997 (seen garbage here for SZ5 - PH) |
1102
|
|
|
|
|
|
|
Name => 'City2', # (City/Town/Village) |
1103
|
|
|
|
|
|
|
Groups => { 2 => 'Location' }, |
1104
|
|
|
|
|
|
|
Format => 'string', |
1105
|
|
|
|
|
|
|
Writable => 'undef', # (Count 72) |
1106
|
|
|
|
|
|
|
Notes => 'City/Town/Village as stored by some models', |
1107
|
|
|
|
|
|
|
}, |
1108
|
|
|
|
|
|
|
# 0x81 - undef[72]: "---" |
1109
|
|
|
|
|
|
|
# 0x82 - undef[72]: "---" |
1110
|
|
|
|
|
|
|
# 0x83 - undef[72]: "---" |
1111
|
|
|
|
|
|
|
# 0x84 - undef[72]: "---" |
1112
|
|
|
|
|
|
|
# 0x85 - undef[128]: "---" |
1113
|
|
|
|
|
|
|
0x86 => { #http://dev.exiv2.org/issues/825 |
1114
|
|
|
|
|
|
|
Name => 'ManometerPressure', |
1115
|
|
|
|
|
|
|
Writable => 'int16u', |
1116
|
|
|
|
|
|
|
RawConv => '$val==65535 ? undef : $val', |
1117
|
|
|
|
|
|
|
ValueConv => '$val / 10', |
1118
|
|
|
|
|
|
|
ValueConvInv => '$val * 10', |
1119
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.1f kPa",$val)', |
1120
|
|
|
|
|
|
|
PrintConvInv => '$val=~s/ ?kPa//i; $val', |
1121
|
|
|
|
|
|
|
}, |
1122
|
|
|
|
|
|
|
0x89 => { |
1123
|
|
|
|
|
|
|
Name => 'PhotoStyle', |
1124
|
|
|
|
|
|
|
Writable => 'int16u', |
1125
|
|
|
|
|
|
|
PrintConv => { |
1126
|
|
|
|
|
|
|
0 => 'Auto', |
1127
|
|
|
|
|
|
|
1 => 'Standard or Custom', |
1128
|
|
|
|
|
|
|
2 => 'Vivid', |
1129
|
|
|
|
|
|
|
3 => 'Natural', |
1130
|
|
|
|
|
|
|
4 => 'Monochrome', |
1131
|
|
|
|
|
|
|
5 => 'Scenery', |
1132
|
|
|
|
|
|
|
6 => 'Portrait', |
1133
|
|
|
|
|
|
|
8 => 'Cinelike D', #forum11194 |
1134
|
|
|
|
|
|
|
9 => 'Cinelike V', #forum11194 |
1135
|
|
|
|
|
|
|
11 => 'L. Monochrome', #forum11194 |
1136
|
|
|
|
|
|
|
12 => 'Like709', #forum14033 |
1137
|
|
|
|
|
|
|
15 => 'L. Monochrome D', #forum11194 |
1138
|
|
|
|
|
|
|
17 => 'V-Log', #forum14033 |
1139
|
|
|
|
|
|
|
18 => 'Cinelike D2', #forum14033 |
1140
|
|
|
|
|
|
|
}, |
1141
|
|
|
|
|
|
|
}, |
1142
|
|
|
|
|
|
|
0x8a => { #18 |
1143
|
|
|
|
|
|
|
Name => 'ShadingCompensation', |
1144
|
|
|
|
|
|
|
Writable => 'int16u', |
1145
|
|
|
|
|
|
|
PrintConv => { |
1146
|
|
|
|
|
|
|
0 => 'Off', |
1147
|
|
|
|
|
|
|
1 => 'On' |
1148
|
|
|
|
|
|
|
} |
1149
|
|
|
|
|
|
|
}, |
1150
|
|
|
|
|
|
|
0x8b => { #21 |
1151
|
|
|
|
|
|
|
Name => 'WBShiftIntelligentAuto', |
1152
|
|
|
|
|
|
|
Writable => 'int16u', |
1153
|
|
|
|
|
|
|
Format => 'int16s', |
1154
|
|
|
|
|
|
|
Notes => 'value is -9 for blue to +9 for amber. Valid for Intelligent-Auto modes', |
1155
|
|
|
|
|
|
|
}, |
1156
|
|
|
|
|
|
|
0x8c => { |
1157
|
|
|
|
|
|
|
Name => 'AccelerometerZ', |
1158
|
|
|
|
|
|
|
Writable => 'int16u', |
1159
|
|
|
|
|
|
|
Format => 'int16s', |
1160
|
|
|
|
|
|
|
Notes => 'positive is acceleration upwards', |
1161
|
|
|
|
|
|
|
}, |
1162
|
|
|
|
|
|
|
0x8d => { |
1163
|
|
|
|
|
|
|
Name => 'AccelerometerX', |
1164
|
|
|
|
|
|
|
Writable => 'int16u', |
1165
|
|
|
|
|
|
|
Format => 'int16s', |
1166
|
|
|
|
|
|
|
Notes => 'positive is acceleration to the left', |
1167
|
|
|
|
|
|
|
}, |
1168
|
|
|
|
|
|
|
0x8e => { |
1169
|
|
|
|
|
|
|
Name => 'AccelerometerY', |
1170
|
|
|
|
|
|
|
Writable => 'int16u', |
1171
|
|
|
|
|
|
|
Format => 'int16s', |
1172
|
|
|
|
|
|
|
Notes => 'positive is acceleration backwards', |
1173
|
|
|
|
|
|
|
}, |
1174
|
|
|
|
|
|
|
0x8f => { #18 |
1175
|
|
|
|
|
|
|
Name => 'CameraOrientation', |
1176
|
|
|
|
|
|
|
Writable => 'int8u', |
1177
|
|
|
|
|
|
|
PrintConv => { |
1178
|
|
|
|
|
|
|
0 => 'Normal', |
1179
|
|
|
|
|
|
|
1 => 'Rotate CW', |
1180
|
|
|
|
|
|
|
2 => 'Rotate 180', |
1181
|
|
|
|
|
|
|
3 => 'Rotate CCW', |
1182
|
|
|
|
|
|
|
4 => 'Tilt Upwards', |
1183
|
|
|
|
|
|
|
5 => 'Tilt Downwards' |
1184
|
|
|
|
|
|
|
} |
1185
|
|
|
|
|
|
|
}, |
1186
|
|
|
|
|
|
|
0x90 => { |
1187
|
|
|
|
|
|
|
Name => 'RollAngle', |
1188
|
|
|
|
|
|
|
Writable => 'int16u', |
1189
|
|
|
|
|
|
|
Format => 'int16s', |
1190
|
|
|
|
|
|
|
Notes => 'converted to degrees of clockwise camera rotation', |
1191
|
|
|
|
|
|
|
ValueConv => '$val / 10', |
1192
|
|
|
|
|
|
|
ValueConvInv => '$val * 10', |
1193
|
|
|
|
|
|
|
}, |
1194
|
|
|
|
|
|
|
0x91 => { |
1195
|
|
|
|
|
|
|
Name => 'PitchAngle', |
1196
|
|
|
|
|
|
|
Writable => 'int16u', |
1197
|
|
|
|
|
|
|
Format => 'int16s', |
1198
|
|
|
|
|
|
|
Notes => 'converted to degrees of upward camera tilt', |
1199
|
|
|
|
|
|
|
ValueConv => '-$val / 10', |
1200
|
|
|
|
|
|
|
ValueConvInv => '-$val * 10', |
1201
|
|
|
|
|
|
|
}, |
1202
|
|
|
|
|
|
|
0x92 => { #21 (forum9453) (more to decode in forum11194) |
1203
|
|
|
|
|
|
|
Name => 'WBShiftCreativeControl', |
1204
|
|
|
|
|
|
|
Writable => 'int8u', |
1205
|
|
|
|
|
|
|
Format => 'int8s', |
1206
|
|
|
|
|
|
|
Notes => 'WB shift or style strength. Valid for Creative-Control modes', |
1207
|
|
|
|
|
|
|
}, |
1208
|
|
|
|
|
|
|
0x93 => { #18 |
1209
|
|
|
|
|
|
|
Name => 'SweepPanoramaDirection', |
1210
|
|
|
|
|
|
|
Writable => 'int8u', |
1211
|
|
|
|
|
|
|
PrintConv => { |
1212
|
|
|
|
|
|
|
0 => 'Off', |
1213
|
|
|
|
|
|
|
1 => 'Left to Right', |
1214
|
|
|
|
|
|
|
2 => 'Right to Left', |
1215
|
|
|
|
|
|
|
3 => 'Top to Bottom', |
1216
|
|
|
|
|
|
|
4 => 'Bottom to Top' |
1217
|
|
|
|
|
|
|
} |
1218
|
|
|
|
|
|
|
}, |
1219
|
|
|
|
|
|
|
0x94 => { #18 |
1220
|
|
|
|
|
|
|
Name => 'SweepPanoramaFieldOfView', |
1221
|
|
|
|
|
|
|
Writable => 'int16u' |
1222
|
|
|
|
|
|
|
}, |
1223
|
|
|
|
|
|
|
0x96 => { #18 |
1224
|
|
|
|
|
|
|
Name => 'TimerRecording', |
1225
|
|
|
|
|
|
|
Writable => 'int8u', |
1226
|
|
|
|
|
|
|
PrintConv => { |
1227
|
|
|
|
|
|
|
0 => 'Off', |
1228
|
|
|
|
|
|
|
1 => 'Time Lapse', |
1229
|
|
|
|
|
|
|
2 => 'Stop-motion Animation', |
1230
|
|
|
|
|
|
|
3 => 'Focus Bracketing', #forum11194 |
1231
|
|
|
|
|
|
|
}, |
1232
|
|
|
|
|
|
|
}, |
1233
|
|
|
|
|
|
|
0x9d => { #18 |
1234
|
|
|
|
|
|
|
Name => 'InternalNDFilter', |
1235
|
|
|
|
|
|
|
Writable => 'rational64u' |
1236
|
|
|
|
|
|
|
}, |
1237
|
|
|
|
|
|
|
0x9e => { #18 |
1238
|
|
|
|
|
|
|
Name => 'HDR', |
1239
|
|
|
|
|
|
|
Writable => 'int16u', |
1240
|
|
|
|
|
|
|
PrintConv => { |
1241
|
|
|
|
|
|
|
0 => 'Off', |
1242
|
|
|
|
|
|
|
100 => '1 EV', |
1243
|
|
|
|
|
|
|
200 => '2 EV', |
1244
|
|
|
|
|
|
|
300 => '3 EV', |
1245
|
|
|
|
|
|
|
32868 => '1 EV (Auto)', |
1246
|
|
|
|
|
|
|
32968 => '2 EV (Auto)', |
1247
|
|
|
|
|
|
|
33068 => '3 EV (Auto)', |
1248
|
|
|
|
|
|
|
}, |
1249
|
|
|
|
|
|
|
}, |
1250
|
|
|
|
|
|
|
0x9f => { #18 |
1251
|
|
|
|
|
|
|
Name => 'ShutterType', |
1252
|
|
|
|
|
|
|
Writable => 'int16u', |
1253
|
|
|
|
|
|
|
PrintConv => { |
1254
|
|
|
|
|
|
|
0 => 'Mechanical', |
1255
|
|
|
|
|
|
|
1 => 'Electronic', |
1256
|
|
|
|
|
|
|
2 => 'Hybrid', #PH (GM1, 1st curtain electronic, 2nd curtain mechanical) |
1257
|
|
|
|
|
|
|
}, |
1258
|
|
|
|
|
|
|
}, |
1259
|
|
|
|
|
|
|
# 0xa0 - undef[32]: AWB gains and black levels (ref forum9303) |
1260
|
|
|
|
|
|
|
0xa1 => { #forum11194 |
1261
|
|
|
|
|
|
|
Name => 'FilterEffect', |
1262
|
|
|
|
|
|
|
Writable => 'rational64u', |
1263
|
|
|
|
|
|
|
Format => 'int32u', |
1264
|
|
|
|
|
|
|
PrintConv => { |
1265
|
|
|
|
|
|
|
# '0 0' => 'Expressive', #forum11194 |
1266
|
|
|
|
|
|
|
'0 0' => 'Off', #forum14033 (GH6) |
1267
|
|
|
|
|
|
|
'0 1' => 'Expressive', #forum14033 (GH6) (have also seen this for XS1) |
1268
|
|
|
|
|
|
|
'0 2' => 'Retro', |
1269
|
|
|
|
|
|
|
'0 4' => 'High Key', |
1270
|
|
|
|
|
|
|
'0 8' => 'Sepia', |
1271
|
|
|
|
|
|
|
'0 16' => 'High Dynamic', |
1272
|
|
|
|
|
|
|
'0 32' => 'Miniature Effect', |
1273
|
|
|
|
|
|
|
'0 256' => 'Low Key', |
1274
|
|
|
|
|
|
|
'0 512' => 'Toy Effect', |
1275
|
|
|
|
|
|
|
'0 1024' => 'Dynamic Monochrome', |
1276
|
|
|
|
|
|
|
'0 2048' => 'Soft Focus', |
1277
|
|
|
|
|
|
|
'0 4096' => 'Impressive Art', |
1278
|
|
|
|
|
|
|
'0 8192' => 'Cross Process', |
1279
|
|
|
|
|
|
|
'0 16384' => 'One Point Color', |
1280
|
|
|
|
|
|
|
'0 32768' => 'Star Filter', |
1281
|
|
|
|
|
|
|
'0 524288' => 'Old Days', |
1282
|
|
|
|
|
|
|
'0 1048576' => 'Sunshine', |
1283
|
|
|
|
|
|
|
'0 2097152' => 'Bleach Bypass', |
1284
|
|
|
|
|
|
|
'0 4194304' => 'Toy Pop', |
1285
|
|
|
|
|
|
|
'0 8388608' => 'Fantasy', |
1286
|
|
|
|
|
|
|
'0 33554432' => 'Monochrome', |
1287
|
|
|
|
|
|
|
'0 67108864' => 'Rough Monochrome', |
1288
|
|
|
|
|
|
|
'0 134217728' => 'Silky Monochrome', |
1289
|
|
|
|
|
|
|
}, |
1290
|
|
|
|
|
|
|
}, |
1291
|
|
|
|
|
|
|
0xa3 => { #18 |
1292
|
|
|
|
|
|
|
Name => 'ClearRetouchValue', |
1293
|
|
|
|
|
|
|
Writable => 'rational64u', |
1294
|
|
|
|
|
|
|
# undef if ClearRetouch is off, 0 if it is on |
1295
|
|
|
|
|
|
|
}, |
1296
|
|
|
|
|
|
|
0xa7 => { #forum9374 (conversion table for 14- to 16-bit mapping) |
1297
|
|
|
|
|
|
|
Name => 'OutputLUT', |
1298
|
|
|
|
|
|
|
Binary => 1, |
1299
|
|
|
|
|
|
|
Notes => q{ |
1300
|
|
|
|
|
|
|
2-column by 432-row binary lookup table of unsigned short values for |
1301
|
|
|
|
|
|
|
converting to 16-bit output (1st column) from 14 bits (2nd column) with |
1302
|
|
|
|
|
|
|
camera contrast |
1303
|
|
|
|
|
|
|
}, |
1304
|
|
|
|
|
|
|
}, |
1305
|
|
|
|
|
|
|
0xab => { #18 |
1306
|
|
|
|
|
|
|
Name => 'TouchAE', |
1307
|
|
|
|
|
|
|
Writable => 'int16u', |
1308
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'On' }, |
1309
|
|
|
|
|
|
|
}, |
1310
|
|
|
|
|
|
|
0xac => { #forum11194 |
1311
|
|
|
|
|
|
|
Name => 'MonochromeFilterEffect', |
1312
|
|
|
|
|
|
|
Writable => 'int16u', |
1313
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'Yellow', 2 => 'Orange', 3 => 'Red', 4 => 'Green' }, |
1314
|
|
|
|
|
|
|
}, |
1315
|
|
|
|
|
|
|
0xad => { #forum9360 |
1316
|
|
|
|
|
|
|
Name => 'HighlightShadow', |
1317
|
|
|
|
|
|
|
Writable => 'int16u', |
1318
|
|
|
|
|
|
|
Format => 'int16s', #forum11194 |
1319
|
|
|
|
|
|
|
Count => 2, |
1320
|
|
|
|
|
|
|
}, |
1321
|
|
|
|
|
|
|
0xaf => { #PH (is this in UTC maybe? -- sometimes different time zone other times) |
1322
|
|
|
|
|
|
|
Name => 'TimeStamp', |
1323
|
|
|
|
|
|
|
Writable => 'string', |
1324
|
|
|
|
|
|
|
Groups => { 2 => 'Time' }, |
1325
|
|
|
|
|
|
|
Shift => 'Time', |
1326
|
|
|
|
|
|
|
PrintConv => '$self->ConvertDateTime($val)', |
1327
|
|
|
|
|
|
|
PrintConvInv => '$self->InverseDateTime($val)', |
1328
|
|
|
|
|
|
|
}, |
1329
|
|
|
|
|
|
|
0xb3 => { #forum11194 |
1330
|
|
|
|
|
|
|
Name => 'VideoBurstResolution', |
1331
|
|
|
|
|
|
|
Writable => 'int16u', |
1332
|
|
|
|
|
|
|
PrintConv => { 1 => 'Off or 4K', 4 => '6K' }, |
1333
|
|
|
|
|
|
|
}, |
1334
|
|
|
|
|
|
|
0xb4 => { #forum9429 |
1335
|
|
|
|
|
|
|
Name => 'MultiExposure', |
1336
|
|
|
|
|
|
|
Writable => 'int16u', |
1337
|
|
|
|
|
|
|
PrintConv => { 0 => 'n/a', 1 => 'Off', 2 => 'On' }, |
1338
|
|
|
|
|
|
|
}, |
1339
|
|
|
|
|
|
|
0xb9 => { #forum9425 |
1340
|
|
|
|
|
|
|
Name => 'RedEyeRemoval', |
1341
|
|
|
|
|
|
|
Writable => 'int16u', |
1342
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'On' }, |
1343
|
|
|
|
|
|
|
}, |
1344
|
|
|
|
|
|
|
0xbb => { #forum9282 |
1345
|
|
|
|
|
|
|
Name => 'VideoBurstMode', |
1346
|
|
|
|
|
|
|
Writable => 'int32u', |
1347
|
|
|
|
|
|
|
PrintHex => 1, |
1348
|
|
|
|
|
|
|
PrintConv => { |
1349
|
|
|
|
|
|
|
0x01 => 'Off', |
1350
|
|
|
|
|
|
|
0x04 => 'Post Focus', |
1351
|
|
|
|
|
|
|
0x18 => '4K Burst', |
1352
|
|
|
|
|
|
|
0x28 => '4K Burst (Start/Stop)', |
1353
|
|
|
|
|
|
|
0x48 => '4K Pre-burst', |
1354
|
|
|
|
|
|
|
0x108 => 'Loop Recording', |
1355
|
|
|
|
|
|
|
0x810 => '6K Burst', |
1356
|
|
|
|
|
|
|
0x820 => '6K Burst (Start/Stop)', |
1357
|
|
|
|
|
|
|
0x408 => 'Focus Stacking', #forum11563 |
1358
|
|
|
|
|
|
|
0x1001 => 'High Resolution Mode', |
1359
|
|
|
|
|
|
|
}, |
1360
|
|
|
|
|
|
|
}, |
1361
|
|
|
|
|
|
|
0xbc => { #forum9282 |
1362
|
|
|
|
|
|
|
Name => 'DiffractionCorrection', |
1363
|
|
|
|
|
|
|
Writable => 'int16u', |
1364
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'Auto' }, |
1365
|
|
|
|
|
|
|
}, |
1366
|
|
|
|
|
|
|
0xbd => { #forum11194 |
1367
|
|
|
|
|
|
|
Name => 'FocusBracket', |
1368
|
|
|
|
|
|
|
Notes => 'positive is further, negative is closer', |
1369
|
|
|
|
|
|
|
Writable => 'int16u', |
1370
|
|
|
|
|
|
|
Format => 'int16s', |
1371
|
|
|
|
|
|
|
}, |
1372
|
|
|
|
|
|
|
0xbe => { #forum11194 |
1373
|
|
|
|
|
|
|
Name => 'LongExposureNRUsed', |
1374
|
|
|
|
|
|
|
Writable => 'int16u', |
1375
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => 'Yes' }, |
1376
|
|
|
|
|
|
|
}, |
1377
|
|
|
|
|
|
|
0xbf => { #forum11194 |
1378
|
|
|
|
|
|
|
Name => 'PostFocusMerging', |
1379
|
|
|
|
|
|
|
Format => 'int32u', |
1380
|
|
|
|
|
|
|
Count => 2, |
1381
|
|
|
|
|
|
|
PrintConv => { '0 0' => 'Post Focus Auto Merging or None' }, |
1382
|
|
|
|
|
|
|
}, |
1383
|
|
|
|
|
|
|
0xc1 => { #forum11194 |
1384
|
|
|
|
|
|
|
Name => 'VideoPreburst', |
1385
|
|
|
|
|
|
|
Writable => 'int16u', |
1386
|
|
|
|
|
|
|
PrintConv => { 0 => 'No', 1 => '4K or 6K' }, |
1387
|
|
|
|
|
|
|
}, |
1388
|
|
|
|
|
|
|
0xca => { #forum11459 |
1389
|
|
|
|
|
|
|
Name => 'SensorType', |
1390
|
|
|
|
|
|
|
Writable => 'int16u', |
1391
|
|
|
|
|
|
|
PrintConv => { |
1392
|
|
|
|
|
|
|
0 => 'Multi-aspect', |
1393
|
|
|
|
|
|
|
1 => 'Standard', |
1394
|
|
|
|
|
|
|
}, |
1395
|
|
|
|
|
|
|
}, |
1396
|
|
|
|
|
|
|
# Note: LensTypeMake and LensTypeModel are combined into a Composite LensType tag |
1397
|
|
|
|
|
|
|
# defined in Olympus.pm which has the same values as Olympus:LensType |
1398
|
|
|
|
|
|
|
0xc4 => { #PH |
1399
|
|
|
|
|
|
|
Name => 'LensTypeMake', |
1400
|
|
|
|
|
|
|
Condition => '$format eq "int16u" and $$valPt ne "\xff\xff"', # (ignore make 65535 for now) |
1401
|
|
|
|
|
|
|
Writable => 'int16u', |
1402
|
|
|
|
|
|
|
}, |
1403
|
|
|
|
|
|
|
0xc5 => { #PH |
1404
|
|
|
|
|
|
|
Name => 'LensTypeModel', |
1405
|
|
|
|
|
|
|
Condition => '$format eq "int16u"', |
1406
|
|
|
|
|
|
|
Writable => 'int16u', |
1407
|
|
|
|
|
|
|
RawConv => q{ |
1408
|
|
|
|
|
|
|
return undef unless $val; |
1409
|
|
|
|
|
|
|
require Image::ExifTool::Olympus; # (to load Composite LensID) |
1410
|
|
|
|
|
|
|
return $val; |
1411
|
|
|
|
|
|
|
}, |
1412
|
|
|
|
|
|
|
ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_', |
1413
|
|
|
|
|
|
|
ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)', |
1414
|
|
|
|
|
|
|
}, |
1415
|
|
|
|
|
|
|
0xd1 => { #PH |
1416
|
|
|
|
|
|
|
Name => 'ISO', |
1417
|
|
|
|
|
|
|
RawConv => '$val > 0xfffffff0 ? undef : $val', |
1418
|
|
|
|
|
|
|
Writable => 'int32u', |
1419
|
|
|
|
|
|
|
}, |
1420
|
|
|
|
|
|
|
0xd2 => { #forum11194 |
1421
|
|
|
|
|
|
|
Name => 'MonochromeGrainEffect', |
1422
|
|
|
|
|
|
|
Writable => 'int16u', |
1423
|
|
|
|
|
|
|
PrintConv => { |
1424
|
|
|
|
|
|
|
0 => 'Off', |
1425
|
|
|
|
|
|
|
1 => 'Low', |
1426
|
|
|
|
|
|
|
2 => 'Standard', |
1427
|
|
|
|
|
|
|
3 => 'High', |
1428
|
|
|
|
|
|
|
}, |
1429
|
|
|
|
|
|
|
}, |
1430
|
|
|
|
|
|
|
0xd6 => { #PH (DC-S1) |
1431
|
|
|
|
|
|
|
Name => 'NoiseReductionStrength', |
1432
|
|
|
|
|
|
|
Writable => 'rational64s', |
1433
|
|
|
|
|
|
|
}, |
1434
|
|
|
|
|
|
|
0xe4 => { #IB |
1435
|
|
|
|
|
|
|
Name => 'LensTypeModel', |
1436
|
|
|
|
|
|
|
Condition => '$format eq "int16u"', |
1437
|
|
|
|
|
|
|
Writable => 'int16u', |
1438
|
|
|
|
|
|
|
RawConv => q{ |
1439
|
|
|
|
|
|
|
return undef unless $val; |
1440
|
|
|
|
|
|
|
require Image::ExifTool::Olympus; # (to load Composite LensID) |
1441
|
|
|
|
|
|
|
return $val; |
1442
|
|
|
|
|
|
|
}, |
1443
|
|
|
|
|
|
|
ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_', |
1444
|
|
|
|
|
|
|
ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)', |
1445
|
|
|
|
|
|
|
}, |
1446
|
|
|
|
|
|
|
0xe8 => { #PH (DC-GH6) |
1447
|
|
|
|
|
|
|
Name => 'MinimumISO', |
1448
|
|
|
|
|
|
|
Writable => 'int32u', |
1449
|
|
|
|
|
|
|
}, |
1450
|
|
|
|
|
|
|
0xee => { #PH (DC-GH6) |
1451
|
|
|
|
|
|
|
Name => 'DynamicRangeBoost', |
1452
|
|
|
|
|
|
|
Writable => 'int16u', |
1453
|
|
|
|
|
|
|
PrintConv => { 0 => 'Off', 1 => 'On' }, |
1454
|
|
|
|
|
|
|
}, |
1455
|
|
|
|
|
|
|
0x0e00 => { |
1456
|
|
|
|
|
|
|
Name => 'PrintIM', |
1457
|
|
|
|
|
|
|
Description => 'Print Image Matching', |
1458
|
|
|
|
|
|
|
Writable => 0, |
1459
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' }, |
1460
|
|
|
|
|
|
|
}, |
1461
|
|
|
|
|
|
|
0x2003 => { #21 |
1462
|
|
|
|
|
|
|
Name => 'TimeInfo', |
1463
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::TimeInfo' }, |
1464
|
|
|
|
|
|
|
}, |
1465
|
|
|
|
|
|
|
0x8000 => { #PH |
1466
|
|
|
|
|
|
|
Name => 'MakerNoteVersion', |
1467
|
|
|
|
|
|
|
Format => 'undef', |
1468
|
|
|
|
|
|
|
}, |
1469
|
|
|
|
|
|
|
0x8001 => { #7/PH/JD |
1470
|
|
|
|
|
|
|
Name => 'SceneMode', |
1471
|
|
|
|
|
|
|
Writable => 'int16u', |
1472
|
|
|
|
|
|
|
PrintConvColumns => 2, |
1473
|
|
|
|
|
|
|
PrintConv => { |
1474
|
|
|
|
|
|
|
0 => 'Off', |
1475
|
|
|
|
|
|
|
%shootingMode, |
1476
|
|
|
|
|
|
|
}, |
1477
|
|
|
|
|
|
|
}, |
1478
|
|
|
|
|
|
|
0x8002 => { #21 |
1479
|
|
|
|
|
|
|
Name => 'HighlightWarning', |
1480
|
|
|
|
|
|
|
Writable => 'int16u', |
1481
|
|
|
|
|
|
|
PrintConv => { 0 => 'Disabled', 1 => 'No', 2 => 'Yes' }, |
1482
|
|
|
|
|
|
|
}, |
1483
|
|
|
|
|
|
|
0x8003 => { #21 |
1484
|
|
|
|
|
|
|
Name => 'DarkFocusEnvironment', |
1485
|
|
|
|
|
|
|
Writable => 'int16u', |
1486
|
|
|
|
|
|
|
PrintConv => { 1 => 'No', 2 => 'Yes' }, |
1487
|
|
|
|
|
|
|
}, |
1488
|
|
|
|
|
|
|
0x8004 => { #PH/JD |
1489
|
|
|
|
|
|
|
Name => 'WBRedLevel', |
1490
|
|
|
|
|
|
|
Writable => 'int16u', |
1491
|
|
|
|
|
|
|
}, |
1492
|
|
|
|
|
|
|
0x8005 => { #PH/JD |
1493
|
|
|
|
|
|
|
Name => 'WBGreenLevel', |
1494
|
|
|
|
|
|
|
Writable => 'int16u', |
1495
|
|
|
|
|
|
|
}, |
1496
|
|
|
|
|
|
|
0x8006 => { #PH/JD |
1497
|
|
|
|
|
|
|
Name => 'WBBlueLevel', |
1498
|
|
|
|
|
|
|
Writable => 'int16u', |
1499
|
|
|
|
|
|
|
}, |
1500
|
|
|
|
|
|
|
#0x8007 => { #PH - questionable [disabled because it conflicts with EXIF in too many samples] |
1501
|
|
|
|
|
|
|
# Name => 'FlashFired', |
1502
|
|
|
|
|
|
|
# Writable => 'int16u', |
1503
|
|
|
|
|
|
|
# PrintConv => { 0 => 'Yes', 1 => 'No' }, |
1504
|
|
|
|
|
|
|
#}, |
1505
|
|
|
|
|
|
|
0x8008 => { #PH (TZ5/FS7) |
1506
|
|
|
|
|
|
|
# (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) |
1507
|
|
|
|
|
|
|
Name => 'TextStamp', |
1508
|
|
|
|
|
|
|
Writable => 'int16u', |
1509
|
|
|
|
|
|
|
PrintConv => { 1 => 'Off', 2 => 'On' }, |
1510
|
|
|
|
|
|
|
}, |
1511
|
|
|
|
|
|
|
0x8009 => { #PH (TZ5/FS7) |
1512
|
|
|
|
|
|
|
# (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH) |
1513
|
|
|
|
|
|
|
Name => 'TextStamp', |
1514
|
|
|
|
|
|
|
Writable => 'int16u', |
1515
|
|
|
|
|
|
|
PrintConv => { 1 => 'Off', 2 => 'On' }, |
1516
|
|
|
|
|
|
|
}, |
1517
|
|
|
|
|
|
|
0x8010 => { #PH |
1518
|
|
|
|
|
|
|
Name => 'BabyAge', |
1519
|
|
|
|
|
|
|
Writable => 'string', |
1520
|
|
|
|
|
|
|
Notes => 'or pet age', |
1521
|
|
|
|
|
|
|
PrintConv => '$val eq "9999:99:99 00:00:00" ? "(not set)" : $val', |
1522
|
|
|
|
|
|
|
PrintConvInv => '$val =~ /^\d/ ? $val : "9999:99:99 00:00:00"', |
1523
|
|
|
|
|
|
|
}, |
1524
|
|
|
|
|
|
|
0x8012 => { #PH (FS7) |
1525
|
|
|
|
|
|
|
Name => 'Transform', |
1526
|
|
|
|
|
|
|
Writable => 'undef', |
1527
|
|
|
|
|
|
|
Notes => 'decoded as two 16-bit signed integers', |
1528
|
|
|
|
|
|
|
Format => 'int16s', |
1529
|
|
|
|
|
|
|
Count => 2, |
1530
|
|
|
|
|
|
|
PrintConv => { |
1531
|
|
|
|
|
|
|
'-3 2' => 'Slim High', |
1532
|
|
|
|
|
|
|
'-1 1' => 'Slim Low', |
1533
|
|
|
|
|
|
|
'0 0' => 'Off', |
1534
|
|
|
|
|
|
|
'1 1' => 'Stretch Low', |
1535
|
|
|
|
|
|
|
'3 2' => 'Stretch High', |
1536
|
|
|
|
|
|
|
}, |
1537
|
|
|
|
|
|
|
}, |
1538
|
|
|
|
|
|
|
); |
1539
|
|
|
|
|
|
|
|
1540
|
|
|
|
|
|
|
# Leica type2 maker notes (ref 10) |
1541
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica2 = ( |
1542
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
1543
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
1544
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1545
|
|
|
|
|
|
|
WRITABLE => 1, |
1546
|
|
|
|
|
|
|
NOTES => 'These tags are used by the Leica M8.', |
1547
|
|
|
|
|
|
|
0x300 => { |
1548
|
|
|
|
|
|
|
Name => 'Quality', |
1549
|
|
|
|
|
|
|
Writable => 'int16u', |
1550
|
|
|
|
|
|
|
PrintConv => { |
1551
|
|
|
|
|
|
|
1 => 'Fine', |
1552
|
|
|
|
|
|
|
2 => 'Basic', |
1553
|
|
|
|
|
|
|
}, |
1554
|
|
|
|
|
|
|
}, |
1555
|
|
|
|
|
|
|
0x302 => { |
1556
|
|
|
|
|
|
|
Name => 'UserProfile', |
1557
|
|
|
|
|
|
|
Writable => 'int32u', |
1558
|
|
|
|
|
|
|
PrintConv => { |
1559
|
|
|
|
|
|
|
1 => 'User Profile 1', |
1560
|
|
|
|
|
|
|
2 => 'User Profile 2', |
1561
|
|
|
|
|
|
|
3 => 'User Profile 3', |
1562
|
|
|
|
|
|
|
4 => 'User Profile 0 (Dynamic)', |
1563
|
|
|
|
|
|
|
}, |
1564
|
|
|
|
|
|
|
}, |
1565
|
|
|
|
|
|
|
0x303 => { |
1566
|
|
|
|
|
|
|
Name => 'SerialNumber', |
1567
|
|
|
|
|
|
|
Writable => 'int32u', |
1568
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.7d", $val)', |
1569
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1570
|
|
|
|
|
|
|
}, |
1571
|
|
|
|
|
|
|
0x304 => { |
1572
|
|
|
|
|
|
|
Name => 'WhiteBalance', |
1573
|
|
|
|
|
|
|
Writable => 'int16u', |
1574
|
|
|
|
|
|
|
Notes => 'values above 0x8000 are converted to Kelvin color temperatures', |
1575
|
|
|
|
|
|
|
PrintConv => { |
1576
|
|
|
|
|
|
|
0 => 'Auto or Manual', |
1577
|
|
|
|
|
|
|
1 => 'Daylight', |
1578
|
|
|
|
|
|
|
2 => 'Fluorescent', |
1579
|
|
|
|
|
|
|
3 => 'Tungsten', |
1580
|
|
|
|
|
|
|
4 => 'Flash', |
1581
|
|
|
|
|
|
|
10 => 'Cloudy', |
1582
|
|
|
|
|
|
|
11 => 'Shade', |
1583
|
|
|
|
|
|
|
OTHER => \&WhiteBalanceConv, |
1584
|
|
|
|
|
|
|
}, |
1585
|
|
|
|
|
|
|
}, |
1586
|
|
|
|
|
|
|
0x310 => { |
1587
|
|
|
|
|
|
|
Name => 'LensType', |
1588
|
|
|
|
|
|
|
Writable => 'int32u', |
1589
|
|
|
|
|
|
|
SeparateTable => 1, |
1590
|
|
|
|
|
|
|
ValueConv => '($val >> 2) . " " . ($val & 0x3)', |
1591
|
|
|
|
|
|
|
ValueConvInv => \&LensTypeConvInv, |
1592
|
|
|
|
|
|
|
PrintConv => \%leicaLensTypes, |
1593
|
|
|
|
|
|
|
}, |
1594
|
|
|
|
|
|
|
0x311 => { |
1595
|
|
|
|
|
|
|
Name => 'ExternalSensorBrightnessValue', |
1596
|
|
|
|
|
|
|
Format => 'rational64s', # (incorrectly unsigned in JPEG images) |
1597
|
|
|
|
|
|
|
Writable => 'rational64s', |
1598
|
|
|
|
|
|
|
Notes => '"blue dot" measurement', |
1599
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
1600
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1601
|
|
|
|
|
|
|
}, |
1602
|
|
|
|
|
|
|
0x312 => { |
1603
|
|
|
|
|
|
|
Name => 'MeasuredLV', |
1604
|
|
|
|
|
|
|
Format => 'rational64s', # (incorrectly unsigned in JPEG images) |
1605
|
|
|
|
|
|
|
Writable => 'rational64s', |
1606
|
|
|
|
|
|
|
Notes => 'imaging sensor or TTL exposure meter measurement', |
1607
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
1608
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1609
|
|
|
|
|
|
|
}, |
1610
|
|
|
|
|
|
|
0x313 => { |
1611
|
|
|
|
|
|
|
Name => 'ApproximateFNumber', |
1612
|
|
|
|
|
|
|
Writable => 'rational64u', |
1613
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.1f", $val)', |
1614
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1615
|
|
|
|
|
|
|
}, |
1616
|
|
|
|
|
|
|
0x320 => { |
1617
|
|
|
|
|
|
|
Name => 'CameraTemperature', |
1618
|
|
|
|
|
|
|
Writable => 'int32s', |
1619
|
|
|
|
|
|
|
PrintConv => '"$val C"', |
1620
|
|
|
|
|
|
|
PrintConvInv => '$val=~s/ ?C//; $val', |
1621
|
|
|
|
|
|
|
}, |
1622
|
|
|
|
|
|
|
0x321 => { Name => 'ColorTemperature', Writable => 'int32u' }, |
1623
|
|
|
|
|
|
|
0x322 => { Name => 'WBRedLevel', Writable => 'rational64u' }, |
1624
|
|
|
|
|
|
|
0x323 => { Name => 'WBGreenLevel', Writable => 'rational64u' }, |
1625
|
|
|
|
|
|
|
0x324 => { Name => 'WBBlueLevel', Writable => 'rational64u' }, |
1626
|
|
|
|
|
|
|
0x325 => { |
1627
|
|
|
|
|
|
|
Name => 'UV-IRFilterCorrection', |
1628
|
|
|
|
|
|
|
Description => 'UV/IR Filter Correction', |
1629
|
|
|
|
|
|
|
Writable => 'int32u', |
1630
|
|
|
|
|
|
|
PrintConv => { |
1631
|
|
|
|
|
|
|
0 => 'Not Active', |
1632
|
|
|
|
|
|
|
1 => 'Active', |
1633
|
|
|
|
|
|
|
}, |
1634
|
|
|
|
|
|
|
}, |
1635
|
|
|
|
|
|
|
0x330 => { Name => 'CCDVersion', Writable => 'int32u' }, |
1636
|
|
|
|
|
|
|
0x331 => { Name => 'CCDBoardVersion', Writable => 'int32u' }, |
1637
|
|
|
|
|
|
|
0x332 => { Name => 'ControllerBoardVersion', Writable => 'int32u' }, |
1638
|
|
|
|
|
|
|
0x333 => { Name => 'M16CVersion', Writable => 'int32u' }, |
1639
|
|
|
|
|
|
|
0x340 => { Name => 'ImageIDNumber', Writable => 'int32u' }, |
1640
|
|
|
|
|
|
|
); |
1641
|
|
|
|
|
|
|
|
1642
|
|
|
|
|
|
|
# Leica type3 maker notes (ref PH) |
1643
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica3 = ( |
1644
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
1645
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
1646
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1647
|
|
|
|
|
|
|
WRITABLE => 1, |
1648
|
|
|
|
|
|
|
NOTES => 'These tags are used by the Leica R8 and R9 digital backs.', |
1649
|
|
|
|
|
|
|
0x0b => { #IB |
1650
|
|
|
|
|
|
|
Name => 'SerialInfo', |
1651
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::SerialInfo' }, |
1652
|
|
|
|
|
|
|
}, |
1653
|
|
|
|
|
|
|
0x0d => { |
1654
|
|
|
|
|
|
|
Name => 'WB_RGBLevels', |
1655
|
|
|
|
|
|
|
Writable => 'int16u', |
1656
|
|
|
|
|
|
|
Count => 3, |
1657
|
|
|
|
|
|
|
}, |
1658
|
|
|
|
|
|
|
); |
1659
|
|
|
|
|
|
|
|
1660
|
|
|
|
|
|
|
# Leica serial number info (ref IB) |
1661
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::SerialInfo = ( |
1662
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
1663
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1664
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_SerialInfo', |
1665
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
1666
|
|
|
|
|
|
|
4 => { |
1667
|
|
|
|
|
|
|
Name => 'SerialNumber', |
1668
|
|
|
|
|
|
|
Format => 'string[8]', |
1669
|
|
|
|
|
|
|
} |
1670
|
|
|
|
|
|
|
); |
1671
|
|
|
|
|
|
|
|
1672
|
|
|
|
|
|
|
# Leica type4 maker notes (ref PH) (M9) |
1673
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica4 = ( |
1674
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
1675
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
1676
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1677
|
|
|
|
|
|
|
WRITABLE => 1, |
1678
|
|
|
|
|
|
|
NOTES => 'This information is written by the M9.', |
1679
|
|
|
|
|
|
|
0x3000 => { |
1680
|
|
|
|
|
|
|
Name => 'Subdir3000', |
1681
|
|
|
|
|
|
|
SubDirectory => { |
1682
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::Subdir', |
1683
|
|
|
|
|
|
|
ByteOrder => 'Unknown', |
1684
|
|
|
|
|
|
|
}, |
1685
|
|
|
|
|
|
|
}, |
1686
|
|
|
|
|
|
|
0x3100 => { |
1687
|
|
|
|
|
|
|
Name => 'Subdir3100', |
1688
|
|
|
|
|
|
|
SubDirectory => { |
1689
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::Subdir', |
1690
|
|
|
|
|
|
|
ByteOrder => 'Unknown', |
1691
|
|
|
|
|
|
|
}, |
1692
|
|
|
|
|
|
|
}, |
1693
|
|
|
|
|
|
|
0x3400 => { |
1694
|
|
|
|
|
|
|
Name => 'Subdir3400', |
1695
|
|
|
|
|
|
|
SubDirectory => { |
1696
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::Subdir', |
1697
|
|
|
|
|
|
|
ByteOrder => 'Unknown', |
1698
|
|
|
|
|
|
|
}, |
1699
|
|
|
|
|
|
|
}, |
1700
|
|
|
|
|
|
|
0x3900 => { |
1701
|
|
|
|
|
|
|
Name => 'Subdir3900', |
1702
|
|
|
|
|
|
|
SubDirectory => { |
1703
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::Subdir', |
1704
|
|
|
|
|
|
|
ByteOrder => 'Unknown', |
1705
|
|
|
|
|
|
|
}, |
1706
|
|
|
|
|
|
|
}, |
1707
|
|
|
|
|
|
|
); |
1708
|
|
|
|
|
|
|
|
1709
|
|
|
|
|
|
|
# Leica M9 SubDirectory tags (ref PH) |
1710
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Subdir = ( |
1711
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
1712
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
1713
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1714
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_Subdir', |
1715
|
|
|
|
|
|
|
WRITABLE => 1, |
1716
|
|
|
|
|
|
|
# 0x3001 - normally 0 but value of 2 when manual coding is used |
1717
|
|
|
|
|
|
|
# with a coded lens (but only tested with Elmar-M 50mm f/2.8) - PH |
1718
|
|
|
|
|
|
|
0x300a => { |
1719
|
|
|
|
|
|
|
Name => 'Contrast', |
1720
|
|
|
|
|
|
|
Writable => 'int32u', |
1721
|
|
|
|
|
|
|
PrintConv => { |
1722
|
|
|
|
|
|
|
0 => 'Low', |
1723
|
|
|
|
|
|
|
1 => 'Medium Low', |
1724
|
|
|
|
|
|
|
2 => 'Normal', |
1725
|
|
|
|
|
|
|
3 => 'Medium High', |
1726
|
|
|
|
|
|
|
4 => 'High', |
1727
|
|
|
|
|
|
|
}, |
1728
|
|
|
|
|
|
|
}, |
1729
|
|
|
|
|
|
|
0x300b => { |
1730
|
|
|
|
|
|
|
Name => 'Sharpening', |
1731
|
|
|
|
|
|
|
Writable => 'int32u', |
1732
|
|
|
|
|
|
|
PrintConv => { |
1733
|
|
|
|
|
|
|
0 => 'Off', |
1734
|
|
|
|
|
|
|
1 => 'Low', |
1735
|
|
|
|
|
|
|
2 => 'Normal', |
1736
|
|
|
|
|
|
|
3 => 'Medium High', |
1737
|
|
|
|
|
|
|
4 => 'High', |
1738
|
|
|
|
|
|
|
}, |
1739
|
|
|
|
|
|
|
}, |
1740
|
|
|
|
|
|
|
0x300d => { |
1741
|
|
|
|
|
|
|
Name => 'Saturation', |
1742
|
|
|
|
|
|
|
Writable => 'int32u', |
1743
|
|
|
|
|
|
|
PrintConv => { |
1744
|
|
|
|
|
|
|
0 => 'Low', |
1745
|
|
|
|
|
|
|
1 => 'Medium Low', |
1746
|
|
|
|
|
|
|
2 => 'Normal', |
1747
|
|
|
|
|
|
|
3 => 'Medium High', |
1748
|
|
|
|
|
|
|
4 => 'High', |
1749
|
|
|
|
|
|
|
5 => 'Black & White', |
1750
|
|
|
|
|
|
|
6 => 'Vintage B&W', |
1751
|
|
|
|
|
|
|
}, |
1752
|
|
|
|
|
|
|
}, |
1753
|
|
|
|
|
|
|
# 0x3032 - some sort of RGB coefficients? (zeros unless Kelvin WB, but same for all Color Temps) |
1754
|
|
|
|
|
|
|
0x3033 => { |
1755
|
|
|
|
|
|
|
Name => 'WhiteBalance', |
1756
|
|
|
|
|
|
|
Writable => 'int32u', |
1757
|
|
|
|
|
|
|
PrintConv => { #13 |
1758
|
|
|
|
|
|
|
0 => 'Auto', |
1759
|
|
|
|
|
|
|
1 => 'Tungsten', |
1760
|
|
|
|
|
|
|
2 => 'Fluorescent', |
1761
|
|
|
|
|
|
|
3 => 'Daylight Fluorescent', |
1762
|
|
|
|
|
|
|
4 => 'Daylight', |
1763
|
|
|
|
|
|
|
5 => 'Flash', |
1764
|
|
|
|
|
|
|
6 => 'Cloudy', |
1765
|
|
|
|
|
|
|
7 => 'Shade', |
1766
|
|
|
|
|
|
|
8 => 'Manual', |
1767
|
|
|
|
|
|
|
9 => 'Kelvin', |
1768
|
|
|
|
|
|
|
}, |
1769
|
|
|
|
|
|
|
}, |
1770
|
|
|
|
|
|
|
0x3034 => { |
1771
|
|
|
|
|
|
|
Name => 'JPEGQuality', |
1772
|
|
|
|
|
|
|
Writable => 'int32u', |
1773
|
|
|
|
|
|
|
PrintConv => { |
1774
|
|
|
|
|
|
|
94 => 'Basic', |
1775
|
|
|
|
|
|
|
97 => 'Fine', |
1776
|
|
|
|
|
|
|
}, |
1777
|
|
|
|
|
|
|
}, |
1778
|
|
|
|
|
|
|
# 0x3035 (int32u): -1 unless Manual WB (2 in my Manual sample) |
1779
|
|
|
|
|
|
|
0x3036 => { |
1780
|
|
|
|
|
|
|
Name => 'WB_RGBLevels', |
1781
|
|
|
|
|
|
|
Writable => 'rational64u', |
1782
|
|
|
|
|
|
|
Count => 3, |
1783
|
|
|
|
|
|
|
}, |
1784
|
|
|
|
|
|
|
0x3038 => { |
1785
|
|
|
|
|
|
|
Name => 'UserProfile', # (CameraProfile according to ref 14) |
1786
|
|
|
|
|
|
|
Writable => 'string', |
1787
|
|
|
|
|
|
|
}, |
1788
|
|
|
|
|
|
|
0x303a => { |
1789
|
|
|
|
|
|
|
Name => 'JPEGSize', |
1790
|
|
|
|
|
|
|
Writable => 'int32u', |
1791
|
|
|
|
|
|
|
PrintConv => { |
1792
|
|
|
|
|
|
|
0 => '5216x3472', |
1793
|
|
|
|
|
|
|
1 => '3840x2592', |
1794
|
|
|
|
|
|
|
2 => '2592x1728', |
1795
|
|
|
|
|
|
|
3 => '1728x1152', |
1796
|
|
|
|
|
|
|
4 => '1280x864', |
1797
|
|
|
|
|
|
|
}, |
1798
|
|
|
|
|
|
|
}, |
1799
|
|
|
|
|
|
|
0x3103 => { #13 (valid for FW 1.116 and later) |
1800
|
|
|
|
|
|
|
Name => 'SerialNumber', |
1801
|
|
|
|
|
|
|
Writable => 'string', |
1802
|
|
|
|
|
|
|
}, |
1803
|
|
|
|
|
|
|
# 0x3104 body-dependent string ("00012905000000") (not serial number) |
1804
|
|
|
|
|
|
|
# 0x3105 body-dependent string ("00012905000000") |
1805
|
|
|
|
|
|
|
# 0x3107 - body-dependent string ("4H205800116800") (not serial number) |
1806
|
|
|
|
|
|
|
0x3109 => { |
1807
|
|
|
|
|
|
|
Name => 'FirmwareVersion', |
1808
|
|
|
|
|
|
|
Writable => 'string', |
1809
|
|
|
|
|
|
|
}, |
1810
|
|
|
|
|
|
|
0x312a => { #14 (NC) |
1811
|
|
|
|
|
|
|
Name => 'BaseISO', |
1812
|
|
|
|
|
|
|
Writable => 'int32u', |
1813
|
|
|
|
|
|
|
}, |
1814
|
|
|
|
|
|
|
0x312b => { |
1815
|
|
|
|
|
|
|
Name => 'SensorWidth', |
1816
|
|
|
|
|
|
|
Writable => 'int32u', |
1817
|
|
|
|
|
|
|
}, |
1818
|
|
|
|
|
|
|
0x312c => { |
1819
|
|
|
|
|
|
|
Name => 'SensorHeight', |
1820
|
|
|
|
|
|
|
Writable => 'int32u', |
1821
|
|
|
|
|
|
|
}, |
1822
|
|
|
|
|
|
|
0x312d => { #14 (NC) |
1823
|
|
|
|
|
|
|
Name => 'SensorBitDepth', |
1824
|
|
|
|
|
|
|
Writable => 'int32u', |
1825
|
|
|
|
|
|
|
}, |
1826
|
|
|
|
|
|
|
0x3402 => { #PH/13 |
1827
|
|
|
|
|
|
|
Name => 'CameraTemperature', |
1828
|
|
|
|
|
|
|
Writable => 'int32s', |
1829
|
|
|
|
|
|
|
PrintConv => '"$val C"', |
1830
|
|
|
|
|
|
|
PrintConvInv => '$val=~s/ ?C//; $val', |
1831
|
|
|
|
|
|
|
}, |
1832
|
|
|
|
|
|
|
0x3405 => { |
1833
|
|
|
|
|
|
|
Name => 'LensType', |
1834
|
|
|
|
|
|
|
Writable => 'int32u', |
1835
|
|
|
|
|
|
|
SeparateTable => 1, |
1836
|
|
|
|
|
|
|
ValueConv => '($val >> 2) . " " . ($val & 0x3)', |
1837
|
|
|
|
|
|
|
ValueConvInv => \&LensTypeConvInv, |
1838
|
|
|
|
|
|
|
PrintConv => \%leicaLensTypes, |
1839
|
|
|
|
|
|
|
}, |
1840
|
|
|
|
|
|
|
0x3406 => { #PH/13 |
1841
|
|
|
|
|
|
|
Name => 'ApproximateFNumber', |
1842
|
|
|
|
|
|
|
Writable => 'rational64u', |
1843
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.1f", $val)', |
1844
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1845
|
|
|
|
|
|
|
}, |
1846
|
|
|
|
|
|
|
0x3407 => { #14 |
1847
|
|
|
|
|
|
|
Name => 'MeasuredLV', |
1848
|
|
|
|
|
|
|
Writable => 'int32s', |
1849
|
|
|
|
|
|
|
Notes => 'imaging sensor or TTL exposure meter measurement', |
1850
|
|
|
|
|
|
|
ValueConv => '$val / 1e5', #PH (NC) |
1851
|
|
|
|
|
|
|
ValueConvInv => '$val * 1e5', #PH (NC) |
1852
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
1853
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1854
|
|
|
|
|
|
|
}, |
1855
|
|
|
|
|
|
|
0x3408 => { #14 |
1856
|
|
|
|
|
|
|
Name => 'ExternalSensorBrightnessValue', |
1857
|
|
|
|
|
|
|
Writable => 'int32s', |
1858
|
|
|
|
|
|
|
Notes => '"blue dot" measurement', |
1859
|
|
|
|
|
|
|
ValueConv => '$val / 1e5', #PH (NC) |
1860
|
|
|
|
|
|
|
ValueConvInv => '$val * 1e5', #PH (NC) |
1861
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
1862
|
|
|
|
|
|
|
PrintConvInv => '$val', |
1863
|
|
|
|
|
|
|
}, |
1864
|
|
|
|
|
|
|
0x3901 => { |
1865
|
|
|
|
|
|
|
Name => 'Data1', |
1866
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data1' }, |
1867
|
|
|
|
|
|
|
}, |
1868
|
|
|
|
|
|
|
0x3902 => { |
1869
|
|
|
|
|
|
|
Name => 'Data2', |
1870
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::Data2' }, |
1871
|
|
|
|
|
|
|
}, |
1872
|
|
|
|
|
|
|
# 0x3903 - larger binary data block |
1873
|
|
|
|
|
|
|
); |
1874
|
|
|
|
|
|
|
|
1875
|
|
|
|
|
|
|
# time stamp information (ref 21) |
1876
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::TimeInfo = ( |
1877
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
1878
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
1879
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
1880
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Panasonic', 2 => 'Image' }, |
1881
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
1882
|
|
|
|
|
|
|
WRITABLE => 1, |
1883
|
|
|
|
|
|
|
0 => { |
1884
|
|
|
|
|
|
|
Name => 'PanasonicDateTime', |
1885
|
|
|
|
|
|
|
Groups => { 2 => 'Time' }, |
1886
|
|
|
|
|
|
|
Shift => 'Time', |
1887
|
|
|
|
|
|
|
Format => 'undef[8]', |
1888
|
|
|
|
|
|
|
RawConv => '$val =~ /^\0/ ? undef : $val', |
1889
|
|
|
|
|
|
|
ValueConv => 'sprintf("%s:%s:%s %s:%s:%s.%s", unpack "H4H2H2H2H2H2H2", $val)', |
1890
|
|
|
|
|
|
|
ValueConvInv => q{ |
1891
|
|
|
|
|
|
|
$val =~ s/[-+].*//; # remove time zone |
1892
|
|
|
|
|
|
|
$val =~ tr/0-9//dc; # remove non-digits |
1893
|
|
|
|
|
|
|
$val = pack("H*",$val); |
1894
|
|
|
|
|
|
|
$val .= "\0" while length $val < 8; |
1895
|
|
|
|
|
|
|
return $val; |
1896
|
|
|
|
|
|
|
}, |
1897
|
|
|
|
|
|
|
PrintConv => '$self->ConvertDateTime($val)', |
1898
|
|
|
|
|
|
|
PrintConvInv => '$self->InverseDateTime($val)', |
1899
|
|
|
|
|
|
|
}, |
1900
|
|
|
|
|
|
|
# 8 - 8 bytes usually 8 x 0xff (spot for another date/time?) |
1901
|
|
|
|
|
|
|
16 => { |
1902
|
|
|
|
|
|
|
Name => 'TimeLapseShotNumber', |
1903
|
|
|
|
|
|
|
Format => 'int32u', |
1904
|
|
|
|
|
|
|
}, |
1905
|
|
|
|
|
|
|
); |
1906
|
|
|
|
|
|
|
|
1907
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Data1 = ( |
1908
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
1909
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
1910
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
1911
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1912
|
|
|
|
|
|
|
WRITABLE => 1, |
1913
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_Data1', |
1914
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
1915
|
|
|
|
|
|
|
0x0016 => { |
1916
|
|
|
|
|
|
|
Name => 'LensType', |
1917
|
|
|
|
|
|
|
Format => 'int32u', |
1918
|
|
|
|
|
|
|
Priority => 0, |
1919
|
|
|
|
|
|
|
SeparateTable => 1, |
1920
|
|
|
|
|
|
|
ValueConv => '(($val >> 2) & 0xffff) . " " . ($val & 0x3)', |
1921
|
|
|
|
|
|
|
ValueConvInv => \&LensTypeConvInv, |
1922
|
|
|
|
|
|
|
PrintConv => \%leicaLensTypes, |
1923
|
|
|
|
|
|
|
}, |
1924
|
|
|
|
|
|
|
); |
1925
|
|
|
|
|
|
|
|
1926
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Data2 = ( |
1927
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
1928
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1929
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_Data2', |
1930
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
1931
|
|
|
|
|
|
|
); |
1932
|
|
|
|
|
|
|
|
1933
|
|
|
|
|
|
|
# Leica type5 maker notes (ref PH) (X1) |
1934
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica5 = ( |
1935
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
1936
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
1937
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
1938
|
|
|
|
|
|
|
WRITABLE => 1, |
1939
|
|
|
|
|
|
|
PRIORITY => 0, |
1940
|
|
|
|
|
|
|
NOTES => 'This information is written by the X1, X2, X VARIO and T.', |
1941
|
|
|
|
|
|
|
0x0303 => { |
1942
|
|
|
|
|
|
|
Name => 'LensType', |
1943
|
|
|
|
|
|
|
Condition => '$format eq "string"', |
1944
|
|
|
|
|
|
|
Notes => 'Leica T only', |
1945
|
|
|
|
|
|
|
Writable => 'string', |
1946
|
|
|
|
|
|
|
}, |
1947
|
|
|
|
|
|
|
# 0x0304 - int8u[1]: may be M-lens ID for Leica SL, mounted through "M-adapter L" (ref IB) |
1948
|
|
|
|
|
|
|
# --> int8u[4] for some models (maybe not lens ID for these?) - PH |
1949
|
|
|
|
|
|
|
# (see http://us.leica-camera.com/Photography/Leica-APS-C/Lenses-for-Leica-TL/L-Adapters/M-Adapter-L) |
1950
|
|
|
|
|
|
|
# 58 = 'Leica Noctilux-M 75mm F1.25 ASPH (Typ 601) on Leica SL |
1951
|
|
|
|
|
|
|
0x0305 => { #IB |
1952
|
|
|
|
|
|
|
Name => 'SerialNumber', |
1953
|
|
|
|
|
|
|
Writable => 'int32u', |
1954
|
|
|
|
|
|
|
}, |
1955
|
|
|
|
|
|
|
# 0x0406 - saturation or sharpness |
1956
|
|
|
|
|
|
|
0x0407 => { Name => 'OriginalFileName', Writable => 'string' }, |
1957
|
|
|
|
|
|
|
0x0408 => { Name => 'OriginalDirectory',Writable => 'string' }, |
1958
|
|
|
|
|
|
|
0x040a => { #IB |
1959
|
|
|
|
|
|
|
Name => 'FocusInfo', |
1960
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::FocusInfo' }, |
1961
|
|
|
|
|
|
|
}, |
1962
|
|
|
|
|
|
|
# 0x040b - related to white balance |
1963
|
|
|
|
|
|
|
0x040d => { |
1964
|
|
|
|
|
|
|
Name => 'ExposureMode', |
1965
|
|
|
|
|
|
|
Format => 'int8u', |
1966
|
|
|
|
|
|
|
Count => 4, |
1967
|
|
|
|
|
|
|
PrintConv => { |
1968
|
|
|
|
|
|
|
'0 0 0 0' => 'Program AE', |
1969
|
|
|
|
|
|
|
# '0 1 0 0' - seen for X (Typ 113) - PH |
1970
|
|
|
|
|
|
|
'1 0 0 0' => 'Aperture-priority AE', |
1971
|
|
|
|
|
|
|
'1 1 0 0' => 'Aperture-priority AE (1)', # (see for Leica T) |
1972
|
|
|
|
|
|
|
'2 0 0 0' => 'Shutter speed priority AE', #(guess) |
1973
|
|
|
|
|
|
|
'3 0 0 0' => 'Manual', |
1974
|
|
|
|
|
|
|
}, |
1975
|
|
|
|
|
|
|
}, |
1976
|
|
|
|
|
|
|
0x0410 => { |
1977
|
|
|
|
|
|
|
Name => 'ShotInfo', |
1978
|
|
|
|
|
|
|
SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::ShotInfo' }, |
1979
|
|
|
|
|
|
|
}, |
1980
|
|
|
|
|
|
|
# 0x0410 - int8u[16]: first byte is FileNumber |
1981
|
|
|
|
|
|
|
# 0x0411 - int8u[4]: first number is FilmMode (1=Standard,2=Vivid,3=Natural,4=BW Natural,5=BW High Contrast) |
1982
|
|
|
|
|
|
|
0x0412 => { Name => 'FilmMode', Writable => 'string' }, |
1983
|
|
|
|
|
|
|
0x0413 => { Name => 'WB_RGBLevels', Writable => 'rational64u', Count => 3 }, |
1984
|
|
|
|
|
|
|
0x0500 => { |
1985
|
|
|
|
|
|
|
Name => 'InternalSerialNumber', |
1986
|
|
|
|
|
|
|
Writable => 'undef', |
1987
|
|
|
|
|
|
|
PrintConv => q{ |
1988
|
|
|
|
|
|
|
return $val unless $val=~/^(.{3})(\d{2})(\d{2})(\d{2})(\d{4})/; |
1989
|
|
|
|
|
|
|
my $yr = $2 + ($2 < 70 ? 2000 : 1900); |
1990
|
|
|
|
|
|
|
return "($1) $yr:$3:$4 no. $5"; |
1991
|
|
|
|
|
|
|
}, |
1992
|
|
|
|
|
|
|
PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_', |
1993
|
|
|
|
|
|
|
}, |
1994
|
|
|
|
|
|
|
); |
1995
|
|
|
|
|
|
|
|
1996
|
|
|
|
|
|
|
# Leica type5 ShotInfo (ref PH) (X2) |
1997
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::ShotInfo = ( |
1998
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
1999
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
2000
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
2001
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
2002
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_ShotInfo', |
2003
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
2004
|
|
|
|
|
|
|
WRITABLE => 1, |
2005
|
|
|
|
|
|
|
0 => { |
2006
|
|
|
|
|
|
|
Name => 'FileIndex', |
2007
|
|
|
|
|
|
|
Format => 'int16u', |
2008
|
|
|
|
|
|
|
}, |
2009
|
|
|
|
|
|
|
); |
2010
|
|
|
|
|
|
|
|
2011
|
|
|
|
|
|
|
# Leica type5 FocusInfo (ref IB) |
2012
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::FocusInfo = ( |
2013
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
2014
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
2015
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
2016
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
2017
|
|
|
|
|
|
|
TAG_PREFIX => 'Leica_FocusInfo', |
2018
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
2019
|
|
|
|
|
|
|
WRITABLE => 1, |
2020
|
|
|
|
|
|
|
FORMAT => 'int16u', |
2021
|
|
|
|
|
|
|
0 => { |
2022
|
|
|
|
|
|
|
Name => 'FocusDistance', |
2023
|
|
|
|
|
|
|
ValueConv => '$val / 1000', |
2024
|
|
|
|
|
|
|
ValueConvInv => '$val * 1000', |
2025
|
|
|
|
|
|
|
PrintConv => '$val < 65535 ? "$val m" : "inf"', |
2026
|
|
|
|
|
|
|
PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 65535', |
2027
|
|
|
|
|
|
|
}, |
2028
|
|
|
|
|
|
|
1 => { |
2029
|
|
|
|
|
|
|
Name => 'FocalLength', |
2030
|
|
|
|
|
|
|
Priority => 0, |
2031
|
|
|
|
|
|
|
RawConv => '$val ? $val : undef', |
2032
|
|
|
|
|
|
|
ValueConv => '$val / 1000', |
2033
|
|
|
|
|
|
|
ValueConvInv => '$val * 1000', |
2034
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.1f mm",$val)', |
2035
|
|
|
|
|
|
|
PrintConvInv => '$val=~s/\s*mm$//;$val', |
2036
|
|
|
|
|
|
|
}, |
2037
|
|
|
|
|
|
|
); |
2038
|
|
|
|
|
|
|
|
2039
|
|
|
|
|
|
|
# Leica type6 maker notes (ref PH) (S2) |
2040
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica6 = ( |
2041
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
2042
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
2043
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
2044
|
|
|
|
|
|
|
NOTES => q{ |
2045
|
|
|
|
|
|
|
This information is written by the S2 and M (Typ 240), as a trailer in JPEG |
2046
|
|
|
|
|
|
|
images. |
2047
|
|
|
|
|
|
|
}, |
2048
|
|
|
|
|
|
|
0x300 => { |
2049
|
|
|
|
|
|
|
Name => 'PreviewImage', |
2050
|
|
|
|
|
|
|
Groups => { 2 => 'Preview' }, |
2051
|
|
|
|
|
|
|
Writable => 'undef', |
2052
|
|
|
|
|
|
|
Notes => 'S2 and M (Typ 240)', |
2053
|
|
|
|
|
|
|
DataTag => 'PreviewImage', |
2054
|
|
|
|
|
|
|
RawConv => q{ |
2055
|
|
|
|
|
|
|
return \$val if $val =~ /^Binary/; |
2056
|
|
|
|
|
|
|
return \$val if $val =~ /^\xff\xd8\xff/; |
2057
|
|
|
|
|
|
|
$$self{PreviewError} = 1 unless $val eq 'none'; |
2058
|
|
|
|
|
|
|
return undef; |
2059
|
|
|
|
|
|
|
}, |
2060
|
|
|
|
|
|
|
ValueConvInv => '$val || "none"', |
2061
|
|
|
|
|
|
|
WriteCheck => 'return $val=~/^(none|\xff\xd8\xff)/s ? undef : "Not a valid image"', |
2062
|
|
|
|
|
|
|
ChangeBase => '$dirStart + $dataPos - 8', |
2063
|
|
|
|
|
|
|
}, |
2064
|
|
|
|
|
|
|
0x301 => { |
2065
|
|
|
|
|
|
|
Name => 'UnknownBlock', |
2066
|
|
|
|
|
|
|
Notes => 'unknown 320kB block, not copied to JPEG images', |
2067
|
|
|
|
|
|
|
Flags => [ 'Unknown', 'Binary', 'Drop' ], |
2068
|
|
|
|
|
|
|
}, |
2069
|
|
|
|
|
|
|
# 0x302 - same value as 4 unknown bytes at the end of JPEG or after the DNG TIFF header (ImageID, ref IB) |
2070
|
|
|
|
|
|
|
0x303 => { |
2071
|
|
|
|
|
|
|
Name => 'LensType', |
2072
|
|
|
|
|
|
|
Writable => 'string', |
2073
|
|
|
|
|
|
|
ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces |
2074
|
|
|
|
|
|
|
ValueConvInv => '$val', |
2075
|
|
|
|
|
|
|
}, |
2076
|
|
|
|
|
|
|
0x304 => { #IB |
2077
|
|
|
|
|
|
|
Name => 'FocusDistance', |
2078
|
|
|
|
|
|
|
Notes => 'focus distance in mm for most models, but cm for others', |
2079
|
|
|
|
|
|
|
Writable => 'int32u', |
2080
|
|
|
|
|
|
|
}, |
2081
|
|
|
|
|
|
|
0x311 => { |
2082
|
|
|
|
|
|
|
Name => 'ExternalSensorBrightnessValue', |
2083
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /Typ 006/', |
2084
|
|
|
|
|
|
|
Notes => 'Leica S only', |
2085
|
|
|
|
|
|
|
Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) |
2086
|
|
|
|
|
|
|
Writable => 'rational64s', |
2087
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
2088
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2089
|
|
|
|
|
|
|
}, |
2090
|
|
|
|
|
|
|
0x312 => { |
2091
|
|
|
|
|
|
|
Name => 'MeasuredLV', |
2092
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /Typ 006/', |
2093
|
|
|
|
|
|
|
Notes => 'Leica S only', |
2094
|
|
|
|
|
|
|
Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) |
2095
|
|
|
|
|
|
|
Writable => 'rational64s', |
2096
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
2097
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2098
|
|
|
|
|
|
|
}, |
2099
|
|
|
|
|
|
|
0x320 => { |
2100
|
|
|
|
|
|
|
Name => 'FirmwareVersion', |
2101
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /Typ 006/', |
2102
|
|
|
|
|
|
|
Notes => 'Leica S only', |
2103
|
|
|
|
|
|
|
Writable => 'int8u', |
2104
|
|
|
|
|
|
|
Count => 4, |
2105
|
|
|
|
|
|
|
PrintConv => '$val=~tr/ /./; $val', |
2106
|
|
|
|
|
|
|
PrintConvInv => '$val=~tr/./ /; $val', |
2107
|
|
|
|
|
|
|
}, |
2108
|
|
|
|
|
|
|
0x321 => { #IB |
2109
|
|
|
|
|
|
|
Name => 'LensSerialNumber', |
2110
|
|
|
|
|
|
|
Condition => '$$self{Model} =~ /Typ 006/', |
2111
|
|
|
|
|
|
|
Notes => 'Leica S only', |
2112
|
|
|
|
|
|
|
Writable => 'int32u', |
2113
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.10d",$val)', |
2114
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2115
|
|
|
|
|
|
|
}, |
2116
|
|
|
|
|
|
|
# 0x321 - SerialNumber for Leica S? (ref IB) |
2117
|
|
|
|
|
|
|
# 0x340 - same as 0x302 (ImageID, ref IB) |
2118
|
|
|
|
|
|
|
); |
2119
|
|
|
|
|
|
|
|
2120
|
|
|
|
|
|
|
# Leica type9 maker notes (ref IB) (S) |
2121
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Leica9 = ( |
2122
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif, |
2123
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif, |
2124
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' }, |
2125
|
|
|
|
|
|
|
NOTES => 'This information is written by the Leica S (Typ 007) and M10 models.', |
2126
|
|
|
|
|
|
|
0x304 => { |
2127
|
|
|
|
|
|
|
Name => 'FocusDistance', |
2128
|
|
|
|
|
|
|
Notes => 'focus distance in mm for most models, but cm for others', |
2129
|
|
|
|
|
|
|
Writable => 'int32u', |
2130
|
|
|
|
|
|
|
}, |
2131
|
|
|
|
|
|
|
0x311 => { |
2132
|
|
|
|
|
|
|
Name => 'ExternalSensorBrightnessValue', |
2133
|
|
|
|
|
|
|
Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) |
2134
|
|
|
|
|
|
|
Writable => 'rational64s', |
2135
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
2136
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2137
|
|
|
|
|
|
|
}, |
2138
|
|
|
|
|
|
|
0x312 => { |
2139
|
|
|
|
|
|
|
Name => 'MeasuredLV', |
2140
|
|
|
|
|
|
|
Format => 'rational64s', # (may be incorrectly unsigned in JPEG images) |
2141
|
|
|
|
|
|
|
Writable => 'rational64s', |
2142
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.2f", $val)', |
2143
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2144
|
|
|
|
|
|
|
}, |
2145
|
|
|
|
|
|
|
# 0x340 - ImageUniqueID |
2146
|
|
|
|
|
|
|
0x34c => { #23 |
2147
|
|
|
|
|
|
|
Name => 'UserProfile', |
2148
|
|
|
|
|
|
|
Writable => 'string', |
2149
|
|
|
|
|
|
|
}, |
2150
|
|
|
|
|
|
|
# 0x357 int32u - 0=DNG, 3162=JPG (ref 23) |
2151
|
|
|
|
|
|
|
0x359 => { #23 |
2152
|
|
|
|
|
|
|
Name => 'ISOSelected', |
2153
|
|
|
|
|
|
|
Writable => 'int32s', |
2154
|
|
|
|
|
|
|
PrintConv => { |
2155
|
|
|
|
|
|
|
0 => 'Auto', |
2156
|
|
|
|
|
|
|
OTHER => sub { return shift; }, |
2157
|
|
|
|
|
|
|
}, |
2158
|
|
|
|
|
|
|
}, |
2159
|
|
|
|
|
|
|
0x35a => { #23 |
2160
|
|
|
|
|
|
|
Name => 'FNumber', |
2161
|
|
|
|
|
|
|
Writable => 'int32s', |
2162
|
|
|
|
|
|
|
ValueConv => '$val / 1000', |
2163
|
|
|
|
|
|
|
ValueConvInv => '$val * 1000', |
2164
|
|
|
|
|
|
|
PrintConv => 'sprintf("%.1f", $val)', |
2165
|
|
|
|
|
|
|
PrintConvInv => '$val', |
2166
|
|
|
|
|
|
|
}, |
2167
|
|
|
|
|
|
|
0x035b => { #IB |
2168
|
|
|
|
|
|
|
Name => 'CorrelatedColorTemp', # (in Kelvin) |
2169
|
|
|
|
|
|
|
Writable => 'int16u', |
2170
|
|
|
|
|
|
|
}, |
2171
|
|
|
|
|
|
|
0x035c => { #IB |
2172
|
|
|
|
|
|
|
Name => 'ColorTint', # (same units as Adobe is using) |
2173
|
|
|
|
|
|
|
Writable => 'int16s', |
2174
|
|
|
|
|
|
|
}, |
2175
|
|
|
|
|
|
|
0x035d => { #IB |
2176
|
|
|
|
|
|
|
Name => 'WhitePoint', # (x/y) |
2177
|
|
|
|
|
|
|
Writable => 'rational64u', |
2178
|
|
|
|
|
|
|
Count => 2, |
2179
|
|
|
|
|
|
|
}, |
2180
|
|
|
|
|
|
|
); |
2181
|
|
|
|
|
|
|
|
2182
|
|
|
|
|
|
|
# Type 2 tags (ref PH) |
2183
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Type2 = ( |
2184
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
2185
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
2186
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
2187
|
|
|
|
|
|
|
FORMAT => 'int16u', |
2188
|
|
|
|
|
|
|
NOTES => q{ |
2189
|
|
|
|
|
|
|
This type of maker notes is used by models such as the NV-DS65, PV-D2002, |
2190
|
|
|
|
|
|
|
PV-DC3000, PV-DV203, PV-DV401, PV-DV702, PV-L2001, PV-SD4090, PV-SD5000 and |
2191
|
|
|
|
|
|
|
iPalm. |
2192
|
|
|
|
|
|
|
}, |
2193
|
|
|
|
|
|
|
0 => { |
2194
|
|
|
|
|
|
|
Name => 'MakerNoteType', |
2195
|
|
|
|
|
|
|
Format => 'string[4]', |
2196
|
|
|
|
|
|
|
}, |
2197
|
|
|
|
|
|
|
# seems to vary inversely with amount of light, so I'll call it 'Gain' - PH |
2198
|
|
|
|
|
|
|
# (minimum is 16, maximum is 136. Value is 0 for pictures captured from video) |
2199
|
|
|
|
|
|
|
3 => 'Gain', |
2200
|
|
|
|
|
|
|
); |
2201
|
|
|
|
|
|
|
|
2202
|
|
|
|
|
|
|
# Face detection position information (ref PH) |
2203
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::FaceDetInfo = ( |
2204
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
2205
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
2206
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
2207
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
2208
|
|
|
|
|
|
|
WRITABLE => 1, |
2209
|
|
|
|
|
|
|
FORMAT => 'int16u', |
2210
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
2211
|
|
|
|
|
|
|
DATAMEMBER => [ 0 ], |
2212
|
|
|
|
|
|
|
NOTES => 'Face detection position information.', |
2213
|
|
|
|
|
|
|
0 => { |
2214
|
|
|
|
|
|
|
Name => 'NumFacePositions', |
2215
|
|
|
|
|
|
|
Format => 'int16u', |
2216
|
|
|
|
|
|
|
DataMember => 'NumFacePositions', |
2217
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} = $val', |
2218
|
|
|
|
|
|
|
Notes => q{ |
2219
|
|
|
|
|
|
|
number of detected face positions stored in this record. May be less than |
2220
|
|
|
|
|
|
|
FacesDetected |
2221
|
|
|
|
|
|
|
}, |
2222
|
|
|
|
|
|
|
}, |
2223
|
|
|
|
|
|
|
1 => { |
2224
|
|
|
|
|
|
|
Name => 'Face1Position', |
2225
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2226
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} < 1 ? undef : $val', |
2227
|
|
|
|
|
|
|
Notes => q{ |
2228
|
|
|
|
|
|
|
4 numbers: X/Y coordinates of the face center and width/height of face. |
2229
|
|
|
|
|
|
|
Coordinates are relative to an image twice the size of the thumbnail, or 320 |
2230
|
|
|
|
|
|
|
pixels wide |
2231
|
|
|
|
|
|
|
}, |
2232
|
|
|
|
|
|
|
}, |
2233
|
|
|
|
|
|
|
5 => { |
2234
|
|
|
|
|
|
|
Name => 'Face2Position', |
2235
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2236
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} < 2 ? undef : $val', |
2237
|
|
|
|
|
|
|
}, |
2238
|
|
|
|
|
|
|
9 => { |
2239
|
|
|
|
|
|
|
Name => 'Face3Position', |
2240
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2241
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} < 3 ? undef : $val', |
2242
|
|
|
|
|
|
|
}, |
2243
|
|
|
|
|
|
|
13 => { |
2244
|
|
|
|
|
|
|
Name => 'Face4Position', |
2245
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2246
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} < 4 ? undef : $val', |
2247
|
|
|
|
|
|
|
}, |
2248
|
|
|
|
|
|
|
17 => { |
2249
|
|
|
|
|
|
|
Name => 'Face5Position', |
2250
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2251
|
|
|
|
|
|
|
RawConv => '$$self{NumFacePositions} < 5 ? undef : $val', |
2252
|
|
|
|
|
|
|
}, |
2253
|
|
|
|
|
|
|
); |
2254
|
|
|
|
|
|
|
|
2255
|
|
|
|
|
|
|
# Face recognition information from DMC-TZ7 (ref PH) |
2256
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::FaceRecInfo = ( |
2257
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
2258
|
|
|
|
|
|
|
WRITE_PROC => \&Image::ExifTool::WriteBinaryData, |
2259
|
|
|
|
|
|
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData, |
2260
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
2261
|
|
|
|
|
|
|
WRITABLE => 1, |
2262
|
|
|
|
|
|
|
FIRST_ENTRY => 0, |
2263
|
|
|
|
|
|
|
DATAMEMBER => [ 0 ], |
2264
|
|
|
|
|
|
|
NOTES => q{ |
2265
|
|
|
|
|
|
|
Tags written by cameras with facial recognition. These cameras not only |
2266
|
|
|
|
|
|
|
detect faces in an image, but also recognize specific people based a |
2267
|
|
|
|
|
|
|
user-supplied set of known faces. |
2268
|
|
|
|
|
|
|
}, |
2269
|
|
|
|
|
|
|
0 => { |
2270
|
|
|
|
|
|
|
Name => 'FacesRecognized', |
2271
|
|
|
|
|
|
|
Format => 'int16u', |
2272
|
|
|
|
|
|
|
DataMember => 'FacesRecognized', |
2273
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} = $val', |
2274
|
|
|
|
|
|
|
}, |
2275
|
|
|
|
|
|
|
4 => { |
2276
|
|
|
|
|
|
|
Name => 'RecognizedFace1Name', |
2277
|
|
|
|
|
|
|
Format => 'string[20]', |
2278
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', |
2279
|
|
|
|
|
|
|
}, |
2280
|
|
|
|
|
|
|
24 => { |
2281
|
|
|
|
|
|
|
Name => 'RecognizedFace1Position', |
2282
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2283
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', |
2284
|
|
|
|
|
|
|
Notes => 'coordinates in same format as face detection tags above', |
2285
|
|
|
|
|
|
|
}, |
2286
|
|
|
|
|
|
|
32 => { |
2287
|
|
|
|
|
|
|
Name => 'RecognizedFace1Age', |
2288
|
|
|
|
|
|
|
Format => 'string[20]', |
2289
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 1 ? undef : $val', |
2290
|
|
|
|
|
|
|
}, |
2291
|
|
|
|
|
|
|
52 => { |
2292
|
|
|
|
|
|
|
Name => 'RecognizedFace2Name', |
2293
|
|
|
|
|
|
|
Format => 'string[20]', |
2294
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', |
2295
|
|
|
|
|
|
|
}, |
2296
|
|
|
|
|
|
|
72 => { |
2297
|
|
|
|
|
|
|
Name => 'RecognizedFace2Position', |
2298
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2299
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', |
2300
|
|
|
|
|
|
|
}, |
2301
|
|
|
|
|
|
|
80 => { |
2302
|
|
|
|
|
|
|
Name => 'RecognizedFace2Age', |
2303
|
|
|
|
|
|
|
Format => 'string[20]', |
2304
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 2 ? undef : $val', |
2305
|
|
|
|
|
|
|
}, |
2306
|
|
|
|
|
|
|
100 => { |
2307
|
|
|
|
|
|
|
Name => 'RecognizedFace3Name', |
2308
|
|
|
|
|
|
|
Format => 'string[20]', |
2309
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', |
2310
|
|
|
|
|
|
|
}, |
2311
|
|
|
|
|
|
|
120 => { |
2312
|
|
|
|
|
|
|
Name => 'RecognizedFace3Position', |
2313
|
|
|
|
|
|
|
Format => 'int16u[4]', |
2314
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', |
2315
|
|
|
|
|
|
|
}, |
2316
|
|
|
|
|
|
|
128 => { |
2317
|
|
|
|
|
|
|
Name => 'RecognizedFace3Age', |
2318
|
|
|
|
|
|
|
Format => 'string[20]', |
2319
|
|
|
|
|
|
|
RawConv => '$$self{FacesRecognized} < 3 ? undef : $val', |
2320
|
|
|
|
|
|
|
}, |
2321
|
|
|
|
|
|
|
); |
2322
|
|
|
|
|
|
|
|
2323
|
|
|
|
|
|
|
# PANA atom found in user data of MP4 videos (ref PH) |
2324
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::PANA = ( |
2325
|
|
|
|
|
|
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, |
2326
|
|
|
|
|
|
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, |
2327
|
|
|
|
|
|
|
NOTES => q{ |
2328
|
|
|
|
|
|
|
Tags extracted from the PANA and LEIC user data found in MP4 videos from |
2329
|
|
|
|
|
|
|
various Panasonic and Leica models. |
2330
|
|
|
|
|
|
|
}, |
2331
|
|
|
|
|
|
|
0x00 => { |
2332
|
|
|
|
|
|
|
Name => 'Make', |
2333
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^(LEICA|Panasonic)/', # (only seen "LEICA") |
2334
|
|
|
|
|
|
|
Groups => { 2 => 'Camera' }, |
2335
|
|
|
|
|
|
|
Format => 'string[22]', |
2336
|
|
|
|
|
|
|
RawConv => '$$self{LeicaLEIC} = 1;$$self{Make} = $val', |
2337
|
|
|
|
|
|
|
}, |
2338
|
|
|
|
|
|
|
0x04 => { |
2339
|
|
|
|
|
|
|
Name => 'Model', |
2340
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^[^\0]{6}/ and not $$self{LeicaLEIC}', |
2341
|
|
|
|
|
|
|
Description => 'Camera Model Name', |
2342
|
|
|
|
|
|
|
Groups => { 2 => 'Camera' }, |
2343
|
|
|
|
|
|
|
Format => 'string[16]', |
2344
|
|
|
|
|
|
|
RawConv => '$$self{Model} = $val', |
2345
|
|
|
|
|
|
|
}, |
2346
|
|
|
|
|
|
|
0x0c => { # (FZ1000) |
2347
|
|
|
|
|
|
|
Name => 'Model', |
2348
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^[^\0]{6}/ and not $$self{LeicaLEIC} and not $$self{Model}', |
2349
|
|
|
|
|
|
|
Description => 'Camera Model Name', |
2350
|
|
|
|
|
|
|
Groups => { 2 => 'Camera' }, |
2351
|
|
|
|
|
|
|
Format => 'string[16]', |
2352
|
|
|
|
|
|
|
RawConv => '$$self{Model} = $val', |
2353
|
|
|
|
|
|
|
}, |
2354
|
|
|
|
|
|
|
0x10 => { # (DC-FT7) |
2355
|
|
|
|
|
|
|
Name => 'JPEG-likeData', |
2356
|
|
|
|
|
|
|
# looks like a JPEG preview, but not a well-formed JPEG file |
2357
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', |
2358
|
|
|
|
|
|
|
Format => 'undef[$size-0x10]', |
2359
|
|
|
|
|
|
|
SubDirectory => { |
2360
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Exif::Main', |
2361
|
|
|
|
|
|
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, |
2362
|
|
|
|
|
|
|
Start => 12, |
2363
|
|
|
|
|
|
|
}, |
2364
|
|
|
|
|
|
|
}, |
2365
|
|
|
|
|
|
|
0x16 => { |
2366
|
|
|
|
|
|
|
Name => 'Model', |
2367
|
|
|
|
|
|
|
Condition => '$$self{LeicaLEIC}', |
2368
|
|
|
|
|
|
|
Description => 'Camera Model Name', |
2369
|
|
|
|
|
|
|
Groups => { 2 => 'Camera' }, |
2370
|
|
|
|
|
|
|
Format => 'string[30]', |
2371
|
|
|
|
|
|
|
RawConv => '$$self{Model} = $val', |
2372
|
|
|
|
|
|
|
}, |
2373
|
|
|
|
|
|
|
0x40 => { |
2374
|
|
|
|
|
|
|
Name => 'ThumbnailTest', |
2375
|
|
|
|
|
|
|
Format => 'undef[0x600]', |
2376
|
|
|
|
|
|
|
Hidden => 1, |
2377
|
|
|
|
|
|
|
RawConv => q{ |
2378
|
|
|
|
|
|
|
if (substr($val,0x1c,3) eq "\xff\xd8\xff") { # offset 0x5c |
2379
|
|
|
|
|
|
|
$$self{ThumbType} = 1; |
2380
|
|
|
|
|
|
|
} elsif (substr($val,0x506,3) eq "\xff\xd8\xff") { # offset 0x546 |
2381
|
|
|
|
|
|
|
$$self{ThumbType} = 2; |
2382
|
|
|
|
|
|
|
} elsif (substr($val,0x51e,3) eq "\xff\xd8\xff") { # offset 0x55e (Leica T) |
2383
|
|
|
|
|
|
|
$$self{ThumbType} = 3; |
2384
|
|
|
|
|
|
|
} else { |
2385
|
|
|
|
|
|
|
$$self{ThumbType} = 0; |
2386
|
|
|
|
|
|
|
} |
2387
|
|
|
|
|
|
|
return undef; |
2388
|
|
|
|
|
|
|
}, |
2389
|
|
|
|
|
|
|
}, |
2390
|
|
|
|
|
|
|
0x34 => { |
2391
|
|
|
|
|
|
|
Name => 'Version1', |
2392
|
|
|
|
|
|
|
Condition => '$$self{LeicaLEIC}', |
2393
|
|
|
|
|
|
|
Format => 'string[14]', |
2394
|
|
|
|
|
|
|
}, |
2395
|
|
|
|
|
|
|
0x3e => { |
2396
|
|
|
|
|
|
|
Name => 'Version2', |
2397
|
|
|
|
|
|
|
Condition => '$$self{LeicaLEIC}', |
2398
|
|
|
|
|
|
|
Format => 'string[14]', |
2399
|
|
|
|
|
|
|
}, |
2400
|
|
|
|
|
|
|
0x50 => { |
2401
|
|
|
|
|
|
|
Name => 'MakerNoteLeica5', |
2402
|
|
|
|
|
|
|
Condition => '$$self{LeicaLEIC}', |
2403
|
|
|
|
|
|
|
SubDirectory => { |
2404
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Panasonic::Leica5', |
2405
|
|
|
|
|
|
|
ProcessProc => \&ProcessLeicaLEIC, |
2406
|
|
|
|
|
|
|
}, |
2407
|
|
|
|
|
|
|
}, |
2408
|
|
|
|
|
|
|
0x58 => { |
2409
|
|
|
|
|
|
|
Name => 'ThumbnailWidth', |
2410
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 1', |
2411
|
|
|
|
|
|
|
Notes => 'Panasonic models', |
2412
|
|
|
|
|
|
|
Format => 'int16u', |
2413
|
|
|
|
|
|
|
}, |
2414
|
|
|
|
|
|
|
0x5a => { |
2415
|
|
|
|
|
|
|
Name => 'ThumbnailHeight', |
2416
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 1', |
2417
|
|
|
|
|
|
|
Format => 'int16u', |
2418
|
|
|
|
|
|
|
}, |
2419
|
|
|
|
|
|
|
0x5c => { |
2420
|
|
|
|
|
|
|
Name => 'ThumbnailImage', |
2421
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 1', |
2422
|
|
|
|
|
|
|
Groups => { 2 => 'Preview' }, |
2423
|
|
|
|
|
|
|
Format => 'undef[16384]', |
2424
|
|
|
|
|
|
|
ValueConv => '$val=~s/\0*$//; \$val', # remove trailing zeros |
2425
|
|
|
|
|
|
|
}, |
2426
|
|
|
|
|
|
|
# 0x5c - there is some messed-up EXIF-IFD-looking data starting here in |
2427
|
|
|
|
|
|
|
# Leica X VARIO MP4 videos, but it doesn't quite make sense |
2428
|
|
|
|
|
|
|
0x536 => { # (Leica X VARIO) |
2429
|
|
|
|
|
|
|
Name => 'ThumbnailWidth', |
2430
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 2', |
2431
|
|
|
|
|
|
|
Notes => 'Leica X Vario', |
2432
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2433
|
|
|
|
|
|
|
}, |
2434
|
|
|
|
|
|
|
0x53a => { # (Leica X VARIO) |
2435
|
|
|
|
|
|
|
Name => 'ThumbnailHeight', |
2436
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 2', |
2437
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2438
|
|
|
|
|
|
|
}, |
2439
|
|
|
|
|
|
|
0x53e => { # (Leica X VARIO) |
2440
|
|
|
|
|
|
|
Name => 'ThumbnailLength', |
2441
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 2', |
2442
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2443
|
|
|
|
|
|
|
}, |
2444
|
|
|
|
|
|
|
0x546 => { # (Leica X VARIO) |
2445
|
|
|
|
|
|
|
Name => 'ThumbnailImage', |
2446
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 2', |
2447
|
|
|
|
|
|
|
Groups => { 2 => 'Preview' }, |
2448
|
|
|
|
|
|
|
Format => 'undef[$val{0x53e}]', |
2449
|
|
|
|
|
|
|
Binary => 1, |
2450
|
|
|
|
|
|
|
}, |
2451
|
|
|
|
|
|
|
0x54e => { # (Leica T) |
2452
|
|
|
|
|
|
|
Name => 'ThumbnailWidth', |
2453
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 3', |
2454
|
|
|
|
|
|
|
Notes => 'Leica X Vario', |
2455
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2456
|
|
|
|
|
|
|
}, |
2457
|
|
|
|
|
|
|
0x552 => { # (Leica T) |
2458
|
|
|
|
|
|
|
Name => 'ThumbnailHeight', |
2459
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 3', |
2460
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2461
|
|
|
|
|
|
|
}, |
2462
|
|
|
|
|
|
|
0x556 => { # (Leica T) |
2463
|
|
|
|
|
|
|
Name => 'ThumbnailLength', |
2464
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 3', |
2465
|
|
|
|
|
|
|
Format => 'int32uRev', # (little-endian) |
2466
|
|
|
|
|
|
|
}, |
2467
|
|
|
|
|
|
|
0x55e => { # (Leica T) |
2468
|
|
|
|
|
|
|
Name => 'ThumbnailImage', |
2469
|
|
|
|
|
|
|
Condition => '$$self{ThumbType} == 3', |
2470
|
|
|
|
|
|
|
Groups => { 2 => 'Preview' }, |
2471
|
|
|
|
|
|
|
Format => 'undef[$val{0x556}]', |
2472
|
|
|
|
|
|
|
Binary => 1, |
2473
|
|
|
|
|
|
|
}, |
2474
|
|
|
|
|
|
|
0x4068 => { |
2475
|
|
|
|
|
|
|
Name => 'ExifData', |
2476
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', |
2477
|
|
|
|
|
|
|
SubDirectory => { |
2478
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Exif::Main', |
2479
|
|
|
|
|
|
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, |
2480
|
|
|
|
|
|
|
Start => 12, |
2481
|
|
|
|
|
|
|
}, |
2482
|
|
|
|
|
|
|
}, |
2483
|
|
|
|
|
|
|
0x4080 => { # (FZ1000) |
2484
|
|
|
|
|
|
|
Name => 'ExifData', |
2485
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', |
2486
|
|
|
|
|
|
|
SubDirectory => { |
2487
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Exif::Main', |
2488
|
|
|
|
|
|
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, |
2489
|
|
|
|
|
|
|
Start => 12, |
2490
|
|
|
|
|
|
|
}, |
2491
|
|
|
|
|
|
|
}, |
2492
|
|
|
|
|
|
|
0x200080 => { # (GH6) |
2493
|
|
|
|
|
|
|
Name => 'ExifData', |
2494
|
|
|
|
|
|
|
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s', |
2495
|
|
|
|
|
|
|
SubDirectory => { |
2496
|
|
|
|
|
|
|
TagTable => 'Image::ExifTool::Exif::Main', |
2497
|
|
|
|
|
|
|
ProcessProc => \&Image::ExifTool::ProcessTIFF, |
2498
|
|
|
|
|
|
|
Start => 12, |
2499
|
|
|
|
|
|
|
}, |
2500
|
|
|
|
|
|
|
}, |
2501
|
|
|
|
|
|
|
); |
2502
|
|
|
|
|
|
|
|
2503
|
|
|
|
|
|
|
# Panasonic Composite tags |
2504
|
|
|
|
|
|
|
%Image::ExifTool::Panasonic::Composite = ( |
2505
|
|
|
|
|
|
|
GROUPS => { 2 => 'Camera' }, |
2506
|
|
|
|
|
|
|
AdvancedSceneMode => { |
2507
|
|
|
|
|
|
|
SeparateTable => 'Panasonic AdvancedSceneMode', # print values in a separate table |
2508
|
|
|
|
|
|
|
Require => { |
2509
|
|
|
|
|
|
|
0 => 'Model', |
2510
|
|
|
|
|
|
|
1 => 'SceneMode', |
2511
|
|
|
|
|
|
|
2 => 'AdvancedSceneType', |
2512
|
|
|
|
|
|
|
}, |
2513
|
|
|
|
|
|
|
ValueConv => '"$val[0] $val[1] $val[2]"', |
2514
|
|
|
|
|
|
|
PrintConv => { #PH |
2515
|
|
|
|
|
|
|
OTHER => sub { |
2516
|
|
|
|
|
|
|
my ($val,$flag,$conv) = @_; |
2517
|
|
|
|
|
|
|
$val =~ s/.* (\d+ \d+)/$1/; # drop model name |
2518
|
|
|
|
|
|
|
return $$conv{$val} if $$conv{$val}; |
2519
|
|
|
|
|
|
|
my @v = split ' ', $val; |
2520
|
|
|
|
|
|
|
my $prt = $shootingMode{$v[0]}; |
2521
|
|
|
|
|
|
|
# AdvancedSceneType=1 for non-automatic modes P,A,S,SCN (ref 19) |
2522
|
|
|
|
|
|
|
# AdvancedSceneType=5 for automatic mode iA (ref 19) |
2523
|
|
|
|
|
|
|
if ($prt) { |
2524
|
|
|
|
|
|
|
return $prt if $v[1] == 1; |
2525
|
|
|
|
|
|
|
return "$prt (intelligent auto)" if $v[1] == 5; #forum11523 |
2526
|
|
|
|
|
|
|
return "$prt (intelligent auto plus)" if $v[1] == 7; #forum11523 |
2527
|
|
|
|
|
|
|
return "$prt ($v[1])"; |
2528
|
|
|
|
|
|
|
} |
2529
|
|
|
|
|
|
|
return "Unknown ($val)"; |
2530
|
|
|
|
|
|
|
}, |
2531
|
|
|
|
|
|
|
Notes => 'A Composite tag derived from Model, SceneMode and AdvancedSceneType.', |
2532
|
|
|
|
|
|
|
'0 1' => 'Off', |
2533
|
|
|
|
|
|
|
# '0 7' - seen this for V-LUX movies (PH) |
2534
|
|
|
|
|
|
|
# '0 8' - seen for D-LUX(Typ104) movies (PH) |
2535
|
|
|
|
|
|
|
'2 2' => 'Outdoor Portrait', #(FZ28) |
2536
|
|
|
|
|
|
|
'2 3' => 'Indoor Portrait', #(FZ28) |
2537
|
|
|
|
|
|
|
'2 4' => 'Creative Portrait', #(FZ28) |
2538
|
|
|
|
|
|
|
'3 2' => 'Nature', #(FZ28) |
2539
|
|
|
|
|
|
|
'3 3' => 'Architecture', #(FZ28) |
2540
|
|
|
|
|
|
|
'3 4' => 'Creative Scenery', #(FZ28) |
2541
|
|
|
|
|
|
|
#'3 5' - ? (FT1) |
2542
|
|
|
|
|
|
|
'4 2' => 'Outdoor Sports', #(FZ28) |
2543
|
|
|
|
|
|
|
'4 3' => 'Indoor Sports', #(FZ28) |
2544
|
|
|
|
|
|
|
'4 4' => 'Creative Sports', #(FZ28) |
2545
|
|
|
|
|
|
|
'9 2' => 'Flower', #(FZ28) |
2546
|
|
|
|
|
|
|
'9 3' => 'Objects', #(FZ28) |
2547
|
|
|
|
|
|
|
'9 4' => 'Creative Macro', #(FZ28) |
2548
|
|
|
|
|
|
|
#'9 5' - ? (GF3) |
2549
|
|
|
|
|
|
|
'18 1' => 'High Sensitivity', #forum11523 (TZ5) |
2550
|
|
|
|
|
|
|
'20 1' => 'Fireworks', #forum11523 (TZ5) |
2551
|
|
|
|
|
|
|
'21 2' => 'Illuminations', #(FZ28) |
2552
|
|
|
|
|
|
|
'21 4' => 'Creative Night Scenery', #(FZ28) |
2553
|
|
|
|
|
|
|
#'21 5' - ? (LX3) |
2554
|
|
|
|
|
|
|
'26 1' => 'High-speed Burst (shot 1)', #forum11523 (TZ5) |
2555
|
|
|
|
|
|
|
'27 1' => 'High-speed Burst (shot 2)', #forum11523 (TZ5) |
2556
|
|
|
|
|
|
|
'29 1' => 'Snow', #forum11523 (TZ5) |
2557
|
|
|
|
|
|
|
'30 1' => 'Starry Sky', #forum11523 (TZ5) |
2558
|
|
|
|
|
|
|
'31 1' => 'Beach', #forum11523 (TZ5) |
2559
|
|
|
|
|
|
|
'36 1' => 'High-speed Burst (shot 3)', #forum11523 (TZ5) |
2560
|
|
|
|
|
|
|
#'37 5' - ? (various) |
2561
|
|
|
|
|
|
|
'39 1' => 'Aerial Photo / Underwater / Multi-aspect', #forum11523 (TZ5) |
2562
|
|
|
|
|
|
|
'45 2' => 'Cinema', #(GF2) |
2563
|
|
|
|
|
|
|
'45 7' => 'Expressive', #(GF1,GF2) |
2564
|
|
|
|
|
|
|
'45 8' => 'Retro', #(GF1,GF2) |
2565
|
|
|
|
|
|
|
'45 9' => 'Pure', #(GF1,GF2) |
2566
|
|
|
|
|
|
|
'45 10' => 'Elegant', #(GF1,GF2) |
2567
|
|
|
|
|
|
|
'45 12' => 'Monochrome', #(GF1,GF2) |
2568
|
|
|
|
|
|
|
'45 13' => 'Dynamic Art', #(GF1,GF2) |
2569
|
|
|
|
|
|
|
'45 14' => 'Silhouette', #(GF1,GF2) |
2570
|
|
|
|
|
|
|
'51 2' => 'HDR Art', #12 |
2571
|
|
|
|
|
|
|
'51 3' => 'HDR B&W', #12 |
2572
|
|
|
|
|
|
|
'59 1' => 'Expressive', #(GF5) |
2573
|
|
|
|
|
|
|
'59 2' => 'Retro', #(GF5) |
2574
|
|
|
|
|
|
|
'59 3' => 'High Key', #(GF5) |
2575
|
|
|
|
|
|
|
'59 4' => 'Sepia', #(GF3,GF5) |
2576
|
|
|
|
|
|
|
'59 5' => 'High Dynamic', #(GF3,GF5) |
2577
|
|
|
|
|
|
|
'59 6' => 'Miniature', #(GF3) |
2578
|
|
|
|
|
|
|
'59 9' => 'Low Key', #(GF5) |
2579
|
|
|
|
|
|
|
'59 10' => 'Toy Effect', #(GF5) |
2580
|
|
|
|
|
|
|
'59 11' => 'Dynamic Monochrome', #(GF5) |
2581
|
|
|
|
|
|
|
'59 12' => 'Soft', #(GF5) |
2582
|
|
|
|
|
|
|
'66 1' => 'Impressive Art', #19 |
2583
|
|
|
|
|
|
|
'66 2' => 'Cross Process', #(GF5) |
2584
|
|
|
|
|
|
|
'66 3' => 'Color Select', #(GF5) (called "One Point Color" by some other models - PH) |
2585
|
|
|
|
|
|
|
'66 4' => 'Star', #(GF5) |
2586
|
|
|
|
|
|
|
'90 3' => 'Old Days', #18 |
2587
|
|
|
|
|
|
|
'90 4' => 'Sunshine', #18 |
2588
|
|
|
|
|
|
|
'90 5' => 'Bleach Bypass', #18 |
2589
|
|
|
|
|
|
|
'90 6' => 'Toy Pop', #18 |
2590
|
|
|
|
|
|
|
'90 7' => 'Fantasy', #18 |
2591
|
|
|
|
|
|
|
'90 8' => 'Monochrome', #PH (GX7) |
2592
|
|
|
|
|
|
|
'90 9' => 'Rough Monochrome', #PH (GX7) |
2593
|
|
|
|
|
|
|
'90 10' => 'Silky Monochrome', #PH (GX7) |
2594
|
|
|
|
|
|
|
'92 1' => 'Handheld Night Shot', #Horst Wandres (FZ1000) |
2595
|
|
|
|
|
|
|
# TZ40 Creative Control modes (ref 19) |
2596
|
|
|
|
|
|
|
'DMC-TZ40 90 1' => 'Expressive', |
2597
|
|
|
|
|
|
|
'DMC-TZ40 90 2' => 'Retro', |
2598
|
|
|
|
|
|
|
'DMC-TZ40 90 3' => 'High Key', |
2599
|
|
|
|
|
|
|
'DMC-TZ40 90 4' => 'Sepia', |
2600
|
|
|
|
|
|
|
'DMC-TZ40 90 5' => 'High Dynamic', |
2601
|
|
|
|
|
|
|
'DMC-TZ40 90 6' => 'Miniature', |
2602
|
|
|
|
|
|
|
'DMC-TZ40 90 9' => 'Low Key', |
2603
|
|
|
|
|
|
|
'DMC-TZ40 90 10' => 'Toy Effect', |
2604
|
|
|
|
|
|
|
'DMC-TZ40 90 11' => 'Dynamic Monochrome', |
2605
|
|
|
|
|
|
|
'DMC-TZ40 90 12' => 'Soft', |
2606
|
|
|
|
|
|
|
}, |
2607
|
|
|
|
|
|
|
}, |
2608
|
|
|
|
|
|
|
); |
2609
|
|
|
|
|
|
|
|
2610
|
|
|
|
|
|
|
# add our composite tags |
2611
|
|
|
|
|
|
|
Image::ExifTool::AddCompositeTags('Image::ExifTool::Panasonic'); |
2612
|
|
|
|
|
|
|
|
2613
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
2614
|
|
|
|
|
|
|
# Inverse conversion for Leica M9 lens codes |
2615
|
|
|
|
|
|
|
# Inputs: 0) value |
2616
|
|
|
|
|
|
|
# Returns: Converted value, or undef on error |
2617
|
|
|
|
|
|
|
sub LensTypeConvInv($) |
2618
|
|
|
|
|
|
|
{ |
2619
|
0
|
|
|
0
|
0
|
0
|
my $val = shift; |
2620
|
0
|
0
|
|
|
|
0
|
if ($val =~ /^(\d+) (\d+)$/) { |
|
|
0
|
|
|
|
|
|
2621
|
0
|
|
|
|
|
0
|
return ($1 << 2) + ($2 & 0x03); |
2622
|
|
|
|
|
|
|
} elsif ($val =~ /^\d+$/) { |
2623
|
0
|
|
|
|
|
0
|
my $bits = $frameSelectorBits{$val}; |
2624
|
0
|
0
|
|
|
|
0
|
return undef unless defined $bits; |
2625
|
0
|
|
|
|
|
0
|
return ($val << 2) | $bits; |
2626
|
|
|
|
|
|
|
} else { |
2627
|
0
|
|
|
|
|
0
|
return undef; |
2628
|
|
|
|
|
|
|
} |
2629
|
|
|
|
|
|
|
} |
2630
|
|
|
|
|
|
|
|
2631
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
2632
|
|
|
|
|
|
|
# Convert Leica Kelvin white balance |
2633
|
|
|
|
|
|
|
# Inputs: 0) value, 1) flag to perform inverse conversion |
2634
|
|
|
|
|
|
|
# Returns: Converted value, or undef on error |
2635
|
|
|
|
|
|
|
sub WhiteBalanceConv($;$$) |
2636
|
|
|
|
|
|
|
{ |
2637
|
2
|
|
|
2
|
0
|
11
|
my ($val, $inv) = @_; |
2638
|
2
|
50
|
|
|
|
12
|
if ($inv) { |
2639
|
2
|
50
|
|
|
|
14
|
return $1 + 0x8000 if $val =~ /(\d+)/; |
2640
|
|
|
|
|
|
|
} else { |
2641
|
0
|
0
|
|
|
|
0
|
return ($val - 0x8000) . ' Kelvin' if $val > 0x8000; |
2642
|
|
|
|
|
|
|
} |
2643
|
2
|
|
|
|
|
13
|
return undef; |
2644
|
|
|
|
|
|
|
} |
2645
|
|
|
|
|
|
|
|
2646
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
2647
|
|
|
|
|
|
|
# Process Leica makernotes in LEIC atom of MP4 videos (Leica T and X Vario) |
2648
|
|
|
|
|
|
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref |
2649
|
|
|
|
|
|
|
# Returns: 1 on success |
2650
|
|
|
|
|
|
|
sub ProcessLeicaLEIC($$$) |
2651
|
|
|
|
|
|
|
{ |
2652
|
0
|
|
|
0
|
0
|
|
my ($et, $dirInfo, $tagTablePtr) = @_; |
2653
|
0
|
|
|
|
|
|
my $dataPt = $$dirInfo{DataPt}; |
2654
|
0
|
|
0
|
|
|
|
my $dirStart = $$dirInfo{DirStart} || 0; |
2655
|
0
|
|
0
|
|
|
|
my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart); |
2656
|
0
|
0
|
|
|
|
|
return 0 if $dirLen < 6; |
2657
|
0
|
|
|
|
|
|
SetByteOrder('II'); |
2658
|
0
|
|
|
|
|
|
my $numEntries = Get16u($dataPt, $dirStart); |
2659
|
0
|
0
|
0
|
|
|
|
return 0 if $numEntries < 1 or $numEntries > 255; |
2660
|
0
|
|
|
|
|
|
my $size = Get32u($dataPt, $dirStart + 2); |
2661
|
0
|
0
|
0
|
|
|
|
return 0 if $size < $numEntries * 12 or $size + 6 > $dirLen; |
2662
|
|
|
|
|
|
|
# the Leica programmers want to make things difficult, so they store |
2663
|
|
|
|
|
|
|
# the entry count before the directory size, making it impossible to |
2664
|
|
|
|
|
|
|
# process as a standard TIFF IFD without a bit of reorganization... |
2665
|
0
|
|
|
|
|
|
Set16u($numEntries, $dataPt, $dirStart + 4); |
2666
|
0
|
|
|
|
|
|
my %dirInfo = %$dirInfo; |
2667
|
0
|
|
|
|
|
|
$dirInfo{DirStart} = $dirStart + 4; |
2668
|
0
|
|
|
|
|
|
$dirInfo{DirLen} = $size - 4; |
2669
|
0
|
|
|
|
|
|
$dirInfo{DataPos} -= $dirStart; |
2670
|
0
|
|
|
|
|
|
$dirInfo{Base} += $dirStart; |
2671
|
0
|
|
|
|
|
|
return Image::ExifTool::Exif::ProcessExif($et, \%dirInfo, $tagTablePtr); |
2672
|
0
|
|
|
|
|
|
return 1; |
2673
|
|
|
|
|
|
|
} |
2674
|
|
|
|
|
|
|
|
2675
|
|
|
|
|
|
|
#------------------------------------------------------------------------------ |
2676
|
|
|
|
|
|
|
# Process MakerNote trailer written by Leica S2 |
2677
|
|
|
|
|
|
|
# Inputs: 0) ExifTool object ref, 1) new absolute position of Leica trailer when writing |
2678
|
|
|
|
|
|
|
# Returns: On success: 1 when reading, directory data when writing; otherwise undef |
2679
|
|
|
|
|
|
|
# Notes: |
2680
|
|
|
|
|
|
|
# - may be called twice for a file if the first call doesn't succeed |
2681
|
|
|
|
|
|
|
# - must leave RAF position unchanged |
2682
|
|
|
|
|
|
|
# - uses information from LeicaTrailer member: |
2683
|
|
|
|
|
|
|
# TagInfo = tag info ref for MakerNote SubDirectory |
2684
|
|
|
|
|
|
|
# Offset/Size = value offset/size from MakerNote IFD |
2685
|
|
|
|
|
|
|
# TrailStart/TrailLen = actual JPEG trailer position/size (2nd call only) |
2686
|
|
|
|
|
|
|
# - deletes LeicaTrailer member and sets LeicaTrailerPos when successful |
2687
|
|
|
|
|
|
|
sub ProcessLeicaTrailer($;$) |
2688
|
|
|
|
|
|
|
{ |
2689
|
0
|
|
|
0
|
0
|
|
my ($et, $newPos) = @_; |
2690
|
0
|
|
|
|
|
|
my $trail = $$et{LeicaTrailer}; |
2691
|
0
|
|
|
|
|
|
my $raf = $$et{RAF}; |
2692
|
0
|
|
|
|
|
|
my $trailPos = $$trail{TrailPos}; |
2693
|
0
|
|
0
|
|
|
|
my $pos = $trailPos || $$trail{Offset}; |
2694
|
0
|
|
0
|
|
|
|
my $len = $$trail{TrailLen} || $$trail{Size}; |
2695
|
0
|
|
|
|
|
|
my ($buff, $result, %tagPtr); |
2696
|
|
|
|
|
|
|
|
2697
|
0
|
0
|
|
|
|
|
delete $$et{LeicaTrailer} if $trailPos; # done after this |
2698
|
0
|
0
|
|
|
|
|
unless ($len > 0) { |
2699
|
0
|
0
|
|
|
|
|
$et->Warn('Missing Leica MakerNote trailer', 1) if $trailPos; |
2700
|
0
|
|
|
|
|
|
delete $$et{LeicaTrailer}; |
2701
|
0
|
|
|
|
|
|
return undef; |
2702
|
|
|
|
|
|
|
} |
2703
|
0
|
|
|
|
|
|
my $oldPos = $raf->Tell(); |
2704
|
0
|
|
0
|
|
|
|
my $ok = ($raf->Seek($pos, 0) and $raf->Read($buff, $len) == $len); |
2705
|
0
|
|
|
|
|
|
$raf->Seek($oldPos, 0); |
2706
|
0
|
0
|
|
|
|
|
unless ($ok) { |
2707
|
0
|
0
|
|
|
|
|
$et->Warn('Error reading Leica MakerNote trailer', 1) if $trailPos; |
2708
|
0
|
|
|
|
|
|
return undef; |
2709
|
|
|
|
|
|
|
} |
2710
|
|
|
|
|
|
|
# look for Leica MakerNote header (should be at start of |
2711
|
|
|
|
|
|
|
# trailer, but allow up to 256 bytes of garbage just in case) |
2712
|
0
|
0
|
|
|
|
|
if ($buff !~ /^(.{0,256})LEICA\0..../sg) { |
2713
|
0
|
0
|
|
|
|
|
my $what = $trailPos ? 'trailer' : 'offset'; |
2714
|
0
|
|
|
|
|
|
$et->Warn("Invalid Leica MakerNote $what", 1); |
2715
|
0
|
|
|
|
|
|
return undef; |
2716
|
|
|
|
|
|
|
} |
2717
|
0
|
|
|
|
|
|
my $junk = $1; |
2718
|
0
|
|
|
|
|
|
my $start = pos($buff) - 10; |
2719
|
0
|
0
|
0
|
|
|
|
if ($start and not $trailPos) { |
2720
|
0
|
|
|
|
|
|
$et->Warn('Invalid Leica MakerNote offset', 1); |
2721
|
0
|
|
|
|
|
|
return undef; |
2722
|
|
|
|
|
|
|
} |
2723
|
|
|
|
|
|
|
# |
2724
|
|
|
|
|
|
|
# all checks passed -- go ahead and process the trailer now |
2725
|
|
|
|
|
|
|
# |
2726
|
0
|
|
|
|
|
|
my $hdrLen = 8; |
2727
|
0
|
|
|
|
|
|
my $dirStart = $start + $hdrLen; |
2728
|
0
|
|
|
|
|
|
my $tagInfo = $$trail{TagInfo}; |
2729
|
0
|
0
|
|
|
|
|
if ($$et{HTML_DUMP}) { |
|
|
0
|
|
|
|
|
|
2730
|
0
|
|
|
|
|
|
my $name = $$tagInfo{Name}; |
2731
|
0
|
|
|
|
|
|
$et->HDump($pos+$start, $len-$start, "$name value", 'Leica MakerNote trailer', 4); |
2732
|
0
|
|
|
|
|
|
$et->HDump($pos+$start, $hdrLen, "MakerNotes header", $name); |
2733
|
|
|
|
|
|
|
} elsif ($et->Options('Verbose')) { |
2734
|
0
|
|
|
|
|
|
my $where = sprintf('at offset 0x%x', $pos); |
2735
|
0
|
|
|
|
|
|
$et->VPrint(0, "Leica MakerNote trailer ($len bytes $where):\n"); |
2736
|
|
|
|
|
|
|
} |
2737
|
|
|
|
|
|
|
# delete LeicaTrailer member so we don't try to process it again |
2738
|
0
|
|
|
|
|
|
delete $$et{LeicaTrailer}; |
2739
|
0
|
|
|
|
|
|
$$et{LeicaTrailerPos} = $pos + $start; # return actual start position of Leica trailer |
2740
|
|
|
|
|
|
|
|
2741
|
0
|
|
|
|
|
|
my $oldOrder = GetByteOrder(); |
2742
|
0
|
|
|
|
|
|
my $num = Get16u(\$buff, $dirStart); # get entry count |
2743
|
0
|
0
|
|
|
|
|
ToggleByteOrder() if ($num>>8) > ($num&0xff); # set byte order |
2744
|
|
|
|
|
|
|
|
2745
|
|
|
|
|
|
|
# use specialized algorithm to automatically fix offsets |
2746
|
0
|
|
|
|
|
|
my $valStart = $dirStart + 2 + 12 * $num + 4; |
2747
|
0
|
|
|
|
|
|
my $fix = 0; |
2748
|
0
|
0
|
|
|
|
|
if ($valStart < $len) { |
2749
|
0
|
|
|
|
|
|
my $valBlock = Image::ExifTool::MakerNotes::GetValueBlocks(\$buff, $dirStart, \%tagPtr); |
2750
|
|
|
|
|
|
|
# find the minimum offset (excluding the PreviewImage tag 0x300 and 0x301) |
2751
|
0
|
|
|
|
|
|
my $minPtr; |
2752
|
0
|
|
|
|
|
|
foreach (keys %tagPtr) { |
2753
|
0
|
|
|
|
|
|
my $ptr = $tagPtr{$_}; |
2754
|
0
|
0
|
0
|
|
|
|
next if $_ == 0x300 or $_ == 0x301 or not $ptr or $ptr == 0xffffffff; |
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
2755
|
0
|
0
|
0
|
|
|
|
$minPtr = $ptr if not defined $minPtr or $minPtr > $ptr; |
2756
|
|
|
|
|
|
|
} |
2757
|
0
|
0
|
|
|
|
|
if ($minPtr) { |
2758
|
0
|
|
|
|
|
|
my $diff = $minPtr - ($valStart + $pos); |
2759
|
0
|
|
|
|
|
|
pos($buff) = $valStart; |
2760
|
0
|
|
|
|
|
|
my $expect; |
2761
|
0
|
0
|
|
|
|
|
if ($$et{Model} eq 'S2') { |
2762
|
|
|
|
|
|
|
# scan value data for the first non-zero byte |
2763
|
0
|
0
|
|
|
|
|
if ($buff =~ /[^\0]/g) { |
2764
|
0
|
|
|
|
|
|
my $n = pos($buff) - 1 - $valStart; # number of zero bytes |
2765
|
|
|
|
|
|
|
# S2 writes 282 bytes of zeros, exiftool writes none |
2766
|
0
|
0
|
|
|
|
|
$expect = $n >= 282 ? 282 : 0; |
2767
|
|
|
|
|
|
|
} |
2768
|
|
|
|
|
|
|
} else { # M (Type 240) |
2769
|
|
|
|
|
|
|
# scan for the lens type (M writes 114 bytes of garbage first) |
2770
|
0
|
0
|
0
|
|
|
|
if ($buff =~ /\G.{114}([\x20-\x7f]*\0*)/sg and length($1) >= 50) { |
2771
|
0
|
|
|
|
|
|
$expect = 114; |
2772
|
|
|
|
|
|
|
} |
2773
|
|
|
|
|
|
|
} |
2774
|
0
|
|
|
|
|
|
my $fixBase = $et->Options('FixBase'); |
2775
|
0
|
0
|
0
|
|
|
|
if (not defined $expect) { |
|
|
0
|
|
|
|
|
|
2776
|
0
|
|
|
|
|
|
$et->Warn('Unrecognized Leica trailer structure'); |
2777
|
|
|
|
|
|
|
} elsif ($diff != $expect or defined $fixBase) { |
2778
|
0
|
|
|
|
|
|
$fix = $expect - $diff; |
2779
|
0
|
0
|
|
|
|
|
if (defined $fixBase) { |
2780
|
0
|
0
|
|
|
|
|
$fix = $fixBase if $fixBase ne ''; |
2781
|
0
|
|
|
|
|
|
$et->Warn("Adjusted MakerNotes base by $fix",1); |
2782
|
|
|
|
|
|
|
} else { |
2783
|
0
|
|
|
|
|
|
$et->Warn("Possibly incorrect maker notes offsets (fixed by $fix)",1); |
2784
|
|
|
|
|
|
|
} |
2785
|
|
|
|
|
|
|
} |
2786
|
|
|
|
|
|
|
} |
2787
|
|
|
|
|
|
|
} |
2788
|
|
|
|
|
|
|
# generate dirInfo for Leica MakerNote directory |
2789
|
|
|
|
|
|
|
my %dirInfo = ( |
2790
|
|
|
|
|
|
|
Name => $$tagInfo{Name}, |
2791
|
0
|
|
|
|
|
|
Base => $fix, |
2792
|
|
|
|
|
|
|
DataPt => \$buff, |
2793
|
|
|
|
|
|
|
DataPos => $pos - $fix, |
2794
|
|
|
|
|
|
|
DataLen => $len, |
2795
|
|
|
|
|
|
|
DirStart => $dirStart, |
2796
|
|
|
|
|
|
|
DirLen => $len - $dirStart, |
2797
|
|
|
|
|
|
|
DirName => 'MakerNotes', |
2798
|
|
|
|
|
|
|
Parent => 'ExifIFD', |
2799
|
|
|
|
|
|
|
TagInfo => $tagInfo, |
2800
|
|
|
|
|
|
|
); |
2801
|
0
|
|
|
|
|
|
my $tagTablePtr = GetTagTable($$tagInfo{SubDirectory}{TagTable}); |
2802
|
0
|
0
|
|
|
|
|
if ($newPos) { # are we writing? |
2803
|
0
|
0
|
|
|
|
|
if ($$et{Model} ne 'S2') { |
2804
|
0
|
|
|
|
|
|
$et->Warn('Leica MakerNote trailer too messed up to edit. Copying as a block', 1); |
2805
|
0
|
|
|
|
|
|
return $buff; |
2806
|
|
|
|
|
|
|
} |
2807
|
|
|
|
|
|
|
# set position of new MakerNote IFD (+ 8 for Leica MakerNote header) |
2808
|
0
|
|
|
|
|
|
$dirInfo{NewDataPos} = $newPos + $start + 8; |
2809
|
0
|
|
|
|
|
|
$result = $et->WriteDirectory(\%dirInfo, $tagTablePtr); |
2810
|
|
|
|
|
|
|
# write preview image last if necessary and fix up the preview offsets |
2811
|
0
|
|
|
|
|
|
my $previewInfo = $$et{PREVIEW_INFO}; |
2812
|
0
|
|
|
|
|
|
delete $$et{PREVIEW_INFO}; |
2813
|
0
|
0
|
|
|
|
|
if ($result) { |
2814
|
0
|
0
|
|
|
|
|
if ($previewInfo) { |
2815
|
0
|
|
|
|
|
|
my $fixup = $previewInfo->{Fixup}; |
2816
|
|
|
|
|
|
|
# set preview offset (relative to start of makernotes, + 8 for makernote header) |
2817
|
0
|
|
|
|
|
|
$fixup->SetMarkerPointers(\$result, 'PreviewImage', length($result) + 8); |
2818
|
0
|
|
|
|
|
|
$result .= $$previewInfo{Data}; |
2819
|
|
|
|
|
|
|
} |
2820
|
0
|
|
|
|
|
|
return $junk . substr($buff, $start, $hdrLen) . $result; |
2821
|
|
|
|
|
|
|
} |
2822
|
|
|
|
|
|
|
} else { |
2823
|
|
|
|
|
|
|
# extract information |
2824
|
0
|
|
|
|
|
|
$result = $et->ProcessDirectory(\%dirInfo, $tagTablePtr); |
2825
|
|
|
|
|
|
|
# also extract as a block if necessary |
2826
|
0
|
0
|
0
|
|
|
|
if ($et->Options('MakerNotes') or |
2827
|
|
|
|
|
|
|
$$et{REQ_TAG_LOOKUP}{lc($$tagInfo{Name})}) |
2828
|
|
|
|
|
|
|
{ |
2829
|
|
|
|
|
|
|
# makernote header must be included in RebuildMakerNotes call |
2830
|
0
|
|
|
|
|
|
$dirInfo{DirStart} -= 8; |
2831
|
0
|
|
|
|
|
|
$dirInfo{DirLen} += 8; |
2832
|
0
|
|
|
|
|
|
$$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder(); |
2833
|
|
|
|
|
|
|
# rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP}) |
2834
|
0
|
|
|
|
|
|
my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%dirInfo, $tagTablePtr); |
2835
|
0
|
0
|
|
|
|
|
unless (defined $val) { |
2836
|
0
|
0
|
|
|
|
|
$et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4; |
2837
|
0
|
|
|
|
|
|
$val = $buff, |
2838
|
|
|
|
|
|
|
} |
2839
|
0
|
|
|
|
|
|
my $key = $et->FoundTag($tagInfo, $val); |
2840
|
0
|
|
|
|
|
|
$et->SetGroup($key, 'ExifIFD'); |
2841
|
|
|
|
|
|
|
} |
2842
|
|
|
|
|
|
|
} |
2843
|
0
|
|
|
|
|
|
SetByteOrder($oldOrder); |
2844
|
0
|
|
|
|
|
|
return $result; |
2845
|
|
|
|
|
|
|
} |
2846
|
|
|
|
|
|
|
|
2847
|
|
|
|
|
|
|
1; # end |
2848
|
|
|
|
|
|
|
|
2849
|
|
|
|
|
|
|
__END__ |