Coverage Report

Created: 2026-04-12 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/exiv2/src/panasonicmn_int.cpp
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
3
// included header files
4
#include "panasonicmn_int.hpp"
5
#include "i18n.h"  // NLS support.
6
#include "image_int.hpp"
7
#include "tags.hpp"
8
#include "tags_int.hpp"
9
#include "types.hpp"
10
#include "value.hpp"
11
12
// + standard includes
13
#include <cstddef>
14
#include <cstdint>
15
#include <ostream>
16
17
// *****************************************************************************
18
// class member definitions
19
namespace Exiv2::Internal {
20
//! Quality, tag 0x0001
21
constexpr TagDetails panasonicQuality[] = {
22
    {1, N_("TIFF")}, {2, N_("High")},           {3, N_("Normal")},         {6, N_("Very High")},
23
    {7, N_("Raw")},  {9, N_("Motion Picture")}, {11, N_("Full HD Movie")}, {12, N_("4k Movie")},
24
};
25
26
//! WhiteBalance, tag 0x0003
27
constexpr TagDetails panasonicWhiteBalance[] = {
28
    {1, N_("Auto")},  {2, N_("Daylight")},         {3, N_("Cloudy")},  {4, N_("Halogen")}, {5, N_("Manual")},
29
    {8, N_("Flash")}, {10, N_("Black and white")}, {11, N_("Manual")}, {12, N_("Shade")},  {13, N_("Kelvin")},
30
};
31
32
//! FocusMode, tag 0x0007
33
constexpr TagDetails panasonicFocusMode[] = {
34
    {1, N_("Auto")}, {2, N_("Manual")}, {4, N_("Auto, focus button")}, {5, N_("Auto, continuous")}, {6, N_("AF-S")},
35
    {7, N_("AF-C")}, {8, N_("AF-F")},
36
};
37
38
//! ImageStabilizer, tag 0x001a
39
constexpr TagDetails panasonicImageStabilizer[] = {
40
    {2, N_("On, Mode 1")}, {3, N_("Off")}, {4, N_("On, Mode 2")}, {5, N_("Panning")}, {6, N_("On, Mode 3")},
41
};
42
43
//! Macro, tag 0x001c
44
constexpr TagDetails panasonicMacro[] = {
45
    {1, N_("On")},
46
    {2, N_("Off")},
47
    {257, N_("Tele-macro")},
48
    {513, N_("Macro-zoom")},
49
};
50
51
//! ShootingMode, tag 0x001f and SceneMode, tag 0x8001
52
constexpr TagDetails panasonicShootingMode[] = {
53
    {0, N_("Off")},  // only SceneMode
54
    {1, N_("Normal")},
55
    {2, N_("Portrait")},
56
    {3, N_("Scenery")},
57
    {4, N_("Sports")},
58
    {5, N_("Night portrait")},
59
    {6, N_("Program")},
60
    {7, N_("Aperture priority")},
61
    {8, N_("Shutter-speed priority")},
62
    {9, N_("Macro")},
63
    {10, N_("Spot")},
64
    {11, N_("Manual")},
65
    {12, N_("Movie preview")},
66
    {13, N_("Panning")},
67
    {14, N_("Simple")},
68
    {15, N_("Color effects")},
69
    {16, N_("Self Portrait")},
70
    {17, N_("Economy")},
71
    {18, N_("Fireworks")},
72
    {19, N_("Party")},
73
    {20, N_("Snow")},
74
    {21, N_("Night scenery")},
75
    {22, N_("Food")},
76
    {23, N_("Baby")},
77
    {24, N_("Soft skin")},
78
    {25, N_("Candlelight")},
79
    {26, N_("Starry night")},
80
    {27, N_("High sensitivity")},
81
    {28, N_("Panorama assist")},
82
    {29, N_("Underwater")},
83
    {30, N_("Beach")},
84
    {31, N_("Aerial photo")},
85
    {32, N_("Sunset")},
86
    {33, N_("Pet")},
87
    {34, N_("Intelligent ISO")},
88
    {35, N_("Clipboard")},
89
    {36, N_("High speed continuous shooting")},
90
    {37, N_("Intelligent auto")},
91
    {39, N_("Multi-aspect")},
92
    {41, N_("Transform")},
93
    {42, N_("Flash Burst")},
94
    {43, N_("Pin Hole")},
95
    {44, N_("Film Grain")},
96
    {45, N_("My Color")},
97
    {46, N_("Photo Frame")},
98
    {51, N_("HDR")},
99
    {55, N_("Handheld Night Shot")},
100
    {57, N_("3D")},
101
    {59, N_("Creative Control")},
102
    {62, N_("Panorama")},
103
    {63, N_("Glass Through")},
104
    {64, N_("HDR")},
105
    {66, N_("Digital Filter")},
106
    {67, N_("Clear Portrait")},
107
    {68, N_("Silky Skin")},
108
    {69, N_("Backlit Softness")},
109
    {70, N_("Clear in Backlight")},
110
    {71, N_("Relaxing Tone")},
111
    {72, N_("Sweet Child's Face")},
112
    {73, N_("Distinct Scenery")},
113
    {74, N_("Bright Blue Sky")},
114
    {75, N_("Romantic Sunset Glow")},
115
    {76, N_("Vivid Sunset Glow")},
116
    {77, N_("Glistening Water")},
117
    {78, N_("Clear Nightscape")},
118
    {79, N_("Cool Night Sky")},
119
    {80, N_("Warm Glowing Nightscape")},
120
    {81, N_("Artistic Nightscape")},
121
    {82, N_("Glittering Illuminations")},
122
    {83, N_("Clear Night Portrait")},
123
    {84, N_("Soft Image of a Flower")},
124
    {85, N_("Appetizing Food")},
125
    {86, N_("Cute Desert")},
126
    {87, N_("Freeze Animal Motion")},
127
    {88, N_("Clear Sports Shot")},
128
    {89, N_("Monochrome")},
129
    {90, N_("Creative Control")},
130
};
131
132
//! Audio, tag 0x0020
133
constexpr TagDetails panasonicAudio[] = {
134
    {1, N_("Yes")},
135
    {2, N_("No")},
136
    {3, N_("Stereo")},
137
};
138
139
//! ColorEffect, tag 0x0028
140
constexpr TagDetails panasonicColorEffect[] = {
141
    {1, N_("Off")}, {2, N_("Warm")}, {3, N_("Cool")}, {4, N_("Black and white")}, {5, N_("Sepia")}, {6, N_("Happy")},
142
};
143
144
//! BustMode, tag 0x002a
145
constexpr TagDetails panasonicBurstMode[] = {
146
    {0, N_("Off")},
147
    {1, N_("Low/High quality")},
148
    {2, N_("Infinite")},
149
};
150
151
//! Contrast, tag 0x002c
152
constexpr TagDetails panasonicContrast[] = {
153
    {0, N_("Normal")},      {1, N_("Low")},   {2, N_("High")},       {6, N_("Medium low")},
154
    {7, N_("Medium high")}, {256, N_("Low")}, {272, N_("Standard")}, {288, N_("High")},
155
};
156
157
//! NoiseReduction, tag 0x002d
158
constexpr TagDetails panasonicNoiseReduction[] = {
159
    {0, N_("Standard")}, {1, N_("Low (-1)")}, {2, N_("High (+1)")}, {3, N_("Lowest (-2)")}, {4, N_("Highest (+2)")},
160
};
161
162
//! SelfTimer, tag 0x002e
163
constexpr TagDetails panasonicSelfTimer[] = {
164
    {1, N_("Off")},
165
    {2, "10 s"},
166
    {3, "2 s"},
167
    {4, "10 s / 3 pictures"},
168
};
169
170
//! Rotation, tag 0x0030
171
constexpr TagDetails panasonicRotation[] = {
172
    {1, N_("Horizontal (normal)")},
173
    {3, N_("Rotate 180")},
174
    {6, N_("Rotate 90 CW")},
175
    {8, N_("Rotate 270 CW")},
176
};
177
178
//! AFAssistLamp, tag 0x0031
179
constexpr TagDetails panasonicAFAssistLamp[] = {
180
    {1, N_("Fired")},
181
    {2, N_("Enabled but Not Used")},
182
    {3, N_("Disabled but Required")},
183
    {4, N_("Disabled and Not Required")},
184
};
185
186
//! ColorMode, tag 0x0032
187
constexpr TagDetails panasonicColorMode[] = {
188
    {0, N_("Normal")},
189
    {1, N_("Natural")},
190
    {2, N_("Vivid")},
191
};
192
193
//! OpticalZoomMode, tag 0x0034
194
constexpr TagDetails panasonicOpticalZoomMode[] = {
195
    {1, N_("Standard")},
196
    {2, N_("EX optics")},
197
};
198
199
//! ConversionLens, tag 0x0035
200
constexpr TagDetails panasonicConversionLens[] = {
201
    {1, N_("Off")},
202
    {2, N_("Wide")},
203
    {3, N_("Telephoto")},
204
    {4, N_("Macro")},
205
};
206
207
//! WorldTimeLocation, tag 0x003a
208
constexpr TagDetails panasonicWorldTimeLocation[] = {
209
    {1, N_("Home")},
210
    {2, N_("Destination")},
211
};
212
213
//! TextStamp, tag 0x003b, 0x003e, 000x8008 and 0x8009
214
constexpr TagDetails panasonicTextStamp[] = {
215
    {1, N_("Off")},
216
    {2, N_("On")},
217
};
218
219
//! FilmMode, tag 0x0042
220
constexpr TagDetails panasonicFilmMode[] = {
221
    {1, N_("Standard (color)")}, {2, N_("Dynamic (color)")}, {3, N_("Nature (color)")},
222
    {4, N_("Smooth (color)")},   {5, N_("Standard (B&W)")},  {6, N_("Dynamic (B&W)")},
223
    {7, N_("Smooth (B&W)")},     {10, N_("Nostalgic")},      {11, N_("Vibrant")},
224
};
225
226
//! Bracket Settings, tag 0x0045
227
constexpr TagDetails panasonicBracketSettings[] = {
228
    {0, N_("No Bracket")},
229
    {1, N_("3 images, Sequence 0/-/+")},
230
    {2, N_("3 images, Sequence -/0/+")},
231
    {3, N_("5 images, Sequence 0/-/+")},
232
    {4, N_("5 images, Sequence -/0/+")},
233
    {5, N_("7 images, Sequence 0/-/+")},
234
    {6, N_("7 images, Sequence -/0/+")},
235
};
236
237
//! Flash curtain, tag 0x0048
238
constexpr TagDetails panasonicFlashCurtain[] = {
239
    {0, N_("n/a")},
240
    {1, N_("1st")},
241
    {2, N_("2nd")},
242
};
243
244
//! Long Shutter Noise Reduction, tag 0x0049
245
constexpr TagDetails panasonicLongShutterNoiseReduction[] = {
246
    {1, N_("Off")},
247
    {2, N_("On")},
248
};
249
250
//! Intelligent exposure, tag 0x005d
251
constexpr TagDetails panasonicIntelligentExposure[] = {
252
    {0, N_("Off")},
253
    {1, N_("Low")},
254
    {2, N_("Standard")},
255
    {3, N_("High")},
256
};
257
258
//! Flash warning, tag 0x0062
259
constexpr TagDetails panasonicFlashWarning[] = {
260
    {0, N_("No")},
261
    {1, N_("Yes (flash required but disabled")},
262
};
263
264
//! Intelligent resolution, tag 0x0070
265
constexpr TagDetails panasonicIntelligentResolution[] = {
266
    {0, N_("Off")}, {1, N_("Low")}, {2, N_("Standard")}, {3, N_("High")}, {4, N_("Extended")},
267
};
268
269
//! Intelligent D-Range, tag 0x0079
270
constexpr TagDetails panasonicIntelligentDRange[] = {
271
    {0, N_("Off")},
272
    {1, N_("Low")},
273
    {2, N_("Standard")},
274
    {3, N_("High")},
275
};
276
277
//! Clear Retouch, tag 0x007c
278
constexpr TagDetails panasonicClearRetouch[] = {
279
    {0, N_("Off")},
280
    {1, N_("On")},
281
};
282
283
//! Photo Style, tag 0x0089
284
constexpr TagDetails panasonicPhotoStyle[] = {
285
    {0, N_("NoAuto")},  {1, N_("Standard or Custom")}, {2, N_("Vivid")}, {3, N_("Natural")}, {4, N_("Monochrome")},
286
    {5, N_("Scenery")}, {6, N_("Portrait")},
287
};
288
289
//! Shading compensation, tag 0x008a
290
constexpr TagDetails panasonicShadingCompensation[] = {
291
    {0, N_("Off")},
292
    {1, N_("On")},
293
};
294
295
//! Camera orientation, tag 0x008f
296
constexpr TagDetails panasonicCameraOrientation[] = {
297
    {0, N_("Normal")},     {1, N_("Rotate CW")},    {2, N_("Rotate 180")},
298
    {3, N_("Rotate CCW")}, {4, N_("Tilt upwards")}, {5, N_("Tilt downwards")},
299
};
300
301
//! Sweep panorama direction, tag 0x0093
302
constexpr TagDetails panasonicSweepPanoramaDirection[] = {
303
    {0, N_("Off")},           {1, N_("Left to Right")}, {2, N_("Right to Left")},
304
    {3, N_("Top to Bottom")}, {4, N_("Bottom to Top")},
305
};
306
307
//! Timer recording, tag 0x0096
308
constexpr TagDetails panasonicTimerRecording[] = {
309
    {0, N_("Off")},
310
    {1, N_("Time Lapse")},
311
    {2, N_("Stop-Motion Animation")},
312
};
313
314
//! HDR, tag 0x009e
315
constexpr TagDetails panasonicHDR[] = {
316
    {0, N_("Off")},
317
    {100, N_("1 EV")},
318
    {200, N_("2 EV")},
319
    {300, N_("3 EV")},
320
    {32868, N_("1 EV (Auto)")},
321
    {32968, N_("2 EV (Auto)")},
322
    {33068, N_("3 EV (Auto)")},
323
};
324
325
//! Shutter Type, tag 0x009f
326
constexpr TagDetails panasonicShutterType[] = {
327
    {0, N_("Mechanical")},
328
    {1, N_("Electronic")},
329
    {2, N_("Hybrid")},
330
};
331
332
//! Touch AE, tag 0x00ab
333
constexpr TagDetails panasonicTouchAE[] = {
334
    {0, N_("Off")},
335
    {1, N_("On")},
336
};
337
338
//! Flash Fired, tag 0x8007
339
constexpr TagDetails panasonicFlashFired[] = {
340
    {1, N_("No")},
341
    {2, N_("Yes")},
342
};
343
344
// Panasonic MakerNote Tag Info
345
constexpr TagInfo PanasonicMakerNote::tagInfo_[] = {
346
    {0x0001, "Quality", N_("Quality"), N_("Image Quality"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
347
     EXV_PRINT_TAG(panasonicQuality)},
348
    {0x0002, "FirmwareVersion", N_("Firmware Version"), N_("Firmware version"), IfdId::panasonicId,
349
     SectionId::makerTags, undefined, -1, printValue},
350
    {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance setting"), IfdId::panasonicId, SectionId::makerTags,
351
     unsignedShort, -1, EXV_PRINT_TAG(panasonicWhiteBalance)},
352
    {0x0004, "0x0004", "0x0004", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
353
     printValue},
354
    {0x0007, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
355
     -1, EXV_PRINT_TAG(panasonicFocusMode)},
356
    {0x000f, "AFMode", N_("AF Mode"), N_("AF mode"), IfdId::panasonicId, SectionId::makerTags, unsignedByte, -1,
357
     print0x000f},
358
    {0x001a, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::panasonicId,
359
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicImageStabilizer)},
360
    {0x001c, "Macro", N_("Macro"), N_("Macro mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
361
     EXV_PRINT_TAG(panasonicMacro)},
362
    {0x001f, "ShootingMode", N_("Shooting Mode"), N_("Shooting mode"), IfdId::panasonicId, SectionId::makerTags,
363
     unsignedShort, -1, EXV_PRINT_TAG(panasonicShootingMode)},
364
    {0x0020, "Audio", N_("Audio"), N_("Audio"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
365
     EXV_PRINT_TAG(panasonicAudio)},
366
    {0x0021, "DataDump", N_("Data Dump"), N_("Data dump"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
367
     printValue},
368
    {0x0022, "0x0022", "0x0022", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
369
     printValue},
370
    {0x0023, "WhiteBalanceBias", N_("White Balance Bias"), N_("White balance adjustment"), IfdId::panasonicId,
371
     SectionId::makerTags, signedShort, -1, print0x0023},
372
    {0x0024, "FlashBias", N_("FlashBias"), N_("Flash bias"), IfdId::panasonicId, SectionId::makerTags, signedShort, -1,
373
     printValue},
374
    {0x0025, "InternalSerialNumber", N_("Internal Serial Number"),
375
     N_("This number is unique, and contains the date of manufacture, but is not the same as the number printed "
376
        "on "
377
        "the camera body."),
378
     IfdId::panasonicId, SectionId::makerTags, undefined, -1, printPanasonicText},
379
    {0x0026, "ExifVersion", "Exif Version", N_("Exif version"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
380
     printExifVersion},
381
    {0x0027, "0x0027", "0x0027", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
382
     printValue},
383
    {0x0028, "ColorEffect", N_("Color Effect"), N_("Color effect"), IfdId::panasonicId, SectionId::makerTags,
384
     unsignedShort, -1, EXV_PRINT_TAG(panasonicColorEffect)},
385
    {0x0029, "TimeSincePowerOn", "Time since Power On",
386
     N_("Time in 1/100 s from when the camera was powered on to when the image is written to memory card"),
387
     IfdId::panasonicId, SectionId::makerTags, unsignedLong, -1, print0x0029},
388
    {0x002a, "BurstMode", N_("Burst Mode"), N_("Burst mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
389
     -1, EXV_PRINT_TAG(panasonicBurstMode)},
390
    {0x002b, "SequenceNumber", N_("Sequence Number"), N_("Sequence number"), IfdId::panasonicId, SectionId::makerTags,
391
     unsignedLong, -1, printValue},
392
    {0x002c, "Contrast", N_("Contrast"), N_("Contrast setting"), IfdId::panasonicId, SectionId::makerTags,
393
     unsignedShort, -1, EXV_PRINT_TAG(panasonicContrast)},
394
    {0x002d, "NoiseReduction", N_("NoiseReduction"), N_("Noise reduction"), IfdId::panasonicId, SectionId::makerTags,
395
     unsignedShort, -1, EXV_PRINT_TAG(panasonicNoiseReduction)},
396
    {0x002e, "SelfTimer", N_("Self Timer"), N_("Self timer"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
397
     -1, EXV_PRINT_TAG(panasonicSelfTimer)},
398
    {0x002f, "0x002f", "0x002f", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
399
     printValue},
400
    {0x0030, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
401
     EXV_PRINT_TAG(panasonicRotation)},
402
    {0x0031, "AFAssistLamp", N_("AF Assist Lamp"), N_("AF Assist Lamp"), IfdId::panasonicId, SectionId::makerTags,
403
     unsignedShort, -1, EXV_PRINT_TAG(panasonicAFAssistLamp)},
404
    {0x0032, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
405
     -1, EXV_PRINT_TAG(panasonicColorMode)},
406
    {0x0033, "BabyAge1", N_("Baby Age 1"), N_("Baby (or pet) age 1"), IfdId::panasonicId, SectionId::makerTags,
407
     asciiString, -1, print0x0033},
408
    {0x0034, "OpticalZoomMode", N_("Optical Zoom Mode"), N_("Optical zoom mode"), IfdId::panasonicId,
409
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicOpticalZoomMode)},
410
    {0x0035, "ConversionLens", N_("Conversion Lens"), N_("Conversion lens"), IfdId::panasonicId, SectionId::makerTags,
411
     unsignedShort, -1, EXV_PRINT_TAG(panasonicConversionLens)},
412
    {0x0036, "TravelDay", N_("Travel Day"), N_("Travel day"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
413
     -1, print0x0036},
414
    {0x0039, "Contrast2", N_("Contrast 2"), N_("Contrast 2"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
415
     -1, printValue},
416
    {0x003a, "WorldTimeLocation", N_("World Time Location"), N_("World time location"), IfdId::panasonicId,
417
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicWorldTimeLocation)},
418
    {0x003b, "TextStamp1", N_("Text Stamp 1"), N_("Text Stamp 1"), IfdId::panasonicId, SectionId::makerTags,
419
     unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)},
420
    {0x003c, "ProgramISO", N_("Program ISO"), N_("Program ISO"), IfdId::panasonicId, SectionId::makerTags,
421
     unsignedShort, -1, print0x003c},
422
    {0x003d, "AdvancedSceneType", N_("Advanced Scene Type"), N_("Advanced Scene Type"), IfdId::panasonicId,
423
     SectionId::makerTags, unsignedShort, -1, printValue},
424
    {0x003e, "TextStamp2", N_("Text Stamp 2"), N_("Text Stamp 2"), IfdId::panasonicId, SectionId::makerTags,
425
     unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)},
426
    {0x003f, "FacesDetected", N_("Faces detected"), N_("Faces detected"), IfdId::panasonicId, SectionId::makerTags,
427
     unsignedShort, -1, printValue},
428
    {0x0040, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
429
     -1, printValue},
430
    {0x0041, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
431
     printValue},
432
    {0x0042, "FilmMode", N_("Film Mode"), N_("Film mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
433
     EXV_PRINT_TAG(panasonicFilmMode)},
434
    {0x0044, "ColorTempKelvin", N_("Color Temp Kelvin"), N_("Color Temperature in Kelvin"), IfdId::panasonicId,
435
     SectionId::makerTags, unsignedShort, -1, printValue},
436
    {0x0045, "BracketSettings", N_("Bracket Settings"), N_("Bracket Settings"), IfdId::panasonicId,
437
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicBracketSettings)},
438
    {0x0046, "WBAdjustAB", N_("WB Adjust AB"), N_("WB adjust AB. Positive is a shift toward blue."), IfdId::panasonicId,
439
     SectionId::makerTags, unsignedShort, -1, printValue},
440
    {0x0047, "WBAdjustGM", N_("WB Adjust GM"), N_("WBAdjustGM. Positive is a shift toward green."), IfdId::panasonicId,
441
     SectionId::makerTags, unsignedShort, -1, printValue},
442
    {0x0048, "FlashCurtain", N_("Flash Curtain"), N_("Flash Curtain"), IfdId::panasonicId, SectionId::makerTags,
443
     unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashCurtain)},
444
    {0x0049, "LongShutterNoiseReduction", N_("Long Shutter Noise Reduction"), N_("Long Shutter Noise Reduction"),
445
     IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicLongShutterNoiseReduction)},
446
    {0x004b, "ImageWidth", N_("Image width"), N_("Image width"), IfdId::panasonicId, SectionId::makerTags, unsignedLong,
447
     -1, printValue},
448
    {0x004c, "ImageHeight", N_("Image height"), N_("Image height"), IfdId::panasonicId, SectionId::makerTags,
449
     unsignedLong, -1, printValue},
450
    {0x004d, "AFPointPosition", N_("AF Point Position"), N_("AF Point Position"), IfdId::panasonicId,
451
     SectionId::makerTags, unsignedRational, -1, printValue},
452
    {0x004e, "FaceDetInfo", N_("Face detection info"), N_("Face detection info"), IfdId::panasonicId,
453
     SectionId::makerTags, undefined, -1, printValue},
454
    {0x0051, "LensType", N_("Lens Type"), N_("Lens type"), IfdId::panasonicId, SectionId::makerTags, asciiString, -1,
455
     printValue},
456
    {0x0052, "LensSerialNumber", N_("Lens Serial Number"), N_("Lens serial number"), IfdId::panasonicId,
457
     SectionId::makerTags, asciiString, -1, printValue},
458
    {0x0053, "AccessoryType", N_("Accessory Type"), N_("Accessory type"), IfdId::panasonicId, SectionId::makerTags,
459
     asciiString, -1, printValue},
460
    {0x0054, "AccessorySerialNumber", N_("Accessory Serial Number"), N_("Accessory Serial Number"), IfdId::panasonicId,
461
     SectionId::makerTags, asciiString, -1, printValue},
462
    {0x0059, "Transform1", N_("Transform 1"), N_("Transform 1"), IfdId::panasonicId, SectionId::makerTags, undefined,
463
     -1, printValue},
464
    {0x005d, "IntelligentExposure", N_("Intelligent Exposure"), N_("Intelligent Exposure"), IfdId::panasonicId,
465
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentExposure)},
466
    {0x0060, "LensFirmwareVersion", N_("Firmware Version of the Lens"), N_("Firmware Version of the Lens"),
467
     IfdId::panasonicId, SectionId::makerTags, undefined, -1, printValue},
468
    {0x0061, "FaceRecInfo", N_("Face recognition info"), N_("Face recognition info"), IfdId::panasonicId,
469
     SectionId::makerTags, undefined, -1, printValue},
470
    {0x0062, "FlashWarning", N_("Flash Warning"), N_("Flash warning"), IfdId::panasonicId, SectionId::makerTags,
471
     unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashWarning)},
472
    {0x0065, "Title", N_("Title"), N_("Title"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
473
     printPanasonicText},
474
    {0x0066, "BabyName", N_("Baby Name"), N_("Baby name (or pet name)"), IfdId::panasonicId, SectionId::makerTags,
475
     undefined, -1, printPanasonicText},
476
    {0x0067, "Location", N_("Location"), N_("Location"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
477
     printPanasonicText},
478
    {0x0069, "Country", N_("Country"), N_("Country"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
479
     printPanasonicText},
480
    {0x006b, "State", N_("State"), N_("State"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
481
     printPanasonicText},
482
    {0x006d, "City", N_("City"), N_("City"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
483
     printPanasonicText},
484
    {0x006f, "Landmark", N_("Landmark"), N_("Landmark"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
485
     printPanasonicText},
486
    {0x0070, "IntelligentResolution", N_("Intelligent resolution"), N_("Intelligent resolution"), IfdId::panasonicId,
487
     SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicIntelligentResolution)},
488
    {0x0077, "BurstSpeed", N_("Burst Speed"), N_("Burst Speed in pictures per second"), IfdId::panasonicId,
489
     SectionId::makerTags, unsignedShort, -1, printValue},
490
    {0x0079, "IntelligentDRange", N_("Intelligent Dynamic Range"), N_("Intelligent Dynamic Range"), IfdId::panasonicId,
491
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicIntelligentDRange)},
492
    {0x007c, "ClearRetouch", N_("Clear Retouch"), N_("Clear Retouch"), IfdId::panasonicId, SectionId::makerTags,
493
     unsignedShort, -1, EXV_PRINT_TAG(panasonicClearRetouch)},
494
    {0x0080, "City2", N_("City2"), N_("City2"), IfdId::panasonicId, SectionId::makerTags, undefined, -1,
495
     printPanasonicText},
496
    {0x0086, "ManometerPressure", N_("Manometer Pressure"), N_("Manometer pressure"), IfdId::panasonicId,
497
     SectionId::makerTags, unsignedShort, -1, printPressure},
498
    {0x0089, "PhotoStyle", N_("Photo style"), N_("Photo style"), IfdId::panasonicId, SectionId::makerTags,
499
     unsignedShort, -1, EXV_PRINT_TAG(panasonicPhotoStyle)},
500
    {0x008a, "ShadingCompensation", N_("Shading Compensation"), N_("Shading Compensation"), IfdId::panasonicId,
501
     SectionId::makerTags, unsignedShort, -1, EXV_PRINT_TAG(panasonicShadingCompensation)},
502
    {0x008c, "AccelerometerZ", N_("Accelerometer Z"), N_("positive is acceleration upwards"), IfdId::panasonicId,
503
     SectionId::makerTags, unsignedShort, -1, printAccelerometer},
504
    {0x008d, "AccelerometerX", N_("Accelerometer X"), N_("positive is acceleration to the left"), IfdId::panasonicId,
505
     SectionId::makerTags, unsignedShort, -1, printAccelerometer},
506
    {0x008e, "AccelerometerY", N_("Accelerometer Y"), N_("positive is acceleration backwards"), IfdId::panasonicId,
507
     SectionId::makerTags, unsignedShort, -1, printAccelerometer},
508
    {0x008f, "CameraOrientation", N_("Camera Orientation"), N_("Camera Orientation"), IfdId::panasonicId,
509
     SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicCameraOrientation)},
510
    {0x0090, "RollAngle", N_("Roll Angle"), N_("degrees of clockwise camera rotation"), IfdId::panasonicId,
511
     SectionId::makerTags, unsignedShort, -1, printRollAngle},
512
    {0x0091, "PitchAngle", N_("Pitch Angle"), N_("degrees of upwards camera tilt"), IfdId::panasonicId,
513
     SectionId::makerTags, unsignedShort, -1, printPitchAngle},
514
    {0x0093, "SweepPanoramaDirection", N_("Sweep Panorama Direction"), N_("Sweep Panorama Direction"),
515
     IfdId::panasonicId, SectionId::makerTags, unsignedByte, -1, EXV_PRINT_TAG(panasonicSweepPanoramaDirection)},
516
    {0x0094, "PanoramaFieldOfView", N_("Field of View of Panorama"), N_("Field of View of Panorama"),
517
     IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1, printValue},
518
    {0x0096, "TimerRecording", N_("Timer Recording"), N_("Timer Recording"), IfdId::panasonicId, SectionId::makerTags,
519
     unsignedByte, -1, EXV_PRINT_TAG(panasonicTimerRecording)},
520
    {0x009d, "InternalNDFilter", N_("Internal ND Filter"), N_("Internal ND Filter"), IfdId::panasonicId,
521
     SectionId::makerTags, unsignedRational, -1, printValue},
522
    {0x009e, "HDR", N_("HDR"), N_("HDR"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
523
     EXV_PRINT_TAG(panasonicHDR)},
524
    {0x009f, "ShutterType", N_("Shutter Type"), N_("Shutter Type"), IfdId::panasonicId, SectionId::makerTags,
525
     unsignedShort, -1, EXV_PRINT_TAG(panasonicShutterType)},
526
    {0x00a3, "ClearRetouchValue", N_("Clear Retouch Value"), N_("Clear Retouch Value"), IfdId::panasonicId,
527
     SectionId::makerTags, unsignedRational, -1, printValue},
528
    {0x00ab, "TouchAE", N_("TouchAE"), N_("TouchAE"), IfdId::panasonicId, SectionId::makerTags, unsignedShort, -1,
529
     EXV_PRINT_TAG(panasonicTouchAE)},
530
    {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::panasonicId, SectionId::makerTags, undefined,
531
     -1, printValue},
532
    {0x4449, "0x4449", "0x4449", N_("Unknown"), IfdId::panasonicId, SectionId::makerTags, undefined, -1, printValue},
533
    {0x8000, "MakerNoteVersion", N_("MakerNote Version"), N_("MakerNote version"), IfdId::panasonicId,
534
     SectionId::makerTags, undefined, -1, printExifVersion},
535
    {0x8001, "SceneMode", N_("Scene Mode"), N_("Scene mode"), IfdId::panasonicId, SectionId::makerTags, unsignedShort,
536
     -1, EXV_PRINT_TAG(panasonicShootingMode)},
537
    {0x8004, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), IfdId::panasonicId, SectionId::makerTags,
538
     unsignedShort, -1, printValue},
539
    {0x8005, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), IfdId::panasonicId, SectionId::makerTags,
540
     unsignedShort, -1, printValue},
541
    {0x8006, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), IfdId::panasonicId, SectionId::makerTags,
542
     unsignedShort, -1, printValue},
543
    {0x8007, "FlashFired", N_("Flash Fired"), N_("Flash Fired"), IfdId::panasonicId, SectionId::makerTags,
544
     unsignedShort, -1, EXV_PRINT_TAG(panasonicFlashFired)},
545
    {0x8008, "TextStamp3", N_("Text Stamp 3"), N_("Text Stamp 3"), IfdId::panasonicId, SectionId::makerTags,
546
     unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)},
547
    {0x8009, "TextStamp4", N_("Text Stamp 4"), N_("Text Stamp 4"), IfdId::panasonicId, SectionId::makerTags,
548
     unsignedShort, -1, EXV_PRINT_TAG(panasonicTextStamp)},
549
    {0x8010, "BabyAge2", N_("Baby Age 2"), N_("Baby (or pet) age 2"), IfdId::panasonicId, SectionId::makerTags,
550
     asciiString, -1, print0x0033},
551
    {0x8012, "Transform2", N_("Transform 2"), N_("Transform 2"), IfdId::panasonicId, SectionId::makerTags, undefined,
552
     -1, printValue},
553
    // End of list marker
554
    {0xffff, "(UnknownPanasonicMakerNoteTag)", "(UnknownPanasonicMakerNoteTag)", N_("Unknown PanasonicMakerNote tag"),
555
     IfdId::panasonicId, SectionId::makerTags, asciiString, -1, printValue},
556
};
557
558
// tag Focus Mode
559
0
std::ostream& PanasonicMakerNote::print0x000f(std::ostream& os, const Value& value, const ExifData*) {
560
0
  if (value.count() < 2 || value.typeId() != unsignedByte) {
561
0
    return os << value;
562
0
  }
563
0
  const auto l0 = value.toInt64(0);
564
0
  const auto l1 = value.toInt64(1);
565
0
  if (l0 == 0 && l1 == 1)
566
0
    os << _("Spot mode on or 9 area");
567
0
  else if (l0 == 0 && l1 == 16)
568
0
    os << _("Spot mode off or 3-area (high speed)");
569
0
  else if (l0 == 0 && l1 == 23)
570
0
    os << _("23-area");
571
0
  else if (l0 == 0 && l1 == 49)
572
0
    os << _("49-area");
573
0
  else if (l0 == 0 && l1 == 225)
574
0
    os << _("225-area");
575
0
  else if (l0 == 1 && l1 == 0)
576
0
    os << _("Spot focusing");
577
0
  else if (l0 == 1 && l1 == 1)
578
0
    os << _("5-area");
579
0
  else if (l0 == 16 && l1 == 0)
580
0
    os << _("1-area");
581
0
  else if (l0 == 16 && l1 == 16)
582
0
    os << _("1-area (high speed)");
583
0
  else if (l0 == 32 && l1 == 0)
584
0
    os << _("3-area (auto)");
585
0
  else if (l0 == 32 && l1 == 1)
586
0
    os << _("3-area (left)");
587
0
  else if (l0 == 32 && l1 == 2)
588
0
    os << _("3-area (center)");
589
0
  else if (l0 == 32 && l1 == 3)
590
0
    os << _("3-area (right)");
591
0
  else if (l0 == 64 && l1 == 0)
592
0
    os << _("Face Detect");
593
0
  else if (l0 == 128 && l1 == 0)
594
0
    os << _("Spot Focusing 2");
595
0
  else if (l0 == 240 && l1 == 0)
596
0
    os << _("Tracking");
597
0
  else
598
0
    os << value;
599
0
  return os;
600
0
}  // PanasonicMakerNote::print0x000f
601
602
// tag White balance bias
603
0
std::ostream& PanasonicMakerNote::print0x0023(std::ostream& os, const Value& value, const ExifData*) {
604
0
  return os << stringFormat("{:1}{}", value.toInt64() / 3, _(" EV"));
605
0
}  // PanasonicMakerNote::print0x0023
606
607
// Time since power on
608
0
std::ostream& PanasonicMakerNote::print0x0029(std::ostream& os, const Value& value, const ExifData*) {
609
0
  auto time = value.toInt64();
610
0
  return os << stringFormat("{:02}:{:02}:{:02}.{:02}", time / 360000, (time % 360000) / 6000, (time % 6000) / 100,
611
0
                            time % 100);
612
613
0
}  // PanasonicMakerNote::print0x0029
614
615
// baby age
616
0
std::ostream& PanasonicMakerNote::print0x0033(std::ostream& os, const Value& value, const ExifData*) {
617
0
  if (value.toString() == "9999:99:99 00:00:00") {
618
0
    os << N_("not set");
619
0
  } else {
620
0
    os << value;
621
0
  }
622
0
  return os;
623
0
}  // PanasonicMakerNote::print0x0033
624
625
// Travel days
626
0
std::ostream& PanasonicMakerNote::print0x0036(std::ostream& os, const Value& value, const ExifData*) {
627
0
  if (value.toInt64() == 65535)
628
0
    os << N_("not set");
629
0
  else
630
0
    os << value;
631
0
  return os;
632
0
}  // PanasonicMakerNote::print0x0036
633
634
// Program ISO
635
0
std::ostream& PanasonicMakerNote::print0x003c(std::ostream& os, const Value& value, const ExifData*) {
636
0
  switch (value.toInt64()) {
637
0
    case 65534:
638
0
      os << N_("Intelligent ISO");
639
0
      break;
640
0
    case 65535:
641
0
      os << N_("n/a");
642
0
      break;
643
0
    default:
644
0
      os << value;
645
0
      break;
646
0
  }
647
0
  return os;
648
0
}  // PanasonicMakerNote::print0x003c
649
650
0
std::ostream& PanasonicMakerNote::printPanasonicText(std::ostream& os, const Value& value, const ExifData*) {
651
0
  if (value.size() > 0 && value.typeId() == undefined) {
652
0
    for (size_t i = 0; i < value.size(); i++) {
653
0
      if (value.toInt64(i) == 0) {
654
0
        break;
655
0
      }
656
0
      os << static_cast<char>(value.toInt64(i));
657
0
    }
658
0
    return os;
659
0
  }
660
661
0
  return os << value;
662
0
}  // PanasonicMakerNote::printPanasonicText
663
664
// Manometer Pressure
665
0
std::ostream& PanasonicMakerNote::printPressure(std::ostream& os, const Value& value, const ExifData*) {
666
0
  if (value.toInt64() == 65535)
667
0
    os << N_("infinite");
668
0
  else
669
0
    os << value << N_(" hPa");
670
0
  return os;
671
0
}  // PanasonicMakerNote::printPressure
672
673
0
std::ostream& PanasonicMakerNote::printAccelerometer(std::ostream& os, const Value& value, const ExifData*) {
674
  // value is stored as unsigned int, but should be read as int16_t.
675
0
  const auto i = static_cast<int16_t>(value.toInt64());
676
0
  return os << i;
677
0
}  // PanasonicMakerNote::printAccelerometer
678
679
0
std::ostream& PanasonicMakerNote::printRollAngle(std::ostream& os, const Value& value, const ExifData*) {
680
  // value is stored as unsigned int, but should be read as int16_t.
681
0
  const auto i = static_cast<int16_t>(value.toInt64());
682
0
  return os << stringFormat("{:.1f}", i / 10.0);
683
0
}  // PanasonicMakerNote::printRollAngle
684
685
0
std::ostream& PanasonicMakerNote::printPitchAngle(std::ostream& os, const Value& value, const ExifData*) {
686
  // value is stored as unsigned int, but should be read as int16_t.
687
0
  const auto i = static_cast<int16_t>(value.toInt64());
688
0
  return os << stringFormat("{:.1f}", -i / 10.0);
689
0
}  // PanasonicMakerNote::printPitchAngle
690
691
// Panasonic MakerNote Tag Info
692
constexpr TagInfo PanasonicMakerNote::tagInfoRaw_[] = {
693
    {0x0001, "Version", N_("Version"), N_("Panasonic raw version"), IfdId::panaRawId, SectionId::panaRaw, undefined, -1,
694
     printExifVersion},
695
    {0x0002, "SensorWidth", N_("Sensor Width"), N_("Sensor width"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
696
     -1, printValue},
697
    {0x0003, "SensorHeight", N_("Sensor Height"), N_("Sensor height"), IfdId::panaRawId, SectionId::panaRaw,
698
     unsignedShort, -1, printValue},
699
    {0x0004, "SensorTopBorder", N_("Sensor Top Border"), N_("Sensor top border"), IfdId::panaRawId, SectionId::panaRaw,
700
     unsignedShort, -1, printValue},
701
    {0x0005, "SensorLeftBorder", N_("Sensor Left Border"), N_("Sensor left border"), IfdId::panaRawId,
702
     SectionId::panaRaw, unsignedShort, -1, printValue},
703
    {0x0006, "ImageHeight", N_("Image Height"), N_("Image height"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
704
     -1, printValue},
705
    {0x0007, "ImageWidth", N_("Image Width"), N_("Image width"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
706
     -1, printValue},
707
    {0x0011, "RedBalance", N_("Red Balance"), N_("Red balance (found in Digilux 2 RAW images)"), IfdId::panaRawId,
708
     SectionId::panaRaw, unsignedShort, -1, printValue},
709
    {0x0012, "BlueBalance", N_("Blue Balance"), N_("Blue balance"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
710
     -1, printValue},
711
    {0x0017, "ISOSpeed", N_("ISO Speed"), N_("ISO speed setting"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
712
     -1, printValue},
713
    {0x0024, "WBRedLevel", N_("WB Red Level"), N_("WB red level"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
714
     -1, printValue},
715
    {0x0025, "WBGreenLevel", N_("WB Green Level"), N_("WB green level"), IfdId::panaRawId, SectionId::panaRaw,
716
     unsignedShort, -1, printValue},
717
    {0x0026, "WBBlueLevel", N_("WB Blue Level"), N_("WB blue level"), IfdId::panaRawId, SectionId::panaRaw,
718
     unsignedShort, -1, printValue},
719
    {0x002e, "PreviewImage", N_("Preview Image"), N_("Preview image"), IfdId::panaRawId, SectionId::panaRaw, undefined,
720
     -1, printValue},
721
    {0x010f, "Make", N_("Manufacturer"), N_("The manufacturer of the recording equipment"), IfdId::panaRawId,
722
     SectionId::panaRaw, asciiString, -1, printValue},
723
    {0x0110, "Model", N_("Model"), N_("The model name or model number of the equipment"), IfdId::panaRawId,
724
     SectionId::panaRaw, asciiString, -1, printValue},
725
    {0x0111, "StripOffsets", N_("Strip Offsets"), N_("Strip offsets"), IfdId::panaRawId, SectionId::panaRaw,
726
     unsignedLong, -1, printValue},
727
    {0x0112, "Orientation", N_("Orientation"), N_("Orientation"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort,
728
     -1, print0x0112},
729
    {0x0116, "RowsPerStrip", N_("Rows Per Strip"), N_("The number of rows per strip"), IfdId::panaRawId,
730
     SectionId::panaRaw, unsignedShort, -1, printValue},
731
    {0x0117, "StripByteCounts", N_("Strip Byte Counts"), N_("Strip byte counts"), IfdId::panaRawId, SectionId::panaRaw,
732
     unsignedLong, -1, printValue},
733
    {0x0118, "RawDataOffset", N_("Raw Data Offset"), N_("Raw data offset"), IfdId::panaRawId, SectionId::panaRaw,
734
     unsignedLong, -1, printValue},
735
    {0x0119, "DistortionInfo", N_("Distortion Info"), N_("Distortion info"), IfdId::panaRawId, SectionId::panaRaw,
736
     signedShort, -1, printValue},
737
    {0x011c, "Gamma", N_("Gamma"), N_("Gamma"), IfdId::panaRawId, SectionId::panaRaw, unsignedShort, -1, printValue},
738
    {0x013b, "Artist", N_("Artist"), N_("Artist"), IfdId::panaRawId, SectionId::panaRaw, asciiString, -1, printValue},
739
    {0x8298, "Copyright", N_("Copyright"), N_("Copyright"), IfdId::panaRawId, SectionId::panaRaw, asciiString, -1,
740
     printValue},
741
    {0x8769, "ExifTag", N_("Exif IFD Pointer"), N_("A pointer to the Exif IFD"), IfdId::panaRawId, SectionId::panaRaw,
742
     unsignedLong, -1, printValue},
743
    {0x8825, "GPSTag", N_("GPS Info IFD Pointer"), N_("A pointer to the GPS Info IFD"), IfdId::panaRawId,
744
     SectionId::panaRaw, unsignedLong, -1, printValue},
745
    // End of list marker
746
    {0xffff, "(UnknownPanasonicRawTag)", "(UnknownPanasonicRawTag)", N_("Unknown PanasonicRaw tag"), IfdId::panaRawId,
747
     SectionId::panaRaw, asciiString, -1, printValue},
748
};
749
750
}  // namespace Exiv2::Internal