Coverage Report

Created: 2026-01-16 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/exiv2/src/minoltamn_int.cpp
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
3
// included header files
4
#include "minoltamn_int.hpp"
5
#include "exif.hpp"
6
#include "i18n.h"  // NLS support.
7
#include "image_int.hpp"
8
#include "makernote_int.hpp"
9
#include "tags.hpp"
10
#include "tags_int.hpp"
11
#include "value.hpp"
12
13
#include <cstdio>  // popen to call exiftool
14
15
// *****************************************************************************
16
// class member definitions
17
namespace Exiv2::Internal {
18
// -- Standard Minolta Makernotes tags ---------------------------------------------------------------
19
20
//! Lookup table to translate Minolta Std (tag 0x0115) white balance values to readable labels
21
constexpr TagDetails minoltaWhiteBalanceStd0x0115[] = {
22
    {0x00, N_("Auto")},     {0x01, N_("Color Temperature/Color Filter")},
23
    {0x10, N_("Daylight")}, {0x20, N_("Cloudy")},
24
    {0x30, N_("Shade")},    {0x40, N_("Tungsten")},
25
    {0x50, N_("Flash")},    {0x60, N_("Fluorescent")},
26
    {0x70, N_("Custom")},
27
};
28
29
//! Lookup table to translate Minolta color mode values to readable labels
30
constexpr TagDetails minoltaColorMode[] = {
31
    {0, N_("Natural Color")}, {1, N_("Black & White")},   {2, N_("Vivid Color")}, {3, N_("Solarization")},
32
    {4, N_("AdobeRGB")},      {5, N_("Sepia")},           {9, N_("Natural")},     {12, N_("Portrait")},
33
    {13, N_("Natural sRGB")}, {14, N_("Natural+ sRGB")},  {15, N_("Landscape")},  {16, N_("Evening")},
34
    {17, N_("Night Scene")},  {18, N_("Night Portrait")},
35
};
36
37
//! Lookup table to translate Minolta image quality values to readable labels
38
constexpr TagDetails minoltaImageQuality[] = {
39
    {0, N_("Raw")},      {1, N_("Super Fine")}, {2, N_("Fine")},
40
    {3, N_("Standard")}, {4, N_("Economy")},    {5, N_("Extra Fine")},
41
};
42
43
//! Lookup table to translate Minolta image stabilization values
44
constexpr TagDetails minoltaImageStabilization[] = {
45
    {1, N_("Off")},
46
    {5, N_("On")},
47
};
48
49
// Minolta Tag Info
50
constexpr TagInfo MinoltaMakerNote::tagInfo_[] = {
51
    {0x0000, "Version", N_("Makernote Version"), N_("String 'MLT0' (not null terminated)"), IfdId::minoltaId,
52
     SectionId::makerTags, undefined, -1, printValue},
53
    {0x0001, "CameraSettingsStdOld", N_("Camera Settings (Std Old)"),
54
     N_("Standard Camera settings (Old Camera models like D5, D7, S304, and S404)"), IfdId::minoltaId,
55
     SectionId::makerTags, undefined, -1, printValue},
56
    {0x0003, "CameraSettingsStdNew", N_("Camera Settings (Std New)"),
57
     N_("Standard Camera settings (New Camera Models like D7u, D7i, and D7hi)"), IfdId::minoltaId, SectionId::makerTags,
58
     undefined, -1, printValue},
59
    {0x0004, "CameraSettings7D", N_("Camera Settings (7D)"), N_("Camera Settings (for Dynax 7D model)"),
60
     IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue},
61
    {0x0018, "ImageStabilizationData", N_("Image Stabilization Data"), N_("Image stabilization data"), IfdId::minoltaId,
62
     SectionId::makerTags, undefined, -1, printValue},
63
64
    // TODO: Implement WB Info A100 tags decoding.
65
    {0x0020, "WBInfoA100", N_("WB Info A100"), N_("White balance information for the Sony DSLR-A100"), IfdId::minoltaId,
66
     SectionId::makerTags, undefined, -1, printValue},
67
68
    {0x0040, "CompressedImageSize", N_("Compressed Image Size"), N_("Compressed image size"), IfdId::minoltaId,
69
     SectionId::makerTags, unsignedLong, -1, printValue},
70
    {0x0081, "Thumbnail", N_("Thumbnail"), N_("Jpeg thumbnail 640x480 pixels"), IfdId::minoltaId, SectionId::makerTags,
71
     undefined, -1, printValue},
72
    {0x0088, "ThumbnailOffset", N_("Thumbnail Offset"), N_("Offset of the thumbnail"), IfdId::minoltaId,
73
     SectionId::makerTags, unsignedLong, -1, printValue},
74
    {0x0089, "ThumbnailLength", N_("Thumbnail Length"), N_("Size of the thumbnail"), IfdId::minoltaId,
75
     SectionId::makerTags, unsignedLong, -1, printValue},
76
    {0x0100, "SceneMode", N_("Scene Mode"), N_("Scene Mode"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
77
     printMinoltaSonySceneMode},
78
79
    // TODO: for A100, use Sony table from printMinoltaSonyColorMode().
80
    {0x0101, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
81
     EXV_PRINT_TAG(minoltaColorMode)},
82
83
    {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaId, SectionId::makerTags, unsignedLong,
84
     -1, EXV_PRINT_TAG(minoltaImageQuality)},
85
86
    // TODO: Tag 0x0103 : quality or image size (see ExifTool doc).
87
    {0x0103, "0x0103", N_("0x0103"), N_("Unknown"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
88
     printValue},
89
90
    {0x0104, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"),
91
     IfdId::minoltaId, SectionId::makerTags, signedRational, -1, print0x9204},
92
    {0x0105, "Teleconverter", N_("Teleconverter Model"), N_("Teleconverter Model"), IfdId::minoltaId,
93
     SectionId::makerTags, unsignedLong, -1, printMinoltaSonyTeleconverterModel},
94
    {0x0107, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaId,
95
     SectionId::makerTags, unsignedLong, -1, EXV_PRINT_TAG(minoltaImageStabilization)},
96
    {0x0109, "RawAndJpgRecording", N_("RAW+JPG Recording"), N_("RAW and JPG files recording"), IfdId::minoltaId,
97
     SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue},
98
    {0x010a, "ZoneMatching", N_("Zone Matching"), N_("Zone matching"), IfdId::minoltaId, SectionId::makerTags,
99
     unsignedLong, -1, printMinoltaSonyZoneMatching},
100
    {0x010b, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaId,
101
     SectionId::makerTags, unsignedLong, -1, printValue},
102
    {0x010c, "LensID", N_("Lens ID"), N_("Lens identifier"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
103
     printMinoltaSonyLensID},
104
    {0x0111, "ColorCompensationFilter", N_("Color Compensation Filter"),
105
     N_("Color Compensation Filter: negative is green, positive is magenta"), IfdId::minoltaId, SectionId::makerTags,
106
     unsignedLong, -1, printValue},
107
    {0x0112, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White Balance Fine Tune Value"),
108
     IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printValue},
109
    {0x0113, "ImageStabilizationA100", N_("Image Stabilization A100"), N_("Image Stabilization for the Sony DSLR-A100"),
110
     IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, printMinoltaSonyBoolValue},
111
112
    // TODO: implement CameraSettingsA100 tags decoding.
113
    {0x0114, "CameraSettings5D", N_("Camera Settings (5D)"), N_("Camera Settings (for Dynax 5D model)"),
114
     IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue},
115
116
    {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaId, SectionId::makerTags,
117
     unsignedLong, -1, EXV_PRINT_TAG(minoltaWhiteBalanceStd0x0115)},
118
    {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::minoltaId, SectionId::makerTags, undefined,
119
     -1, printValue},
120
    {0x0f00, "CameraSettingsZ1", N_("Camera Settings (Z1)"), N_("Camera Settings (for Z1, DImage X, and F100 models)"),
121
     IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue},
122
    // End of list marker
123
    {0xffff, "(UnknownMinoltaMakerNoteTag)", "(UnknownMinoltaMakerNoteTag)", N_("Unknown Minolta MakerNote tag"),
124
     IfdId::minoltaId, SectionId::makerTags, asciiString, -1, printValue},
125
};
126
127
// -- Standard Minolta camera settings ---------------------------------------------------------------
128
129
//! Lookup table to translate Minolta Std camera settings exposure mode values to readable labels
130
constexpr TagDetails minoltaExposureModeStd[] = {
131
    {0, N_("Program")},
132
    {1, N_("Aperture priority")},
133
    {2, N_("Shutter priority")},
134
    {3, N_("Manual")},
135
};
136
137
//! Lookup table to translate Minolta Std camera settings flash mode values to readable labels
138
constexpr TagDetails minoltaFlashModeStd[] = {
139
    {0, N_("Fill flash")}, {1, N_("Red-eye reduction")}, {2, N_("Rear flash sync")}, {3, N_("Wireless")},
140
    {4, N_("Off")},
141
};
142
143
//! Lookup table to translate Minolta Std camera settings white balance values to readable labels
144
constexpr TagDetails minoltaWhiteBalanceStd[] = {
145
    {0, N_("Auto")},        {1, N_("Daylight")},      {2, N_("Cloudy")},    {3, N_("Tungsten")},  {5, N_("Custom")},
146
    {7, N_("Fluorescent")}, {8, N_("Fluorescent 2")}, {11, N_("Custom 2")}, {12, N_("Custom 3")},
147
};
148
149
//! Lookup table to translate Minolta Std camera settings image size values to readable labels
150
constexpr TagDetails minoltaImageSizeStd[] = {
151
    {0, N_("Full size")}, {1, "1600x1200"}, {2, "1280x960"},  {3, "640x480"},
152
    {6, "2080x1560"},     {7, "2560x1920"}, {8, "3264x2176"},
153
};
154
155
//! Lookup table to translate Minolta Std camera settings image quality values to readable labels
156
constexpr TagDetails minoltaImageQualityStd[] = {
157
    {0, N_("Raw")},      {1, N_("Super fine")}, {2, N_("Fine")},
158
    {3, N_("Standard")}, {4, N_("Economy")},    {5, N_("Extra fine")},
159
};
160
161
//! Lookup table to translate Minolta Std camera settings drive mode values to readable labels
162
constexpr TagDetails minoltaDriveModeStd[] = {
163
    {0, N_("Single Frame")}, {1, N_("Continuous")},     {2, N_("Self-timer")},    {4, N_("Bracketing")},
164
    {5, N_("Interval")},     {6, N_("UHS continuous")}, {7, N_("HS continuous")},
165
};
166
167
//! Lookup table to translate Minolta Std camera settings metering mode values to readable labels
168
constexpr TagDetails minoltaMeteringModeStd[] = {
169
    {0, N_("Multi-segment")},
170
    {1, N_("Center weighted average")},
171
    {2, N_("Spot")},
172
};
173
174
//! Lookup table to translate Minolta Std camera settings digital zoom values to readable labels
175
constexpr TagDetails minoltaDigitalZoomStd[] = {
176
    {0, N_("Off")},
177
    {1, N_("Electronic magnification")},
178
    {2, "2x"},
179
};
180
181
//! Lookup table to translate Minolta Std camera bracket step mode values to readable labels
182
constexpr TagDetails minoltaBracketStepStd[] = {
183
    {0, "1/3 EV"},
184
    {1, "2/3 EV"},
185
    {2, "1 EV"},
186
};
187
188
//! Lookup table to translate Minolta Std camera settings AF points values to readable labels
189
[[maybe_unused]] constexpr TagDetails minoltaAFPointsStd[] = {
190
    {0, N_("Center")}, {1, N_("Top")},         {2, N_("Top-right")}, {3, N_("Right")},    {4, N_("Bottom-right")},
191
    {5, N_("Bottom")}, {6, N_("Bottom-left")}, {7, N_("Left")},      {8, N_("Top-left")},
192
};
193
194
//! Lookup table to translate Minolta Std camera settings flash fired values to readable labels
195
constexpr TagDetails minoltaFlashFired[] = {
196
    {0, N_("Did not fire")},
197
    {1, N_("Fired")},
198
};
199
200
//! Lookup table to translate Minolta Std camera settings sharpness values to readable labels
201
constexpr TagDetails minoltaSharpnessStd[] = {
202
    {0, N_("Hard")},
203
    {1, N_("Normal")},
204
    {2, N_("Soft")},
205
};
206
207
//! Lookup table to translate Minolta Std camera settings subject program values to readable labels
208
constexpr TagDetails minoltaSubjectProgramStd[] = {
209
    {0, N_("None")},           {1, N_("Portrait")}, {2, N_("Text")},
210
    {3, N_("Night portrait")}, {4, N_("Sunset")},   {5, N_("Sports action")},
211
};
212
213
//! Lookup table to translate Minolta Std camera settings ISO settings values to readable labels
214
constexpr TagDetails minoltaISOSettingStd[] = {
215
    {0, "100"}, {1, "200"}, {2, "400"}, {3, "800"}, {4, N_("Auto")}, {5, "64"},
216
};
217
218
//! Lookup table to translate Minolta Std camera settings model values to readable labels
219
constexpr TagDetails minoltaModelStd[] = {
220
    {0, "DiMAGE 7 | X1 | X21 | X31"},
221
    {1, "DiMAGE 5"},
222
    {2, "DiMAGE S304"},
223
    {3, "DiMAGE S404"},
224
    {4, "DiMAGE 7i"},
225
    {5, "DiMAGE 7Hi"},
226
    {6, "DiMAGE A1"},
227
    {7, "DiMAGE A2 | S414"},
228
};
229
230
//! Lookup table to translate Minolta Std camera settings interval mode values to readable labels
231
constexpr TagDetails minoltaIntervalModeStd[] = {
232
    {0, N_("Still image")},
233
    {1, N_("Time-lapse movie")},
234
};
235
236
//! Lookup table to translate Minolta Std camera settings folder name values to readable labels
237
constexpr TagDetails minoltaFolderNameStd[] = {
238
    {0, N_("Standard form")},
239
    {1, N_("Data form")},
240
};
241
242
//! Lookup table to translate Minolta Std camera settings color mode values to readable labels
243
constexpr TagDetails minoltaColorModeStd[] = {
244
    {0, N_("Natural color")}, {1, N_("Black and white")}, {2, N_("Vivid color")},
245
    {3, N_("Solarization")},  {4, N_("Adobe RGB")},
246
};
247
248
//! Lookup table to translate Minolta Std camera settings wide focus zone values to readable labels
249
constexpr TagDetails minoltaWideFocusZoneStd[] = {
250
    {0, N_("No zone")},
251
    {1, N_("Center zone (horizontal orientation)")},
252
    {1, N_("Center zone (vertical orientation)")},
253
    {1, N_("Left zone")},
254
    {4, N_("Right zone")},
255
};
256
257
//! Lookup table to translate Minolta Std camera settings focus mode values to readable labels
258
constexpr TagDetails minoltaFocusModeStd[] = {
259
    {0, N_("Auto focus")},
260
    {1, N_("Manual focus")},
261
};
262
263
//! Lookup table to translate Minolta Std camera settings focus area values to readable labels
264
constexpr TagDetails minoltaFocusAreaStd[] = {
265
    {0, N_("Wide focus (normal)")},
266
    {1, N_("Spot focus")},
267
};
268
269
//! Lookup table to translate Minolta Std camera settings DEC switch position values to readable labels
270
constexpr TagDetails minoltaDECPositionStd[] = {
271
    {0, N_("Exposure")},
272
    {1, N_("Contrast")},
273
    {2, N_("Saturation")},
274
    {3, N_("Filter")},
275
};
276
277
//! Lookup table to translate Minolta Std camera settings color profile values to readable labels
278
constexpr TagDetails minoltaColorProfileStd[] = {
279
    {0, N_("Not embedded")},
280
    {1, N_("Embedded")},
281
};
282
283
//! Lookup table to translate Minolta Std camera settings data Imprint values to readable labels
284
constexpr TagDetails minoltaDataImprintStd[] = {
285
    {0, N_("None")}, {1, "YYYY/MM/DD"}, {2, "MM/DD/HH:MM"}, {3, N_("Text")}, {4, N_("Text + ID#")},
286
};
287
288
//! Lookup table to translate Minolta Std camera settings flash metering values to readable labels
289
constexpr TagDetails minoltaFlashMeteringStd[] = {
290
    {0, N_("ADI (Advanced Distance Integration)")},
291
    {1, N_("Pre-flash TTl")},
292
    {2, N_("Manual flash control")},
293
};
294
295
888
std::ostream& MinoltaMakerNote::printMinoltaExposureSpeedStd(std::ostream& os, const Value& value, const ExifData*) {
296
  // From the PHP JPEG Metadata Toolkit
297
888
  os << (value.toInt64() / 8) - 1;
298
888
  return os;
299
888
}
300
301
888
std::ostream& MinoltaMakerNote::printMinoltaExposureTimeStd(std::ostream& os, const Value& value, const ExifData*) {
302
  // From the PHP JPEG Metadata Toolkit
303
888
  os << (value.toInt64() / 8) - 6;
304
888
  return os;
305
888
}
306
307
852
std::ostream& MinoltaMakerNote::printMinoltaFNumberStd(std::ostream& os, const Value& value, const ExifData*) {
308
  // From the PHP JPEG Metadata Toolkit
309
852
  os << (value.toInt64() / 8) - 1;
310
852
  return os;
311
852
}
312
313
std::ostream& MinoltaMakerNote::printMinoltaExposureCompensationStd(std::ostream& os, const Value& value,
314
844
                                                                    const ExifData*) {
315
  // From the PHP JPEG Metadata Toolkit
316
844
  os << value.toInt64() / 256;
317
844
  return os;
318
844
}
319
320
840
std::ostream& MinoltaMakerNote::printMinoltaFocalLengthStd(std::ostream& os, const Value& value, const ExifData*) {
321
  // From the PHP JPEG Metadata Toolkit
322
840
  os << (value.toInt64() / 3) - 2;
323
840
  return os;
324
840
}
325
326
838
std::ostream& MinoltaMakerNote::printMinoltaDateStd(std::ostream& os, const Value& value, const ExifData*) {
327
  // From the PHP JPEG Metadata Toolkit
328
838
  auto val = value.toInt64();
329
838
  os << stringFormat("{}:{:02}:{:02}", val / 65536, (val % 65536) / 256, val % 256);
330
838
  return os;
331
838
}
332
333
804
std::ostream& MinoltaMakerNote::printMinoltaTimeStd(std::ostream& os, const Value& value, const ExifData*) {
334
  // From the PHP JPEG Metadata Toolkit
335
804
  auto val = value.toInt64();
336
804
  os << stringFormat("{:02}:{:02}:{:02}", val / 65536, (val % 65536) / 256, val % 256);
337
804
  return os;
338
804
}
339
340
std::ostream& MinoltaMakerNote::printMinoltaFlashExposureCompStd(std::ostream& os, const Value& value,
341
794
                                                                 const ExifData*) {
342
  // From the PHP JPEG Metadata Toolkit
343
794
  os << (value.toInt64() - 6) / 3;
344
794
  return os;
345
794
}
346
347
2.39k
std::ostream& MinoltaMakerNote::printMinoltaWhiteBalanceStd(std::ostream& os, const Value& value, const ExifData*) {
348
  // From the PHP JPEG Metadata Toolkit
349
2.39k
  os << value.toInt64() / 256;
350
2.39k
  return os;
351
2.39k
}
352
353
784
std::ostream& MinoltaMakerNote::printMinoltaBrightnessStd(std::ostream& os, const Value& value, const ExifData*) {
354
  // From the PHP JPEG Metadata Toolkit
355
784
  os << (value.toInt64() / 8) - 6;
356
784
  return os;
357
784
}
358
359
// Minolta Standard Camera Settings Tag Info (Old and New)
360
constexpr TagInfo MinoltaMakerNote::tagInfoCsStd_[] = {
361
    {0x0001, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCsNewId, SectionId::makerTags,
362
     unsignedLong, 1, EXV_PRINT_TAG(minoltaExposureModeStd)},
363
    {0x0002, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
364
     1, EXV_PRINT_TAG(minoltaFlashModeStd)},
365
    {0x0003, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCsNewId, SectionId::makerTags,
366
     unsignedLong, 1, EXV_PRINT_TAG(minoltaWhiteBalanceStd)},
367
    {0x0004, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
368
     1, EXV_PRINT_TAG(minoltaImageSizeStd)},
369
    {0x0005, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCsNewId, SectionId::makerTags,
370
     unsignedLong, 1, EXV_PRINT_TAG(minoltaImageQualityStd)},
371
    {0x0006, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
372
     1, EXV_PRINT_TAG(minoltaDriveModeStd)},
373
    {0x0007, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::minoltaCsNewId, SectionId::makerTags,
374
     unsignedLong, 1, EXV_PRINT_TAG(minoltaMeteringModeStd)},
375
    {0x0008, "ISO", N_("ISO"), N_("ISO Value"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1,
376
     printMinoltaExposureSpeedStd},
377
    {0x0009, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCsNewId, SectionId::makerTags,
378
     unsignedLong, 1, printMinoltaExposureTimeStd},
379
    {0x000A, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1,
380
     printMinoltaFNumberStd},
381
    {0x000B, "MacroMode", N_("Macro Mode"), N_("Macro mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
382
     1, printMinoltaSonyBoolValue},
383
    {0x000C, "DigitalZoom", N_("Digital Zoom"), N_("Digital zoom"), IfdId::minoltaCsNewId, SectionId::makerTags,
384
     unsignedLong, 1, EXV_PRINT_TAG(minoltaDigitalZoomStd)},
385
    {0x000D, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCsNewId,
386
     SectionId::makerTags, unsignedLong, 1, printMinoltaExposureCompensationStd},
387
    {0x000E, "BracketStep", N_("Bracket Step"), N_("Bracket step"), IfdId::minoltaCsNewId, SectionId::makerTags,
388
     unsignedLong, 1, EXV_PRINT_TAG(minoltaBracketStepStd)},
389
    {0x0010, "IntervalLength", N_("Interval Length"), N_("Interval length"), IfdId::minoltaCsNewId,
390
     SectionId::makerTags, unsignedLong, 1, printValue},
391
    {0x0011, "IntervalNumber", N_("Interval Number"), N_("Interval number"), IfdId::minoltaCsNewId,
392
     SectionId::makerTags, unsignedLong, 1, printValue},
393
    {0x0012, "FocalLength", N_("Focal Length"), N_("Focal length"), IfdId::minoltaCsNewId, SectionId::makerTags,
394
     unsignedLong, 1, printMinoltaFocalLengthStd},
395
    {0x0013, "FocusDistance", N_("Focus Distance"), N_("Focus distance"), IfdId::minoltaCsNewId, SectionId::makerTags,
396
     unsignedLong, 1, printValue},
397
    {0x0014, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCsNewId, SectionId::makerTags,
398
     unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)},
399
    {0x0015, "MinoltaDate", N_("Minolta Date"), N_("Minolta date"), IfdId::minoltaCsNewId, SectionId::makerTags,
400
     unsignedLong, 1, printMinoltaDateStd},
401
    {0x0016, "MinoltaTime", N_("Minolta Time"), N_("Minolta time"), IfdId::minoltaCsNewId, SectionId::makerTags,
402
     unsignedLong, 1, printMinoltaTimeStd},
403
    {0x0017, "MaxAperture", N_("Max Aperture"), N_("Max aperture"), IfdId::minoltaCsNewId, SectionId::makerTags,
404
     unsignedLong, 1, printValue},
405
    {0x001A, "FileNumberMemory", N_("File Number Memory"), N_("File number memory"), IfdId::minoltaCsNewId,
406
     SectionId::makerTags, unsignedLong, 1, printMinoltaSonyBoolValue},
407
    {0x001B, "LastFileNumber", N_("Last Image Number"), N_("Last image number"), IfdId::minoltaCsNewId,
408
     SectionId::makerTags, unsignedLong, 1, printValue},
409
    {0x001C, "ColorBalanceRed", N_("Color Balance Red"), N_("Color balance red"), IfdId::minoltaCsNewId,
410
     SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd},
411
    {0x001D, "ColorBalanceGreen", N_("Color Balance Green"), N_("Color balance green"), IfdId::minoltaCsNewId,
412
     SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd},
413
    {0x001E, "ColorBalanceBlue", N_("Color Balance Blue"), N_("Color balance blue"), IfdId::minoltaCsNewId,
414
     SectionId::makerTags, unsignedLong, 1, printMinoltaWhiteBalanceStd},
415
    {0x001F, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCsNewId, SectionId::makerTags,
416
     unsignedLong, 1, printValue},
417
    {0x0020, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1,
418
     printValue},
419
    {0x0021, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
420
     1, EXV_PRINT_TAG(minoltaSharpnessStd)},
421
    {0x0022, "SubjectProgram", N_("Subject Program"), N_("Subject program"), IfdId::minoltaCsNewId,
422
     SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(minoltaSubjectProgramStd)},
423
    {0x0023, "FlashExposureComp", N_("Flash Exposure Compensation"), N_("Flash exposure compensation in EV"),
424
     IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printMinoltaFlashExposureCompStd},
425
    {0x0024, "ISOSetting", N_("ISO Settings"), N_("ISO setting"), IfdId::minoltaCsNewId, SectionId::makerTags,
426
     unsignedLong, 1, EXV_PRINT_TAG(minoltaISOSettingStd)},
427
    {0x0025, "MinoltaModel", N_("Minolta Model"), N_("Minolta model"), IfdId::minoltaCsNewId, SectionId::makerTags,
428
     unsignedLong, 1, EXV_PRINT_TAG(minoltaModelStd)},
429
    {0x0026, "IntervalMode", N_("Interval Mode"), N_("Interval mode"), IfdId::minoltaCsNewId, SectionId::makerTags,
430
     unsignedLong, 1, EXV_PRINT_TAG(minoltaIntervalModeStd)},
431
    {0x0027, "FolderName", N_("Folder Name"), N_("Folder name"), IfdId::minoltaCsNewId, SectionId::makerTags,
432
     unsignedLong, 1, EXV_PRINT_TAG(minoltaFolderNameStd)},
433
    {0x0028, "ColorMode", N_("ColorMode"), N_("ColorMode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
434
     1, EXV_PRINT_TAG(minoltaColorModeStd)},
435
    {0x0029, "ColorFilter", N_("Color Filter"), N_("Color filter"), IfdId::minoltaCsNewId, SectionId::makerTags,
436
     unsignedLong, 1, printValue},
437
    {0x002A, "BWFilter", N_("Black and White Filter"), N_("Black and white filter"), IfdId::minoltaCsNewId,
438
     SectionId::makerTags, unsignedLong, 1, printValue},
439
    {0x002B, "Internal Flash", N_("Internal Flash"), N_("Internal Flash"), IfdId::minoltaCsNewId, SectionId::makerTags,
440
     unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)},
441
    {0x002C, "Brightness", N_("Brightness"), N_("Brightness"), IfdId::minoltaCsNewId, SectionId::makerTags,
442
     unsignedLong, 1, printMinoltaBrightnessStd},
443
    {0x002D, "SpotFocusPointX", N_("Spot Focus Point X"), N_("Spot focus point X"), IfdId::minoltaCsNewId,
444
     SectionId::makerTags, unsignedLong, 1, printValue},
445
    {0x002E, "SpotFocusPointY", N_("Spot Focus Point Y"), N_("Spot focus point Y"), IfdId::minoltaCsNewId,
446
     SectionId::makerTags, unsignedLong, 1, printValue},
447
    {0x002F, "WideFocusZone", N_("Wide Focus Zone"), N_("Wide focus zone"), IfdId::minoltaCsNewId, SectionId::makerTags,
448
     unsignedLong, 1, EXV_PRINT_TAG(minoltaWideFocusZoneStd)},
449
    {0x0030, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
450
     1, EXV_PRINT_TAG(minoltaFocusModeStd)},
451
    {0x0031, "FocusArea", N_("Focus area"), N_("Focus area"), IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong,
452
     1, EXV_PRINT_TAG(minoltaFocusAreaStd)},
453
    {0x0032, "DECPosition", N_("DEC Switch Position"), N_("DEC switch position"), IfdId::minoltaCsNewId,
454
     SectionId::makerTags, unsignedLong, 1, EXV_PRINT_TAG(minoltaDECPositionStd)},
455
    {0x0033, "ColorProfile", N_("Color Profile"), N_("Color profile"), IfdId::minoltaCsNewId, SectionId::makerTags,
456
     unsignedLong, 1, EXV_PRINT_TAG(minoltaColorProfileStd)},
457
    {0x0034, "DataImprint", N_("Data Imprint"), N_("Data Imprint"), IfdId::minoltaCsNewId, SectionId::makerTags,
458
     unsignedLong, 1, EXV_PRINT_TAG(minoltaDataImprintStd)},
459
    {0x003F, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), IfdId::minoltaCsNewId, SectionId::makerTags,
460
     unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashMeteringStd)},
461
    // End of list marker
462
    {0xffff, "(UnknownMinoltaCsStdTag)", "(UnknownMinoltaCsStdTag)", N_("Unknown Minolta Camera Settings tag"),
463
     IfdId::minoltaCsNewId, SectionId::makerTags, unsignedLong, 1, printValue},
464
};
465
466
// -- Minolta Dynax 7D camera settings ---------------------------------------------------------------
467
468
//! Lookup table to translate Minolta Dynax 7D camera settings exposure mode values to readable labels
469
constexpr TagDetails minoltaExposureMode7D[] = {
470
    {0, N_("Program")}, {1, N_("Aperture priority")}, {2, N_("Shutter priority")}, {3, N_("Manual")},
471
    {4, N_("Auto")},    {5, N_("Program-shift A")},   {6, N_("Program-shift S")},
472
};
473
474
//! Lookup table to translate Minolta Dynax 7D camera settings image size values to readable labels
475
constexpr TagDetails minoltaImageSize7D[] = {
476
    {0, N_("Large")},
477
    {1, N_("Medium")},
478
    {2, N_("Small")},
479
};
480
481
//! Lookup table to translate Minolta Dynax 7D camera settings image quality values to readable labels
482
constexpr TagDetails minoltaImageQuality7D[] = {
483
    {0, N_("Raw")}, {16, N_("Fine")}, {32, N_("Normal")}, {34, N_("Raw+Jpeg")}, {48, N_("Economy")},
484
};
485
486
//! Lookup table to translate Minolta Dynax 7D camera settings white balance values to readable labels
487
constexpr TagDetails minoltaWhiteBalance7D[] = {
488
    {0, N_("Auto")},     {1, N_("Daylight")},    {2, N_("Shade")},    {3, N_("Cloudy")},
489
    {4, N_("Tungsten")}, {5, N_("Fluorescent")}, {256, N_("Kelvin")}, {512, N_("Manual")},
490
};
491
492
//! Lookup table to translate Minolta Dynax 7D camera settings focus mode values to readable labels
493
constexpr TagDetails minoltaFocusMode7D[] = {
494
    {0, N_("Single-shot AF")},
495
    {1, N_("Continuous AF")},
496
    {3, N_("Manual")},
497
    {4, N_("Automatic AF")},
498
};
499
500
//! Lookup table to translate Minolta Dynax 7D camera settings AF points values to readable labels
501
constexpr TagDetails minoltaAFPoints7D[] = {
502
    {1, N_("Center")},  {2, N_("Top")},          {4, N_("Top-right")}, {8, N_("Right")},      {16, N_("Bottom-right")},
503
    {32, N_("Bottom")}, {64, N_("Bottom-left")}, {128, N_("Left")},    {256, N_("Top-left")},
504
};
505
506
//! Lookup table to translate Minolta Dynax 7D camera settings ISO settings values to readable labels
507
constexpr TagDetails minoltaISOSetting7D[] = {
508
    {0, N_("Auto")}, {1, "100"}, {3, "200"}, {4, "400"}, {5, "800"}, {6, "1600"}, {7, "3200"},
509
};
510
511
//! Lookup table to translate Minolta Dynax 7D camera settings color space values to readable labels
512
constexpr TagDetails minoltaColorSpace7D[] = {
513
    {0, N_("sRGB (Natural)")},
514
    {1, N_("sRGB (Natural+)")},
515
    {4, N_("Adobe RGB")},
516
};
517
518
//! Lookup table to translate Minolta Dynax 7D camera settings rotation values to readable labels
519
constexpr TagDetails minoltaRotation7D[] = {
520
    {72, N_("Horizontal (normal)")},
521
    {76, N_("Rotate 90 CW")},
522
    {82, N_("Rotate 270 CW")},
523
};
524
525
// Minolta Dynax 7D Camera Settings Tag Info
526
constexpr TagInfo MinoltaMakerNote::tagInfoCs7D_[] = {
527
    {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCs7DId, SectionId::makerTags,
528
     unsignedShort, 1, EXV_PRINT_TAG(minoltaExposureMode7D)},
529
    {0x0002, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort,
530
     1, EXV_PRINT_TAG(minoltaImageSize7D)},
531
    {0x0003, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCs7DId, SectionId::makerTags,
532
     unsignedShort, 1, EXV_PRINT_TAG(minoltaImageQuality7D)},
533
    {0x0004, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCs7DId, SectionId::makerTags,
534
     unsignedShort, 1, EXV_PRINT_TAG(minoltaWhiteBalance7D)},
535
    {0x000E, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort,
536
     1, EXV_PRINT_TAG(minoltaFocusMode7D)},
537
    {0x0010, "AFPoints", N_("AF Points"), N_("AF points"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1,
538
     EXV_PRINT_TAG(minoltaAFPoints7D)},
539
    {0x0015, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCs7DId, SectionId::makerTags,
540
     unsignedLong, 1, EXV_PRINT_TAG(minoltaFlashFired)},
541
    {0x0016, "FlashMode", N_("Flash Mode"), N_("Flash mode"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort,
542
     1, printValue},
543
    {0x001C, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), IfdId::minoltaCs7DId, SectionId::makerTags,
544
     unsignedShort, 1, EXV_PRINT_TAG(minoltaISOSetting7D)},
545
    {0x001E, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCs7DId,
546
     SectionId::makerTags, signedShort, 1, printValue},
547
    {0x0025, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::minoltaCs7DId, SectionId::makerTags,
548
     unsignedShort, 1, EXV_PRINT_TAG(minoltaColorSpace7D)},
549
    {0x0026, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort,
550
     1, printValue},
551
    {0x0027, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1,
552
     printValue},
553
    {0x0028, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCs7DId, SectionId::makerTags,
554
     unsignedShort, 1, printValue},
555
    {0x002D, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs7DId,
556
     SectionId::makerTags, unsignedShort, 1, printValue},
557
    {0x003F, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaCs7DId,
558
     SectionId::makerTags, signedShort, 1, printValue},
559
    {0x0040, "Hue", N_("Hue"), N_("Hue"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue},
560
    {0x0046, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1,
561
     EXV_PRINT_TAG(minoltaRotation7D)},
562
    {0x0047, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1,
563
     printValue},
564
    {0x0048, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCs7DId, SectionId::makerTags,
565
     unsignedShort, 1, printValue},
566
    // 0x004A is a duplicate than 0x002D.
567
    {0x004A, "FreeMemoryCardImages2", N_("Free Memory Card Images 2"), N_("Free memory card images 2"),
568
     IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue},
569
    {0x005E, "ImageNumber", N_("Image Number"), N_("Image number"), IfdId::minoltaCs7DId, SectionId::makerTags,
570
     unsignedShort, 1, printValue},
571
    {0x0060, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::minoltaCs7DId, SectionId::makerTags,
572
     unsignedShort, 1, printMinoltaSonyBoolValue},
573
    // 0x0062 is a duplicate than 0x005E.
574
    {0x0062, "ImageNumber2", N_("Image Number 2"), N_("Image number 2"), IfdId::minoltaCs7DId, SectionId::makerTags,
575
     unsignedShort, 1, printValue},
576
    {0x0071, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaCs7DId,
577
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
578
    {0x0075, "ZoneMatchingOn", N_("Zone Matching On"), N_("Zone matching on"), IfdId::minoltaCs7DId,
579
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
580
    // End of list marker
581
    {0xffff, "(UnknownMinoltaCs7DTag)", "(UnknownMinoltaCs7DTag)", N_("Unknown Minolta Camera Settings 7D tag"),
582
     IfdId::minoltaCs7DId, SectionId::makerTags, unsignedShort, 1, printValue},
583
};
584
585
// -- Minolta Dynax 5D camera settings ---------------------------------------------------------------
586
587
//! Lookup table to translate Minolta Dynax 5D camera settings exposure mode values to readable labels
588
constexpr TagDetails minoltaExposureMode5D[] = {
589
    {0, N_("Program")},
590
    {1, N_("Aperture priority")},
591
    {2, N_("Shutter priority")},
592
    {3, N_("Manual")},
593
    {4, N_("Auto")},
594
    {5, N_("Program Shift A")},
595
    {6, N_("Program Shift S")},
596
    {0x1013, N_("Portrait")},
597
    {0x1023, N_("Sports")},
598
    {0x1033, N_("Sunset")},
599
    {0x1043, N_("Night View/Portrait")},
600
    {0x1053, N_("Landscape")},
601
    {0x1083, N_("Macro")},
602
};
603
604
//! Lookup table to translate Minolta Dynax 5D camera settings image size values to readable labels
605
constexpr TagDetails minoltaImageSize5D[] = {
606
    {0, N_("Large")},
607
    {1, N_("Medium")},
608
    {2, N_("Small")},
609
};
610
611
//! Lookup table to translate Minolta Dynax 5D camera settings image quality values to readable labels
612
constexpr TagDetails minoltaImageQuality5D[] = {
613
    {0, N_("Raw")}, {16, N_("Fine")}, {32, N_("Normal")}, {34, N_("Raw+Jpeg")}, {48, N_("Economy")},
614
};
615
616
//! Lookup table to translate Minolta Dynax 5D camera settings white balance values to readable labels
617
constexpr TagDetails minoltaWhiteBalance5D[] = {
618
    {0, N_("Auto")},        {1, N_("Daylight")}, {2, N_("Cloudy")},   {3, N_("Shade")},    {4, N_("Tungsten")},
619
    {5, N_("Fluorescent")}, {6, N_("Flash")},    {256, N_("Kelvin")}, {512, N_("Manual")},
620
};
621
622
//! Lookup table to translate Minolta Dynax 5D camera settings metering mode values to readable labels
623
constexpr TagDetails minoltaMeteringMode5D[] = {
624
    {0, N_("Multi-segment")},
625
    {1, N_("Center weighted")},
626
    {2, N_("Spot")},
627
};
628
629
//! Lookup table to translate Minolta Dynax 5D camera settings ISO settings values to readable labels
630
constexpr TagDetails minoltaISOSetting5D[] = {
631
    {0, N_("Auto")},
632
    {1, "100"},
633
    {3, "200"},
634
    {4, "400"},
635
    {5, "800"},
636
    {6, "1600"},
637
    {7, "3200"},
638
    {8, N_("200 (Zone Matching High)")},
639
    {10, N_("80 (Zone Matching Low)")},
640
};
641
642
//! Lookup table to translate Minolta Dynax 5D camera settings color space values to readable labels
643
constexpr TagDetails minoltaColorSpace5D[] = {
644
    {0, N_("sRGB (Natural)")},  {1, N_("sRGB (Natural+)")}, {2, N_("Monochrome")},
645
    {3, N_("Adobe RGB (ICC)")}, {4, N_("Adobe RGB")},
646
};
647
648
//! Lookup table to translate Minolta Dynax 5D camera settings rotation values to readable labels
649
constexpr TagDetails minoltaRotation5D[] = {
650
    {72, N_("Horizontal (normal)")},
651
    {76, N_("Rotate 90 CW")},
652
    {82, N_("Rotate 270 CW")},
653
};
654
655
//! Lookup table to translate Minolta Dynax 5D camera settings focus position values to readable labels
656
constexpr TagDetails minoltaFocusPosition5D[] = {
657
    {0, N_("Wide")},       {1, N_("Central")}, {2, N_("Up")},        {3, N_("Up right")}, {4, N_("Right")},
658
    {5, N_("Down right")}, {6, N_("Down")},    {7, N_("Down left")}, {8, N_("Left")},     {9, N_("Up left")},
659
};
660
661
//! Lookup table to translate Minolta Dynax 5D camera settings focus area values to readable labels
662
constexpr TagDetails minoltaFocusArea5D[] = {
663
    {0, N_("Wide")},
664
    {1, N_("Selection")},
665
    {2, N_("Spot")},
666
};
667
668
//! Lookup table to translate Minolta Dynax 5D camera settings focus mode values to readable labels
669
constexpr TagDetails minoltaAFMode5D[] = {
670
    {0, "AF-A"},
671
    {1, "AF-S"},
672
    {2, "AF-D"},
673
    {3, "DMF"},
674
};
675
676
//! Lookup table to translate Minolta Dynax 5D camera settings picture finish values to readable labels
677
constexpr TagDetails minoltaPictureFinish5D[] = {
678
    {0, N_("Natural")},       {1, N_("Natural+")},        {2, N_("Portrait")},       {3, N_("Wind Scene")},
679
    {4, N_("Evening Scene")}, {5, N_("Night Scene")},     {6, N_("Night Portrait")}, {7, N_("Monochrome")},
680
    {8, N_("Adobe RGB")},     {9, N_("Adobe RGB (ICC)")},
681
};
682
683
//! Method to convert Minolta Dynax 5D exposure manual bias values.
684
std::ostream& MinoltaMakerNote::printMinoltaExposureManualBias5D(std::ostream& os, const Value& value,
685
60
                                                                 const ExifData*) {
686
  // From Xavier Raynaud: the value is converted from 0:256 to -5.33:5.33
687
60
  return os << stringFormat("{:.2f}", static_cast<float>(value.toInt64() - 128) / 24);
688
60
}
689
690
//! Method to convert Minolta Dynax 5D exposure compensation values.
691
std::ostream& MinoltaMakerNote::printMinoltaExposureCompensation5D(std::ostream& os, const Value& value,
692
90
                                                                   const ExifData*) {
693
90
  return os << stringFormat("{:.2f}", static_cast<float>(value.toInt64() - 300) / 100);
694
90
}
695
696
// Minolta Dynax 5D Camera Settings Tag Info
697
constexpr TagInfo MinoltaMakerNote::tagInfoCs5D_[] = {
698
    {0x000A, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::minoltaCs5DId, SectionId::makerTags,
699
     unsignedShort, -1, EXV_PRINT_TAG(minoltaExposureMode5D)},
700
    {0x000C, "ImageSize", N_("Image Size"), N_("Image size"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
701
     -1, EXV_PRINT_TAG(minoltaImageSize5D)},
702
    {0x000D, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaCs5DId, SectionId::makerTags,
703
     unsignedShort, -1, EXV_PRINT_TAG(minoltaImageQuality5D)},
704
    {0x000E, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaCs5DId, SectionId::makerTags,
705
     unsignedShort, -1, EXV_PRINT_TAG(minoltaWhiteBalance5D)},
706
    {0x001A, "FocusPosition", N_("Focus Position"), N_("Focus position"), IfdId::minoltaCs5DId, SectionId::makerTags,
707
     unsignedShort, -1, EXV_PRINT_TAG(minoltaFocusPosition5D)},
708
    {0x001B, "FocusArea", N_("Focus Area"), N_("Focus area"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
709
     -1, EXV_PRINT_TAG(minoltaFocusArea5D)},
710
    {0x001F, "FlashFired", N_("Flash Fired"), N_("Flash fired"), IfdId::minoltaCs5DId, SectionId::makerTags,
711
     unsignedShort, -1, EXV_PRINT_TAG(minoltaFlashFired)},
712
    {0x0025, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::minoltaCs5DId, SectionId::makerTags,
713
     unsignedShort, -1, EXV_PRINT_TAG(minoltaMeteringMode5D)},
714
    {0x0026, "ISOSpeed", N_("ISO Speed Mode"), N_("ISO speed setting"), IfdId::minoltaCs5DId, SectionId::makerTags,
715
     unsignedShort, -1, EXV_PRINT_TAG(minoltaISOSetting5D)},
716
    {0x002F, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::minoltaCs5DId, SectionId::makerTags,
717
     unsignedShort, -1, EXV_PRINT_TAG(minoltaColorSpace5D)},
718
    {0x0030, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
719
     -1, printValue},
720
    {0x0031, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1,
721
     printValue},
722
    {0x0032, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::minoltaCs5DId, SectionId::makerTags,
723
     unsignedShort, -1, printValue},
724
    {0x0035, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::minoltaCs5DId, SectionId::makerTags,
725
     unsignedShort, -1, printValue},
726
    {0x0036, "FNumber", N_("FNumber"), N_("The F-Number"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
727
     -1, printValue},
728
    {0x0037, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"), IfdId::minoltaCs5DId,
729
     SectionId::makerTags, unsignedShort, -1, printValue},
730
    {0x0038, "ExposureRevision", N_("Exposure Revision"), N_("Exposure revision"), IfdId::minoltaCs5DId,
731
     SectionId::makerTags, unsignedShort, -1, printValue},
732
    {0x0048, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
733
     -1, EXV_PRINT_TAG(minoltaFocusModeStd)},
734
    {0x0049, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::minoltaCs5DId,
735
     SectionId::makerTags, signedShort, -1, printValue},
736
    {0x0050, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1,
737
     EXV_PRINT_TAG(minoltaRotation5D)},
738
    {0x0053, "ExposureCompensation", N_("Exposure Compensation"), N_("Exposure compensation"), IfdId::minoltaCs5DId,
739
     SectionId::makerTags, unsignedShort, -1, printMinoltaExposureCompensation5D},
740
    {0x0054, "FreeMemoryCardImages2", N_("Free Memory Card Images 2"), N_("Free memory card images 2"),
741
     IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1, printValue},
742
    {0x0065, "Rotation2", N_("Rotation2"), N_("Rotation2"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort,
743
     -1, printMinoltaSonyRotation},
744
    {0x006E, "Color Temperature", N_("Color Temperature"), N_("Color Temperature"), IfdId::minoltaCs5DId,
745
     SectionId::makerTags, signedShort, -1, printValue},
746
    {0x0071, "PictureFinish", N_("Picture Finish"), N_("Picture Finish"), IfdId::minoltaCs5DId, SectionId::makerTags,
747
     unsignedShort, -1, EXV_PRINT_TAG(minoltaPictureFinish5D)},
748
    {0x0091, "ExposureManualBias", N_("Exposure Manual Bias"), N_("Exposure manual bias"), IfdId::minoltaCs5DId,
749
     SectionId::makerTags, unsignedShort, -1, printMinoltaExposureManualBias5D},
750
    {0x009E, "AFMode", N_("AF Mode"), N_("AF mode"), IfdId::minoltaCs5DId, SectionId::makerTags, unsignedShort, -1,
751
     EXV_PRINT_TAG(minoltaAFMode5D)},
752
    {0x00AE, "ImageNumber", N_("Image Number"), N_("Image number"), IfdId::minoltaCs5DId, SectionId::makerTags,
753
     unsignedShort, -1, printValue},
754
    {0x00B0, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::minoltaCs5DId, SectionId::makerTags,
755
     unsignedShort, -1, printMinoltaSonyBoolValue},
756
    {0x00BD, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::minoltaCs5DId,
757
     SectionId::makerTags, unsignedShort, -1, printMinoltaSonyBoolValue},
758
759
    // From Xavier Raynaud: some notes on missing tags.
760
    // 0x0051 seems to be identical to FNumber (0x0036). An approx. relation between Tag value
761
    // and Fstop is exp(-0.335+value*0.043)
762
    // 0x0052 seems to be identical to ExposureTime (0x0035). An approx. relation between Tag
763
    // value and Exposure time is exp(-4+value*0.085)
764
765
    // End of list marker
766
    {0xFFFF, "(UnknownMinoltaCs5DTag)", "(UnknownMinoltaCs5DTag)", N_("Unknown Minolta Camera Settings 5D tag"),
767
     IfdId::minoltaCs5DId, SectionId::makerTags, invalidTypeId, -1, printValue},
768
};
769
770
// -- Sony A100 camera settings ---------------------------------------------------------------
771
772
//! Lookup table to translate Sony A100 camera settings drive mode 2 values to readable labels
773
constexpr TagDetails sonyDriveMode2A100[] = {
774
    {0, N_("Self-timer 10 sec")},
775
    {1, N_("Continuous")},
776
    {4, N_("Self-timer 2 sec")},
777
    {5, N_("Single Frame")},
778
    {8, N_("White Balance Bracketing Low")},
779
    {9, N_("White Balance Bracketing High")},
780
    {770, N_("Single-frame Bracketing Low")},
781
    {771, N_("Continuous Bracketing Low")},
782
    {1794, N_("Single-frame Bracketing High")},
783
    {1795, N_("Continuous Bracketing High")},
784
};
785
786
//! Lookup table to translate Sony A100 camera settings focus mode values to readable labels
787
constexpr TagDetails sonyFocusModeA100[] = {
788
    {0, "AF-S"}, {1, "AF-C"}, {4, "AF-A"}, {5, "Manual"}, {6, "DMF"},
789
};
790
791
//! Lookup table to translate Sony A100 camera settings flash mode values to readable labels
792
constexpr TagDetails sonyFlashModeA100[] = {
793
    {0, N_("Auto")},
794
    {2, N_("Rear flash sync")},
795
    {3, N_("Wireless")},
796
    {4, N_("Fill flash")},
797
};
798
799
//! Lookup table to translate Sony A100 camera settings metering mode values to readable labels
800
constexpr TagDetails sonyMeteringModeA100[] = {
801
    {0, N_("Multi-segment")},
802
    {1, N_("Center weighted average")},
803
    {2, N_("Spot")},
804
};
805
806
//! Lookup table to translate Sony A100 camera settings zone matching mode values to readable labels
807
constexpr TagDetails sonyZoneMatchingModeA100[] = {
808
    {0, N_("Off")},
809
    {1, N_("Standard")},
810
    {2, N_("Advanced")},
811
};
812
813
//! Lookup table to translate Sony A100 camera settings color space values to readable labels
814
815
constexpr TagDetails sonyColorSpaceA100[] = {
816
    {0, N_("sRGB")},
817
    {5, N_("Adobe RGB")},
818
};
819
820
//! Lookup table to translate Sony A100 camera settings drive mode values to readable labels
821
constexpr TagDetails sonyDriveModeA100[] = {
822
    {0, N_("Single Frame")},
823
    {1, N_("Continuous")},
824
    {2, N_("Self-timer")},
825
    {3, N_("Continuous Bracketing")},
826
    {4, N_("Single-Frame Bracketing")},
827
    {5, N_("White Balance Bracketing")},
828
};
829
830
//! Lookup table to translate Sony A100 camera settings self timer time values to readable labels
831
constexpr TagDetails sonySelfTimerTimeA100[] = {
832
    {0, "10s"},
833
    {4, "2s"},
834
};
835
836
//! Lookup table to translate Sony A100 camera settings continuous bracketing values to readable labels
837
constexpr TagDetails sonyContinuousBracketingA100[] = {
838
    {0x303, N_("Low")},
839
    {0x703, N_("High")},
840
};
841
842
//! Lookup table to translate Sony A100 camera settings single frame bracketing values to readable labels
843
constexpr TagDetails sonySingleFrameBracketingA100[] = {
844
    {0x302, N_("Low")},
845
    {0x702, N_("High")},
846
};
847
848
//! Lookup table to translate Sony A100 camera settings white balance bracketing values to readable labels
849
constexpr TagDetails sonyWhiteBalanceBracketingA100[] = {
850
    {0x8, N_("Low")},
851
    {0x9, N_("High")},
852
};
853
854
//! Lookup table to translate Sony A100 camera settings white balance setting values to readable labels
855
constexpr TagDetails sonyWhiteBalanceSettingA100[] = {
856
    {0x0000, N_("Auto")},
857
    {0x0001, N_("Preset")},
858
    {0x0002, N_("Custom")},
859
    {0x0003, N_("Color Temperature/Color Filter")},
860
    {0x8001, N_("Preset")},
861
    {0x8002, N_("Custom")},
862
    {0x8003, N_("Color Temperature/Color Filter")},
863
};
864
865
//! Lookup table to translate Sony A100 camera settings preset white balance values to readable labels
866
constexpr TagDetails sonyPresetWhiteBalanceA100[] = {
867
    {1, N_("Daylight")}, {2, N_("Cloudy")},      {3, N_("Shade")},
868
    {4, N_("Tungsten")}, {5, N_("Fluorescent")}, {6, N_("Flash")},
869
};
870
871
//! Lookup table to translate Sony A100 camera settings color temperature setting values to readable labels
872
constexpr TagDetails sonyColorTemperatureSettingA100[] = {
873
    {0, N_("Temperature")},
874
    {2, N_("Color Filter")},
875
};
876
877
//! Lookup table to translate Sony A100 camera settings custom WB setting values to readable labels
878
constexpr TagDetails sonyCustomWBSettingA100[] = {
879
    {0, N_("Setup")},
880
    {2, N_("Recall")},
881
};
882
883
//! Lookup table to translate Sony A100 camera settings custom WB error values to readable labels
884
constexpr TagDetails sonyCustomWBErrorA100[] = {
885
    {0, N_("Ok")},
886
    {2, N_("Error")},
887
};
888
889
//! Lookup table to translate Sony A100 camera settings image size values to readable labels
890
constexpr TagDetails sonyImageSizeA100[] = {
891
    {0, N_("Standard")},
892
    {1, N_("Medium")},
893
    {2, N_("Small")},
894
};
895
896
//! Lookup table to translate Sony A100 camera settings instant playback setup values to readable labels
897
constexpr TagDetails sonyInstantPlaybackSetupA100[] = {
898
    {0, N_("Image and Information")},
899
    {1, N_("Image Only")},
900
    {3, N_("Image and Histogram")},
901
};
902
903
//! Lookup table to translate Sony A100 camera settings flash default setup values to readable labels
904
constexpr TagDetails sonyFlashDefaultA100[] = {
905
    {0, N_("Auto")},
906
    {1, N_("Fill Flash")},
907
};
908
909
//! Lookup table to translate Sony A100 camera settings auto bracket order values to readable labels
910
constexpr TagDetails sonyAutoBracketOrderA100[] = {
911
    {0, "0-+"},
912
    {1, "-0+"},
913
};
914
915
//! Lookup table to translate Sony A100 camera settings focus hold button values to readable labels
916
constexpr TagDetails sonyFocusHoldButtonA100[] = {
917
    {0, N_("Focus Hold")},
918
    {1, N_("DOF Preview")},
919
};
920
921
//! Lookup table to translate Sony A100 camera settings AEL button values to readable labels
922
constexpr TagDetails sonyAELButtonA100[] = {
923
    {0, N_("Hold")},
924
    {1, N_("Toggle")},
925
    {2, N_("Spot Hold")},
926
    {3, N_("Spot Toggle")},
927
};
928
929
//! Lookup table to translate Sony A100 camera settings control dial set values to readable labels
930
constexpr TagDetails sonyControlDialSetA100[] = {
931
    {0, N_("Shutter Speed")},
932
    {1, N_("Aperture")},
933
};
934
935
//! Lookup table to translate Sony A100 camera settings exposure compensation mode values to readable labels
936
constexpr TagDetails sonyExposureCompensationModeA100[] = {
937
    {0, N_("Ambient and Flash")},
938
    {1, N_("Ambient Only")},
939
};
940
941
//! Lookup table to translate Sony A100 camera settings sony AF area illumination values to readable labels
942
constexpr TagDetails sonyAFAreaIlluminationA100[] = {
943
    {0, N_("0.3 seconds")},
944
    {1, N_("0.6 seconds")},
945
    {2, N_("Off")},
946
};
947
948
//! Lookup table to translate Sony A100 camera settings monitor display off values to readable labels
949
constexpr TagDetails sonyMonitorDisplayOffA100[] = {
950
    {0, N_("Automatic")},
951
    {1, N_("Manual")},
952
};
953
954
//! Lookup table to translate Sony A100 camera settings record display values to readable labels
955
constexpr TagDetails sonyRecordDisplayA100[] = {
956
    {0, N_("Auto-rotate")},
957
    {1, N_("Horizontal")},
958
};
959
960
//! Lookup table to translate Sony A100 camera settings play display values to readable labels
961
constexpr TagDetails sonyPlayDisplayA100[] = {
962
    {0, N_("Auto-rotate")},
963
    {1, N_("Manual Rotate")},
964
};
965
966
//! Lookup table to translate Sony A100 camera settings metering off scale indicator values to readable labels
967
constexpr TagDetails sonyMeteringOffScaleIndicatorA100[] = {
968
    {0, N_("Within Range")},
969
    {1, N_("Under/Over Range")},
970
    {255, N_("Out of Range")},
971
};
972
973
//! Lookup table to translate Sony A100 camera settings exposure indicator values to readable labels
974
constexpr TagDetails sonyExposureIndicatorA100[] = {
975
    {0, N_("Not Indicated")},
976
    {1, N_("Under Scale")},
977
    {119, N_("Bottom of Scale")},
978
    {120, "-2.0"},
979
    {121, "-1.7"},
980
    {122, "-1.5"},
981
    {123, "-1.3"},
982
    {124, "-1.0"},
983
    {125, "-0.7"},
984
    {126, "-0.5"},
985
    {127, "-0.3"},
986
    {128, "-0.0"},
987
    {129, "+0.3"},
988
    {130, "+0.5"},
989
    {131, "+0.7"},
990
    {132, "+1.0"},
991
    {133, "+1.3"},
992
    {134, "+1.5"},
993
    {135, "+1.7"},
994
    {136, "+2.0"},
995
    {253, N_("Top of Scale")},
996
    {254, N_("Over Scale")},
997
};
998
999
//! Lookup table to translate Sony A100 camera settings focus mode switch values to readable labels
1000
constexpr TagDetails sonyFocusModeSwitchA100[] = {
1001
    {0, N_("AM")},
1002
    {1, N_("MF")},
1003
};
1004
1005
//! Lookup table to translate Sony A100 camera settings flash type switch values to readable labels
1006
constexpr TagDetails sonyFlashTypeA100[] = {
1007
    {0, N_("Off")},
1008
    {1, N_("Built-in")},
1009
    {2, N_("External")},
1010
};
1011
1012
//! Lookup table to translate Sony A100 camera settings battery level switch values to readable labels
1013
constexpr TagDetails sonyBatteryLevelA100[] = {
1014
    {3, N_("Very Low")},
1015
    {4, N_("Low")},
1016
    {5, N_("Half Full")},
1017
    {6, N_("Sufficient Power Remaining")},
1018
};
1019
1020
// Sony A100 Camera Settings Tag Info
1021
constexpr TagInfo MinoltaMakerNote::tagInfoCsA100_[] = {
1022
    {0x0000, "ExposureMode", N_("Exposure Mode"), N_("Exposure mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1023
     unsignedShort, 1, EXV_PRINT_TAG(minoltaExposureMode5D)},
1024
    {0x0001, "ExposureCompensationSetting", N_("Exposure Compensation Setting"), N_("Exposure compensation setting"),
1025
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue},
1026
    {0x0005, "HighSpeedSync", N_("High Speed Sync"), N_("High speed sync"), IfdId::sony1MltCsA100Id,
1027
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
1028
    {0x0006, "ManualExposureTime", N_("Manual Exposure Time"), N_("Manual exposure time"), IfdId::sony1MltCsA100Id,
1029
     SectionId::makerTags, unsignedShort, 1, printValue},
1030
    {0x0007, "ManualFNumber", N_("Manual FNumber"), N_("Manual FNumber"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1031
     unsignedShort, 1, printValue},
1032
    {0x0008, "ExposureTime", N_("Exposure Time"), N_("Exposure time"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1033
     unsignedShort, 1, printValue},
1034
    {0x0009, "FNumber", N_("FNumber"), N_("FNumber"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1,
1035
     printValue},
1036
    {0x000A, "DriveMode2", N_("Drive Mode 2"), N_("Drive mode 2"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1037
     unsignedShort, 1, EXV_PRINT_TAG(sonyDriveMode2A100)},
1038
    {0x000B, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1039
     unsignedShort, 1, EXV_PRINT_TAG(minoltaWhiteBalance5D)},
1040
    {0x000C, "FocusMode", N_("Focus Mode"), N_("Focus mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1041
     unsignedShort, 1, EXV_PRINT_TAG(sonyFocusModeA100)},
1042
    {0x000D, "LocalAFAreaPoint", N_("Local AF Area Point"), N_("Local AF Area Point"), IfdId::sony1MltCsA100Id,
1043
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyLocalAFAreaPoint},
1044
    {0x000E, "AFAreaMode", N_("AF Area Mode"), N_("AF Area Mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1045
     unsignedShort, 1, printMinoltaSonyAFAreaMode},
1046
    {0x000F, "FlashMode", N_("FlashMode"), N_("FlashMode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1047
     unsignedShort, 1, EXV_PRINT_TAG(sonyFlashModeA100)},
1048
    {0x0010, "FlashExposureCompSetting", N_("Flash Exposure Comp Setting"), N_("Flash exposure compensation setting"),
1049
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue},
1050
    {0x0012, "MeteringMode", N_("Metering Mode"), N_("Metering mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1051
     unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringModeA100)},
1052
    {0x0013, "ISOSetting", N_("ISO Setting"), N_("ISO setting"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1053
     unsignedShort, 1, printValue},
1054
    {0x0014, "ZoneMatchingMode", N_("Zone Matching Mode"), N_("Zone Matching Mode"), IfdId::sony1MltCsA100Id,
1055
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyZoneMatchingModeA100)},
1056
    {0x0015, "DynamicRangeOptimizerMode", N_("Dynamic Range Optimizer Mode"), N_("Dynamic range optimizer mode"),
1057
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyDynamicRangeOptimizerMode},
1058
    {0x0016, "ColorMode", N_("Color Mode"), N_("Color mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1059
     unsignedShort, 1, printMinoltaSonyColorMode},
1060
    {0x0017, "ColorSpace", N_("Color Space"), N_("Color space"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1061
     unsignedShort, 1, EXV_PRINT_TAG(sonyColorSpaceA100)},
1062
    {0x0018, "Sharpness", N_("Sharpness"), N_("Sharpness"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1063
     unsignedShort, 1, printValue},
1064
    {0x0019, "Contrast", N_("Contrast"), N_("Contrast"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort,
1065
     1, printValue},
1066
    {0x001A, "Saturation", N_("Saturation"), N_("Saturation"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1067
     unsignedShort, 1, printValue},
1068
    {0x001C, "FlashMetering", N_("Flash Metering"), N_("Flash metering"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1069
     unsignedShort, 1, EXV_PRINT_TAG(minoltaFlashMeteringStd)},
1070
    {0x001D, "PrioritySetupShutterRelease", N_("Priority Setup Shutter Release"), N_("Priority Setup Shutter Release"),
1071
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printMinoltaSonyPrioritySetupShutterRelease},
1072
    {0x001E, "DriveMode", N_("Drive Mode"), N_("Drive mode"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1073
     unsignedShort, 1, EXV_PRINT_TAG(sonyDriveModeA100)},
1074
    {0x001F, "SelfTimerTime", N_("Self Timer Time"), N_("Self timer time"), IfdId::sony1MltCsA100Id,
1075
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonySelfTimerTimeA100)},
1076
    {0x0020, "ContinuousBracketing", N_("Continuous Bracketing"), N_("Continuous bracketing"), IfdId::sony1MltCsA100Id,
1077
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyContinuousBracketingA100)},
1078
    {0x0021, "SingleFrameBracketing", N_("Single Frame Bracketing"), N_("Single frame bracketing"),
1079
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonySingleFrameBracketingA100)},
1080
    {0x0022, "WhiteBalanceBracketing", N_("White Balance Bracketing"), N_("White balance bracketing"),
1081
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceBracketingA100)},
1082
    {0x0023, "WhiteBalanceSetting", N_("White Balance Setting"), N_("White balance setting"), IfdId::sony1MltCsA100Id,
1083
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyWhiteBalanceSettingA100)},
1084
    {0x0024, "PresetWhiteBalance", N_("Preset White Balance"), N_("Preset white balance"), IfdId::sony1MltCsA100Id,
1085
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyPresetWhiteBalanceA100)},
1086
    {0x0025, "ColorTemperatureSetting", N_("Color Temperature Setting"), N_("Color temperature setting"),
1087
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyColorTemperatureSettingA100)},
1088
    {0x0026, "CustomWBSetting", N_("Custom WB Setting"), N_("Custom WB setting"), IfdId::sony1MltCsA100Id,
1089
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCustomWBSettingA100)},
1090
    {0x0027, "DynamicRangeOptimizerSettings", N_("Dynamic Range Optimizer Settings"),
1091
     N_("Dynamic Range Optimizer Settings"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1,
1092
     printMinoltaSonyDynamicRangeOptimizerMode},
1093
    {0x0032, "FreeMemoryCardImages", N_("Free Memory Card Images"), N_("Free memory card images"),
1094
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue},
1095
    {0x0034, "CustomWBRedLevel", N_("Custom WB Red Level"), N_("Custom WB red level"), IfdId::sony1MltCsA100Id,
1096
     SectionId::makerTags, unsignedShort, 1, printValue},
1097
    {0x0035, "CustomWBGreenLevel", N_("Custom WB Green Level"), N_("Custom WB green level"), IfdId::sony1MltCsA100Id,
1098
     SectionId::makerTags, unsignedShort, 1, printValue},
1099
    {0x0036, "CustomWBBlueLevel", N_("Custom WB Blue Level"), N_("Custom WB blue level"), IfdId::sony1MltCsA100Id,
1100
     SectionId::makerTags, unsignedShort, 1, printValue},
1101
    {0x0037, "CustomWBError", N_("Custom WB Error"), N_("Custom WB Error"), IfdId::sony1MltCsA100Id,
1102
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyCustomWBErrorA100)},
1103
    {0x0038, "WhiteBalanceFineTune", N_("White Balance Fine Tune"), N_("White balance fine tune"),
1104
     IfdId::sony1MltCsA100Id, SectionId::makerTags, signedShort, 1, printValue},
1105
    {0x0039, "ColorTemperature", N_("Color Temperature"), N_("Color temperature"), IfdId::sony1MltCsA100Id,
1106
     SectionId::makerTags, unsignedShort, 1, printValue},
1107
    {0x003A, "ColorCompensationFilter", N_("Color Compensation Filter"), N_("Color compensation filter"),
1108
     IfdId::sony1MltCsA100Id, SectionId::makerTags, signedShort, 1, printValue},
1109
    {0x003B, "SonyImageSize", N_("Sony Image Size"), N_("Sony Image Size"), IfdId::sony1MltCsA100Id,
1110
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyImageSizeA100)},
1111
    {0x003C, "Quality", N_("Quality"), N_("Quality"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1,
1112
     printMinoltaSonyQualityCs},
1113
    {0x003D, "InstantPlaybackTime", N_("Instant Playback Time"), N_("Instant playback time"), IfdId::sony1MltCsA100Id,
1114
     SectionId::makerTags, unsignedShort, 1, printValue},
1115
    {0x003E, "InstantPlaybackSetup", N_("Instant Playback Setup"), N_("Instant playback setup"),
1116
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyInstantPlaybackSetupA100)},
1117
    {0x003F, "NoiseReduction", N_("Noise Reduction"), N_("Noise reduction"), IfdId::sony1MltCsA100Id,
1118
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
1119
    {0x0040, "EyeStartAF", N_("Eye Start AF"), N_("Eye start AF"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1120
     unsignedShort, 1, printMinoltaSonyBoolInverseValue},
1121
    {0x0041, "RedEyeReduction", N_("Red Eye Reduction"), N_("Red eye reduction"), IfdId::sony1MltCsA100Id,
1122
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
1123
    {0x0042, "FlashDefault", N_("Flash Default"), N_("Flash default"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1124
     unsignedShort, 1, EXV_PRINT_TAG(sonyFlashDefaultA100)},
1125
    {0x0043, "AutoBracketOrder", N_("Auto Bracket Order"), N_("Auto bracket order"), IfdId::sony1MltCsA100Id,
1126
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAutoBracketOrderA100)},
1127
    {0x0044, "FocusHoldButton", N_("Focus Hold Button"), N_("Focus hold button"), IfdId::sony1MltCsA100Id,
1128
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFocusHoldButtonA100)},
1129
    {0x0045, "AELButton", N_("AEL Button"), N_("AEL button"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1130
     unsignedShort, 1, EXV_PRINT_TAG(sonyAELButtonA100)},
1131
    {0x0046, "ControlDialSet", N_("Control Dial Set"), N_("Control dial set"), IfdId::sony1MltCsA100Id,
1132
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyControlDialSetA100)},
1133
    {0x0047, "ExposureCompensationMode", N_("Exposure Compensation Mode"), N_("Exposure compensation mode"),
1134
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureCompensationModeA100)},
1135
    {0x0048, "AFAssist", N_("AF Assist"), N_("AF assist"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort,
1136
     1, printMinoltaSonyBoolInverseValue},
1137
    {0x0049, "CardShutterLock", N_("Card Shutter Lock"), N_("Card shutter lock"), IfdId::sony1MltCsA100Id,
1138
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue},
1139
    {0x004A, "LensShutterLock", N_("Lens Shutter Lock"), N_("Lens shutter lock"), IfdId::sony1MltCsA100Id,
1140
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolInverseValue},
1141
    {0x004B, "AFAreaIllumination", N_("AF Area Illumination"), N_("AF area illumination"), IfdId::sony1MltCsA100Id,
1142
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyAFAreaIlluminationA100)},
1143
    {0x004C, "MonitorDisplayOff", N_("Monitor Display Off"), N_("Monitor display off"), IfdId::sony1MltCsA100Id,
1144
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMonitorDisplayOffA100)},
1145
    {0x004D, "RecordDisplay", N_("Record Display"), N_("Record display"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1146
     unsignedShort, 1, EXV_PRINT_TAG(sonyRecordDisplayA100)},
1147
    {0x004E, "PlayDisplay", N_("Play Display"), N_("Play display"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1148
     unsignedShort, 1, EXV_PRINT_TAG(sonyPlayDisplayA100)},
1149
    {0x0050, "ExposureIndicator", N_("Exposure Indicator"), N_("Exposure indicator"), IfdId::sony1MltCsA100Id,
1150
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1151
    {0x0051, "AELExposureIndicator", N_("AEL Exposure Indicator"),
1152
     N_("AEL exposure indicator (also indicates exposure for next shot when bracketing)"), IfdId::sony1MltCsA100Id,
1153
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1154
    {0x0052, "ExposureBracketingIndicatorLast", N_("Exposure Bracketing Indicator Last"),
1155
     N_("Exposure bracketing indicator last (indicator for last shot when bracketing)"), IfdId::sony1MltCsA100Id,
1156
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1157
    {0x0053, "MeteringOffScaleIndicator", N_("Metering Off Scale Indicator"),
1158
     N_("Metering off scale indicator (two flashing triangles when under or over metering scale)"),
1159
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyMeteringOffScaleIndicatorA100)},
1160
    {0x0054, "FlashExposureIndicator", N_("Flash Exposure Indicator"), N_("Flash exposure indicator"),
1161
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1162
    {0x0055, "FlashExposureIndicatorNext", N_("Flash Exposure Indicator Next"),
1163
     N_("Flash exposure indicator next (indicator for next shot when bracketing)"), IfdId::sony1MltCsA100Id,
1164
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1165
    {0x0056, "FlashExposureIndicatorLast", N_("Flash Exposure Indicator Last"),
1166
     N_("Flash exposure indicator last (indicator for last shot when bracketing)"), IfdId::sony1MltCsA100Id,
1167
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyExposureIndicatorA100)},
1168
    {0x0057, "ImageStabilization", N_("Image Stabilization"), N_("Image stabilization"), IfdId::sony1MltCsA100Id,
1169
     SectionId::makerTags, unsignedShort, 1, printMinoltaSonyBoolValue},
1170
    {0x0058, "FocusModeSwitch", N_("Focus Mode Switch"), N_("Focus mode switch"), IfdId::sony1MltCsA100Id,
1171
     SectionId::makerTags, unsignedShort, 1, EXV_PRINT_TAG(sonyFocusModeSwitchA100)},
1172
    {0x0059, "FlashType", N_("Flash Type"), N_("Flash type"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1173
     unsignedShort, 1, EXV_PRINT_TAG(sonyFlashTypeA100)},
1174
    {0x005A, "Rotation", N_("Rotation"), N_("Rotation"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort,
1175
     1, printMinoltaSonyRotation},
1176
    {0x004B, "AELock", N_("AE Lock"), N_("AE lock"), IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1,
1177
     printMinoltaSonyBoolValue},
1178
    {0x005E, "ColorTemperature2", N_("Color Temperature 2"), N_("Color temperature 2"), IfdId::sony1MltCsA100Id,
1179
     SectionId::makerTags, unsignedLong, 1, printValue},
1180
    {0x005F, "ColorCompensationFilter2", N_("Color Compensation Filter 2"),
1181
     N_("Color compensation filter: negative is green, positive is magenta"), IfdId::sony1MltCsA100Id,
1182
     SectionId::makerTags, unsignedLong, 1, printValue},
1183
    {0x0060, "BatteryLevel", N_("Battery Level"), N_("Battery level"), IfdId::sony1MltCsA100Id, SectionId::makerTags,
1184
     unsignedShort, 1, EXV_PRINT_TAG(sonyBatteryLevelA100)},
1185
    // End of list marker
1186
    {0xffff, "(UnknownSonyCsA100Tag)", "(UnknownSonyCsA100Tag)", N_("Unknown Sony Camera Settings A100 tag"),
1187
     IfdId::sony1MltCsA100Id, SectionId::makerTags, unsignedShort, 1, printValue},
1188
};
1189
1190
// TODO : Add camera settings tags info "New2"...
1191
1192
// -- Minolta and Sony MakerNote Common Values ---------------------------------------
1193
1194
//! Lookup table to translate Minolta/Sony Lens id values to readable labels
1195
/* NOTE:
1196
   - duplicate tags value are:
1197
   0/25520, 4/25920, 13/25610, 19/25910, 22/26050/26070,
1198
   25500/25501/26130, 25540/25541/25850, 25580/25581, 2564025641,
1199
   25720/25721, 25790/25791, 25960/25961, 25980/25981, 26150/26151
1200
   - No need to i18n these string.
1201
*/
1202
static constexpr TagDetails minoltaSonyLensID[] = {
1203
    {0, "Minolta AF 28-85mm F3.5-4.5 New"},
1204
    {1, "Minolta AF 80-200mm F2.8 HS-APO G"},
1205
    {2, "Minolta AF 28-70mm F2.8 G"},
1206
    {3, "Minolta AF 28-80mm F4-5.6"},
1207
    {4, "Minolta AF 85mm F1.4G"},
1208
    {5, "Minolta AF 35-70mm F3.5-4.5 [II]"},
1209
    {6, "Minolta AF 24-85mm F3.5-4.5 [New]"},
1210
    {7,
1211
     "Minolta AF 100-300mm F4.5-5.6 (D) APO [New] | "
1212
     "Minolta AF 100-400mm F4.5-6.7 (D) | "
1213
     "Sigma AF 100-300mm F4 EX DG IF"},
1214
    {8, "Minolta AF 70-210mm F4.5-5.6 [II]"},
1215
    {9, "Minolta AF 50mm F3.5 Macro"},
1216
    {10, "Minolta AF 28-105mm F3.5-4.5 [New]"},
1217
    {11, "Minolta AF 300mm F4 HS-APO G"},
1218
    {12, "Minolta AF 100mm F2.8 Soft Focus"},
1219
    {13, "Minolta AF 75-300mm F4.5-5.6 (New or II)"},
1220
    {14, "Minolta AF 100-400mm F4.5-6.7 APO"},
1221
    {15, "Minolta AF 400mm F4.5 HS-APO G"},
1222
    {16, "Minolta AF 17-35mm F3.5 G"},
1223
    {17, "Minolta AF 20-35mm F3.5-4.5"},
1224
    {18, "Minolta AF 28-80mm F3.5-5.6 II"},
1225
    {19, "Minolta AF 35mm F1.4 G"},
1226
    {20, "Minolta/Sony 135mm F2.8 [T4.5] STF"},
1227
    {22, "Minolta AF 35-80mm F4-5.6 II"},
1228
    {23, "Minolta AF 200mm F4 Macro APO G"},
1229
    {24,
1230
     "Minolta/Sony AF 24-105mm F3.5-4.5 (D) | "
1231
     "Sigma 18-50mm F2.8 | "
1232
     "Sigma 17-70mm F2.8-4.5 (D) | "
1233
     "Sigma 20-40mm F2.8 EX DG Aspherical IF | "
1234
     "Sigma 18-200mm F3.5-6.3 DC | "
1235
     "Sigma DC 18-125mm F4-5,6 D | "
1236
     "Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical [IF] Macro"},
1237
    {25,
1238
     "Minolta AF 100-300mm F4.5-5.6 APO (D) | "
1239
     "Sigma 100-300mm F4 EX (APO (D) or D IF) | "
1240
     "Sigma 70mm F2.8 EX DG Macro | "
1241
     "Sigma 20mm F1.8 EX DG Aspherical RF | "
1242
     "Sigma 30mm F1.4 DG EX | "
1243
     "Sigma 24mm F1.8 EX DG ASP Macro"},
1244
    {27, "Minolta AF 85mm F1.4 G (D)"},
1245
    {0x1c,
1246
     "Minolta/Sony AF 100mm F2.8 Macro (D) | "        // 1
1247
     "Tamron SP AF 90mm F2.8 Di Macro | "             // 2
1248
     "Tamron SP AF 180mm F3.5 SP Di LD [IF] Macro"},  // 3
1249
    {29, "Minolta/Sony AF 75-300mm F4.5-5.6 (D) "},
1250
    {30,
1251
     "Minolta AF 28-80mm F3.5-5.6 (D) | "
1252
     "Sigma AF 10-20mm F4-5.6 EX DC | "
1253
     "Sigma AF 12-24mm F4.5-5.6 EX DG | "
1254
     "Sigma 28-70mm EX DG F2.8 | "
1255
     "Sigma 55-200mm F4-5.6 DC"},
1256
    {31,
1257
     "Minolta/Sony AF 50mm F2.8 Macro (D) | "
1258
     "Minolta/Sony AF 50mm F3.5 Macro"},
1259
    {32,
1260
     "Minolta AF 100-400mm F4.5-6.7 (D) | "
1261
     "Minolta/Sony AF 300mm F2.8G APO (D) SSM"},
1262
    {33, "Minolta/Sony AF 70-200mm F2.8 APO G (D) SSM"},
1263
    {35, "Minolta AF 85mm F1.4 G (D) Limited"},
1264
    {36, "Minolta AF 28-100mm F3.5-5.6 (D)"},
1265
    {38, "Minolta AF 17-35mm F2.8-4 (D)"},
1266
    {39, "Minolta AF 28-75mm F2.8 (D)"},
1267
    {40,
1268
     "Minolta/Sony AF DT 18-70mm F3.5-5.6 (D) | "
1269
     "Sony AF DT 18-200mm F3.5-6.3"},
1270
    {0x29,
1271
     "Minolta/Sony AF DT 11-18mm F4.5-5.6 (D) | "              // 1
1272
     "Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF"},  // 2
1273
    {42, "Minolta/Sony AF DT 18-200mm F3.5-6.3 (D)"},
1274
    {43, "Sony 35mm F1.4 G (SAL35F14G)"},
1275
    {44, "Sony 50mm F1.4 (SAL50F14)"},
1276
    {45, "Carl Zeiss Planar T* 85mm F1.4 ZA (SAL85F14Z)"},
1277
    {46, "Carl Zeiss Vario-Sonnar T* DT 16-80mm F3.5-4.5 ZA (SAL1680Z)"},
1278
    {47, "Carl Zeiss Sonnar T* 135mm F1.8 ZA (SAL135F18Z)"},
1279
    {48,
1280
     "Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM (SAL2470Z) | "
1281
     "Carl Zeiss Vario-Sonnar T* 24-70mm F2.8 ZA SSM II (SAL2470Z2)"},
1282
    {49, "Sony AF DT 55-200mm F4-5.6 (SAL55200)"},
1283
    {50, "Sony AF DT 18-250mm F3.5-6.3 (SAL18250)"},
1284
    {51, "Sony AF DT 16-105mm F3.5-5.6 (SAL16105)"},
1285
    //      { 51,    "Sony AF DT 55-200mm F4-5.5" }, // Anomaly? - unconfirmed.
1286
    {0x34,
1287
     "Sony 70-300mm F4.5-5.6 G SSM (SAL70300G) | "         // 1
1288
     "Sony 70-300mm F4.5-5.6 G SSM II (SAL70300G2) | "     // 2
1289
     "Tamron SP 70-300mm F4-5.6 Di USD | "                 // 3
1290
     "Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical"},  // 4
1291
    {53, "Sony AF 70-400mm F4.5-5.6 G SSM (SAL70400G)"},
1292
    {54,
1293
     "Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM (SAL1635Z) | "
1294
     "Carl Zeiss Vario-Sonnar T* 16-35mm F2.8 ZA SSM II (SAL1635Z2)"},
1295
    {55,
1296
     "Sony DT 18-55mm F3.5-5.6 SAM (SAL1855) | "
1297
     "Sony DT 18-55mm F3.5-5.6 SAM II (SAL18552)"},
1298
    {56, "Sony AF DT 55-200mm F4-5.6 SAM (SAL55200-2)"},
1299
    {57,
1300
     "Sony DT 50mm F1.8 SAM (SAL50F18) | "
1301
     "Tamron SP AF 60mm F2 Di II LD [IF] Macro 1:1 | "
1302
     "Tamron 18-270mm F3.5-6.3 Di II PZD"},
1303
    {58, "Sony AF DT 30mm F2.8 SAM Macro (SAL30M28)"},
1304
    {59, "Sony 28-75mm F2.8 SAM (SAL2875)"},
1305
    {60, "Carl Zeiss Distagon T* 24mm F2 ZA SSM (SAL24F20Z)"},
1306
    {61, "Sony 85mm F2.8 SAM (SAL85F28)"},
1307
    {62, "Sony DT 35mm F1.8 SAM (SAL35F18)"},
1308
    {63, "Sony DT 16-50mm F2.8 SSM (SAL1650)"},
1309
    {64, "Sony 500mm F4.0 G SSM (SAL500F40G)"},
1310
    {65, "Sony DT 18-135mm F3.5-5.6 SAM (SAL18135)"},
1311
    {66, "Sony 300mm F2.8 G SSM II (SAL300F28G2)"},
1312
    {67, "Sony 70-200mm F2.8 G SSM II (SAL70200G2)"},
1313
    {68, "Sony DT 55-300mm F4.5-5.6 SAM (SAL55300)"},
1314
    {69, "Sony 70-400mm F4-5.6 G SSM II (SAL70400G2)"},
1315
    {70, "Sony Carl Zeiss Planar T* 50mm F1.4 ZA SSM (SALF0F14Z)"},
1316
    {0x80,
1317
     "Sigma 70-200mm F2.8 APO EX DG MACRO | "                            // 1
1318
     "Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro | "  // 2
1319
     "Tamron AF 28-300mm F3.5-6.3 XR Di LD Aspherical [IF] Macro | "     // 3
1320
     "Tamron 80-300mm F3.5-6.3 | "                                       // 4
1321
     "Tamron AF 28-200mm F3.8-5.6 XR Di Aspherical [IF] MACRO | "        // 5
1322
     "Tamron SP AF 17-35mm F2.8-4 Di LD Aspherical IF | "                // 6
1323
     "Sigma AF 50-150mm F2.8 EX DC APO HSM II | "                        // 7
1324
     "Sigma 10-20mm F3.5 EX DC HSM | "                                   // 8
1325
     "Sigma 70-200mm F2.8 II EX DG APO MACRO HSM | "                     // 9
1326
     "Sigma 10mm F2.8 EX DC HSM Fisheye | "                              // 10
1327
     "Sigma 50mm F1.4 EX DG HSM | "                                      // 11
1328
     "Sigma 85mm F1.4 EX DG HSM | "                                      // 12
1329
     "Sigma 24-70mm F2.8 IF EX DG HSM | "                                // 13
1330
     "Sigma 18-250mm F3.5-6.3 DC OS HSM | "                              // 14
1331
     "Sigma 17-50mm F2.8 EX DC HSM | "                                   // 15
1332
     "Sigma 17-70mm F2.8-4 DC Macro HSM | "                              // 16
1333
     "Sigma 150mm F2.8 EX DG OS HSM APO Macro | "                        // 17
1334
     "Sigma 150-500mm F5-6.3 APO DG OS HSM | "                           // 18
1335
     "Tamron AF 28-105mm F4-5.6 [IF] | "                                 // 19
1336
     "Sigma 35mm F1.4 DG HSM | "                                         // 20
1337
     "Sigma 18-35mm F1.8 DC HSM | "                                      // 21
1338
     "Sigma 50-500mm F4.5-6.3 APO DG OS HSM | "                          // 22
1339
     "Sigma 24-105mm F4 DG HSM | Art 013"},                              // 23
1340
    {129,
1341
     "Tamron 200-400mm F5.6 LD | "
1342
     "Tamron 70-300mm F4-5.6 LD"},
1343
    {131, "Tamron 20-40mm F2.7-3.5 SP Aspherical IF"},
1344
    {135, "Vivitar 28-210mm F3.5-5.6"},
1345
    {136, "Tokina EMZ M100 AF 100mm F3.5"},
1346
    {137, "Cosina 70-210mm F2.8-4 AF"},
1347
    {138, "Soligor 19-35mm F3.5-4.5"},
1348
    {139, "Tokina AF 28-300mm F4-6.3"},
1349
    {142, "Voigtlander 70-300mm F4.5-5.6"},
1350
    {146, "Voigtlander Macro APO-Lanthar 125mm F2.5 SL"},
1351
    {193, "Minolta AF 1.4x APO II"},
1352
    {194, "Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical [IF]"},
1353
    {202, "Tamron SP AF 70-200mm F2.8 Di LD [IF] Macro"},
1354
    {203, "Tamron SP 70-200mm F2.8 Di USD"},
1355
    {204, "Tamron SP 24-70mm F2.8 Di USD"},
1356
    {212, "Tamron 28-300mm F3.5-6.3 Di PZD"},
1357
    {213, "Tamron 16-300mm F3.5-6.3 Di II PZD Macro"},
1358
    {214, "Tamron Tamron SP 150-600mm F5-6.3 Di USD"},
1359
    {215, "Tamron SP 15-30mm F2.8 Di USD"},
1360
    {218, "Tamron SP 90mm F2.8 Di Macro 1:1 USD (F017)"},
1361
    {224, "Tamron SP 90mm F2.8 Di Macro 1:1 USD (F004)"},
1362
    {0xff,
1363
     "Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical | "      // 1
1364
     "Tamron AF 18-250mm F3.5-6.3 XR Di II LD | "               // 2
1365
     "Tamron AF 55-200mm F4-5.6 Di II LD Macro | "              // 3
1366
     "Tamron AF 70-300mm F4-5.6 Di LD Macro 1:2 | "             // 4
1367
     "Tamron SP AF 200-500mm F5.0-6.3 Di LD IF | "              // 5
1368
     "Tamron SP AF 10-24mm F3.5-4.5 Di II LD Aspherical IF | "  // 6
1369
     "Tamron SP AF 70-200mm F2.8 Di LD IF Macro | "             // 7
1370
     "Tamron SP AF 28-75mm F2.8 XR Di LD Aspherical IF | "      // 8
1371
     "Tamron AF 90-300mm F4.5-5.6 Telemacro"},                  // 9
1372
    {25500, "Minolta AF 50mm F1.7"},
1373
    {25501, "Minolta AF 50mm F1.7"},
1374
    {25510, "Minolta AF 35-70mm F4"},
1375
    {25511,
1376
     "Minolta AF 35-70mm F4 | "
1377
     "Sigma UC AF 28-70mm F3.5-4.5 | "
1378
     "Sigma AF 28-70mm F2.8 | "
1379
     "Sigma M-AF 70-200mm F2.8 EX Aspherical | "
1380
     "Quantaray M-AF 35-80mm F4-5.6 | "
1381
     "Tokina 28-70mm F2.8-4.5 AF"},
1382
    {25520, "Minolta AF 28-85mm F3.5-4.5"},
1383
    {25521,
1384
     "Minolta AF 28-85mm F3.5-4.5 | "
1385
     "Tokina 19-35mm F3.5-4.5 | "
1386
     "Tokina 28-70mm F2.8 AT-X | "
1387
     "Tokina 80-400mm F4.5-5.6 AT-X AF II 840 | "
1388
     "Tokina AF PRO 28-80mm F2.8 AT-X 280 | "
1389
     "Tokina AT-X PRO [II] AF 28-70mm F2.6-2.8 270 | "
1390
     "Tamron AF 19-35mm F3.5-4.5 | "
1391
     "Angenieux AF 28-70mm F2.6 | "
1392
     "Tokina AT-X 17 AF 17mm F3.5 | "
1393
     "Tokina 20-35mm F3.5-4.5 II AF"},
1394
    {25530, "Minolta AF 28-135mm F4-4.5"},
1395
    {25531,
1396
     "Minolta AF 28-135mm F4-4.5 | "
1397
     "Sigma ZOOM-alpha 35-135mm F3.5-4.5 | "
1398
     "Sigma 28-105mm F2.8-4 Aspherical | "
1399
     "Sigma 28-105mm F4-5.6 UC"},
1400
    {25540, "Minolta AF 35-105mm F3.5-4.5"},
1401
    {25541, "Minolta AF 35-105mm F3.5-4.5"},
1402
    {25550, "Minolta AF 70-210mm F4"},
1403
    {25551,
1404
     "Minolta AF 70-210mm F4 Macro | "
1405
     "Sigma 70-210mm F4-5.6 APO | "
1406
     "Sigma M-AF 70-200mm F2.8 EX APO | "
1407
     "Sigma 75-200mm F2.8-3.5"},
1408
    {25560, "Minolta AF 135mm F2.8"},
1409
    {25561, "Minolta AF 135mm F2.8"},
1410
    {25570, "Minolta AF 28mm F2.8"},
1411
    {25571, "Minolta/Sony AF 28mm F2.8"},
1412
    {25580, "Minolta AF 24-50mm F4"},
1413
    {25581, "Minolta AF 24-50mm F4"},
1414
    {25600, "Minolta AF 100-200mm F4.5"},
1415
    {25601, "Minolta AF 100-200mm F4.5"},
1416
    {25610, "Minolta AF 75-300mm F4.5-5.6"},
1417
    {25611,
1418
     "Minolta AF 75-300mm F4.5-5.6 | "
1419
     "Sigma 70-300mm F4-5.6 DL Macro | "
1420
     "Sigma 300mm F4 APO Macro | "
1421
     "Sigma AF 500mm F4.5 APO | "
1422
     "Sigma AF 170-500mm F5-6.3 APO Aspherical | "
1423
     "Tokina AT-X AF 300mm F4 | "
1424
     "Tokina AT-X AF 400mm F5.6 SD | "
1425
     "Tokina AF 730 II 75-300mm F4.5-5.6 | "
1426
     "Sigma 800mm F5.6 APO | "
1427
     "Sigma AF 400mm F5.6 APO Macro"},
1428
    {25620, "Minolta AF 50mm F1.4"},
1429
    {25621, "Minolta AF 50mm F1.4 [New]"},
1430
    {25630, "Minolta AF 300mm F2.8G APO"},
1431
    {25631,
1432
     "Minolta AF 300mm F2.8 APO | "
1433
     "Sigma AF 50-500mm F4-6.3 EX DG APO | "
1434
     "Sigma AF 170-500mm F5-6.3 APO Aspherical | "
1435
     "Sigma AF 500mm F4.5 EX DG APO | "
1436
     "Sigma 400mm F5.6 APO"},
1437
    {25640, "Minolta AF 50mm F2.8 Macro"},
1438
    {25641,
1439
     "Minolta AF 50mm F2.8 Macro | "
1440
     "Sigma 50mm F2.8 EX Macro"},
1441
    {25650, "Minolta AF 600mm F4 APO"},
1442
    {25651, "Minolta AF 600mm F4 APO"},
1443
    {25660, "Minolta AF 24mm F2.8"},
1444
    {25661,
1445
     "Minolta AF 24mm F2.8 | "
1446
     "Sigma 17-35mm F2.8-4.0 EX-D"},
1447
    {25720, "Minolta AF 500mm F8 Reflex"},
1448
    {25721, "Minolta/Sony AF 500mm F8 Reflex"},
1449
    {25780, "Minolta/Sony AF 16mm F2.8 Fisheye"},
1450
    {25781,
1451
     "Minolta/Sony AF 16mm F2.8 Fisheye | "
1452
     "Sigma 8mm F4 EX [DG] Fisheye | "
1453
     "Sigma 14mm F3.5 | "
1454
     "Sigma 15mm F2.8 Fisheye"},
1455
    {25790, "Minolta AF 20mm F2.8"},
1456
    {25791,
1457
     "Minolta/Sony AF 20mm F2.8 | "
1458
     "Tokina AT-X 116 PRO DX AF 11-16mm F2.8"},
1459
    {25810, "Minolta AF 100mm F2.8 Macro"},
1460
    {25811,
1461
     "Minolta AF 100mm F2.8 Macro [New] | "
1462
     "Sigma AF 90mm F2.8 Macro | "
1463
     "Sigma AF 105mm F2.8 EX [DG] Macro | "
1464
     "Sigma 180mm F5.6 Macro | "
1465
     "Sigma 180mm F3.5 EX DG Macro | "
1466
     "Tamron 90mm F2.8 Macro"},
1467
    {25850, "Minolta AF 35-105mm F3.5-4.5"},
1468
    {25851, "Beroflex 35-135mm F3.5-4.5"},
1469
    {25858,
1470
     "Minolta AF 35-105mm F3.5-4.5 New | "
1471
     "Tamron 24-135mm F3.5-5.6"},
1472
    {25880, "Minolta AF 70-210mm F3.5-4.5"},
1473
    {25881, "Minolta AF 70-210mm F3.5-4.5"},
1474
    {25890, "Minolta AF 80-200mm F2.8 APO"},
1475
    {25891,
1476
     "Minolta AF 80-200mm F2.8 APO | "
1477
     "Tokina 80-200mm F2.8"},
1478
    {25900, "Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO"},
1479
    {25901,
1480
     "Minolta AF 200mm F2.8 G APO + Minolta AF 1.4x APO | "
1481
     "Minolta AF 600mm F4 HS-APO G + Minolta AF 1.4x APO"},
1482
    {25910, "Minolta AF 35mm F1.4G"},
1483
    {25911, "Minolta AF 35mm F1.4"},
1484
    {25920, "Minolta AF 85mm F1.4G"},
1485
    {25921, "Minolta AF 85mm F1.4G (D)"},
1486
    {25930, "Minolta AF 200mm F2.8 APO"},
1487
    {25931, "Minolta AF 200mm F2.8 APO"},
1488
    {25940, "Minolta AF 3X-1X F1.7-2.8 Macro"},
1489
    {25941, "Minolta AF 3x-1x F1.7-2.8 Macro"},
1490
    {25960, "Minolta AF 28mm F2"},
1491
    {25961, "Minolta AF 28mm F2"},
1492
    {25970, "Minolta AF 35mm F2"},
1493
    {25971, "Minolta AF 35mm F2 [New]"},
1494
    {25980, "Minolta AF 100mm F2"},
1495
    {25981, "Minolta AF 100mm F2"},
1496
    {26010, "Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO"},
1497
    {26011,
1498
     "Minolta AF 200mm F2.8 G APO + Minolta AF 2x APO | "
1499
     "Minolta AF 600mm F4 HS-APO G + Minolta AF 2x APO"},
1500
    {26040, "Minolta AF 80-200mm F4.5-5.6"},
1501
    {26041, "Minolta AF 80-200mm F4.5-5.6"},
1502
    {26050, "Minolta AF 35-80mm F4-5.6"},
1503
    {26051, "Minolta AF 35-80mm F4-5.6"},
1504
    {26060, "Minolta AF 100-300mm F4.5-5.6"},
1505
    {26061,
1506
     "Minolta AF 100-300mm F4.5-5.6 (D) | "
1507
     "Sigma 105mm F2.8 Macro EX DG"},
1508
    {26070, "Minolta AF 35-80mm F4-5.6"},
1509
    {26071, "Minolta AF 35-80mm F4-5.6"},
1510
    {26080, "Minolta AF 300mm F2.8 G"},
1511
    {26081, "Minolta AF 300mm F2.8 G APO High Speed"},
1512
    {26090, "Minolta AF 600mm F4 G"},
1513
    {26091, "Minolta AF 600mm F4 G APO High Speed"},
1514
    {26120, "Minolta AF 200mm F2.8 G"},
1515
    {26121, "Minolta AF 200mm F2.8 G APO High Speed"},
1516
    {26130, "Minolta AF 50mm F1.7"},
1517
    {26131, "Minolta AF 50mm F1.7 New"},
1518
    {26150, "Minolta AF 28-105mm F3.5-4.5 Xi"},
1519
    {26151, "Minolta AF 28-105mm F3.5-4.5 xi"},
1520
    {26160, "Minolta AF 35-200mm F4.5-5.6 Xi"},
1521
    {26161, "Minolta AF 35-200mm F4.5-5.6 Xi"},
1522
    {26180, "Minolta AF 28-80mm F4-5.6 Xi"},
1523
    {26181, "Minolta AF 28-80mm F4-5.6 xi"},
1524
    {26190, "Minolta AF 80-200mm F4.5-5.6 Xi"},
1525
    {26191, "Minolta AF 80-200mm F4.5-5.6 Xi"},
1526
    {26201, "Minolta AF 28-70mm F2.8 G"},
1527
    {26210, "Minolta AF 100-300mm F4.5-5.6 Xi"},
1528
    {26211, "Minolta AF 100-300mm F4.5-5.6 xi"},
1529
    {26240, "Minolta AF 35-80mm F4-5.6 Power Zoom"},
1530
    {26241, "Minolta AF 35-80mm F4-5.6 Power Zoom"},
1531
    {26281, "Minolta AF 80-200mm F2.8 HS-APO G"},
1532
    {26291, "Minolta AF 85mm F1.4 New"},
1533
    {26311, "Minolta/Sony AF 100-300mm F4.5-5.6 APO"},
1534
    {26321, "Minolta AF 24-50mm F4 New"},
1535
    {26381, "Minolta AF 50mm F2.8 Macro New"},
1536
    {26391, "Minolta AF 100mm F2.8 Macro"},
1537
    {26411, "Minolta/Sony AF 20mm F2.8 New"},
1538
    {26421, "Minolta AF 24mm F2.8 New"},
1539
    {26441, "Minolta AF 100-400mm F4.5-6.7 APO"},
1540
    {26621, "Minolta AF 50mm F1.4 New"},
1541
    {26671, "Minolta AF 35mm F2 New"},
1542
    {26681, "Minolta AF 28mm F2 New"},
1543
    {26721, "Minolta AF 24-105mm F3.5-4.5 (D)"},
1544
    {45671, "Tokina 70-210mm F4-5.6"},
1545
    {45711, "Vivitar 70-210mm F4.5-5.6"},
1546
    {45741,
1547
     "Minolta AF200mm F2.8G x2 | "
1548
     "Tokina 300mm F2.8 x2 | "
1549
     "Tokina RF 500mm F8.0 x2 | "
1550
     "Tamron SP AF 90mm F2.5"},
1551
    {45751, "1.4x Teleconverter "},
1552
    {45851, "Tamron SP AF 300mm F2.8 LD IF"},
1553
    {45861, "Tamron SP AF 35-105mm F2.8 LD Aspherical IF"},
1554
    {45871, "Tamron AF 70-210mm F2.8 SP LD"},
1555
    {65280, "Sigma 16mm F2.8 Filtermatic Fisheye"},
1556
    {
1557
        0xffff,
1558
        "Manual lens | "             // 1
1559
        "Sony E 50mm F1.8 OSS | "    // 2
1560
        "E PZ 16-50mm F3.5-5.6 OSS"  // 3
1561
    },
1562
};
1563
1564
// ----------------------------------------------------------------------
1565
// #1145 begin - respect lenses with shared LensID
1566
1567
#if 0
1568
    // resolveLensTypeUsingExiftool has been debugged on the Mac
1569
    // It's not in service because:
1570
    // 1 we don't know the path to the file being processed
1571
    // 2 can't work for a remote file as exiftool doesn't handle remote IO
1572
    // 3 almost certainly throws an ugly ugly dos box on the screen in Windows
1573
    // 4 I haven't asked Phil's permission to do this
1574
    static std::ostream& resolveLensTypeUsingExiftool(std::ostream& os, const Value& value,
1575
                                                 const ExifData* metadata)
1576
    {
1577
// #if ! defined(_WIN32) && ! defined(__CYGWIN__) && ! defined(__MINGW__)
1578
#ifndef _MSC_VER
1579
        FILE* f = ::popen("/bin/bash -c \"exiftool ~/temp/screen.jpg | grep 'Lens ID' | cut -d: -f 2 | sed -E -e 's/^ //g'\"","r");
1580
        if ( f ) {
1581
            char buffer[200];
1582
            int  n=::fread(buffer,1,sizeof buffer-1,f);
1583
            ::pclose(f);
1584
            // just to be sure, add a null byte
1585
            if ( 0 <= n && n < (int) sizeof(buffer) ) buffer[n] = 0 ;
1586
1587
            // and stop at any non-printing character such as line-feed
1588
            for (int c = 0 ; c < 32 ; c++)
1589
                if ( ::strchr(buffer,c) )
1590
                    *::strchr(buffer,c)=0;
1591
            return os << buffer;
1592
        }
1593
#endif
1594
        return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1595
    }
1596
#endif
1597
1598
3.53k
static std::string getKeyString(const std::string& key, const ExifData* metadata) {
1599
3.53k
  std::string result;
1600
3.53k
  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
1601
1.59k
    result = metadata->findKey(ExifKey(key))->toString();
1602
1.59k
  }
1603
3.53k
  return result;
1604
3.53k
}
1605
1606
static long getKeyLong(const std::string& key, const ExifData* metadata, int which = 0);
1607
1.46k
static long getKeyLong(const std::string& key, const ExifData* metadata, int which) {
1608
1.46k
  long result = -1;
1609
1.46k
  if (metadata->findKey(ExifKey(key)) != metadata->end()) {
1610
643
    result = static_cast<long>(metadata->findKey(ExifKey(key))->toFloat(which));
1611
643
  }
1612
1.46k
  return result;
1613
1.46k
}
1614
1615
/*! http://stackoverflow.com/questions/1798112/removing-leading-and-trailing-spaces-from-a-string
1616
    trim from left
1617
*/
1618
120
static std::string& ltrim(std::string& s, const char* t = " \t\n\r\f\v") {
1619
120
  s.erase(0, s.find_first_not_of(t));
1620
120
  return s;
1621
120
}
1622
1623
//! trim from right
1624
120
static std::string& rtrim(std::string& s, const char* t = " \t\n\r\f\v") {
1625
120
  s.erase(s.find_last_not_of(t) + 1);
1626
120
  return s;
1627
120
}
1628
1629
//! trim from left & right
1630
120
static std::string& trim(std::string& s, const char* t = " \t\n\r\f\v") {
1631
120
  return ltrim(rtrim(s, t), t);
1632
120
}
1633
1634
// https://stackoverflow.com/questions/14265581/parse-split-a-string-in-c-using-string-delimiter-standard-c
1635
120
static std::vector<std::string> split(const std::string& str, const std::string& delim) {
1636
120
  std::vector<std::string> tokens;
1637
120
  size_t prev = 0;
1638
120
  size_t pos = 0;
1639
490
  while (pos < str.length() && prev < str.length()) {
1640
370
    pos = str.find(delim, prev);
1641
370
    if (pos == std::string::npos)
1642
120
      pos = str.length();
1643
370
    std::string token = str.substr(prev, pos - prev);
1644
370
    if (!token.empty())
1645
370
      tokens.push_back(std::move(token));
1646
370
    prev = pos + delim.length();
1647
370
  }
1648
120
  return tokens;
1649
120
}
1650
1651
58
static bool inRange(long value, long min, long max) {
1652
58
  return min <= value && value <= max;
1653
58
}
1654
1655
120
static std::ostream& resolvedLens(std::ostream& os, long lensID, long index) {
1656
120
  auto td = Exiv2::find(minoltaSonyLensID, lensID);
1657
120
  std::vector<std::string> tokens = split(td[0].label_, "|");
1658
120
  return os << _(trim(tokens.at(index - 1)).c_str());
1659
120
}
1660
1661
148
static std::ostream& resolveLens0x1c(std::ostream& os, const Value& value, const ExifData* metadata) {
1662
148
  try {
1663
148
    long index = 0;
1664
1665
148
    std::string model = getKeyString("Exif.Image.Model", metadata);
1666
148
    std::string lens = getKeyString("Exif.Photo.LensModel", metadata);
1667
1668
148
    if (model == "SLT-A77V" && lens == "100mm F2.8 Macro") {
1669
0
      index = 2;
1670
0
    }
1671
1672
148
    if (index > 0) {
1673
0
      const long lensID = 0x1c;
1674
0
      return resolvedLens(os, lensID, index);
1675
0
    }
1676
148
  } catch (...) {
1677
0
  }
1678
148
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1679
148
}
1680
1681
177
static std::ostream& resolveLens0x29(std::ostream& os, const Value& value, const ExifData* metadata) {
1682
177
  try {
1683
177
    long index = 0;
1684
1685
177
    std::string model = getKeyString("Exif.Image.Model", metadata);
1686
177
    std::string lens = getKeyString("Exif.Photo.LensModel", metadata);
1687
1688
177
    if (model == "SLT-A77V" && lens == "DT 11-18mm F4.5-5.6") {
1689
0
      index = 2;
1690
0
    }
1691
1692
177
    if (index > 0) {
1693
0
      const long lensID = 0x29;
1694
0
      return resolvedLens(os, lensID, index);
1695
0
    }
1696
177
  } catch (...) {
1697
0
  }
1698
177
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1699
177
}
1700
1701
370
static std::ostream& resolveLens0x34(std::ostream& os, const Value& value, const ExifData* metadata) {
1702
370
  try {
1703
370
    long index = 0;
1704
1705
370
    std::string model = getKeyString("Exif.Image.Model", metadata);
1706
370
    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
1707
370
    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
1708
1709
    // F2_8
1710
370
    if (model == "SLT-A77V" && maxAperture == "760/256") {
1711
0
      index = 4;
1712
0
    }
1713
370
    if (model == "SLT-A77V" && inRange(focalLength, 70, 300)) {
1714
10
      index = 3;
1715
10
    }
1716
1717
370
    if (index > 0) {
1718
10
      const long lensID = 0x34;
1719
10
      return resolvedLens(os, lensID, index);
1720
10
    }
1721
370
  } catch (...) {
1722
152
  }
1723
360
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1724
370
}
1725
1726
456
static std::ostream& resolveLens0x80(std::ostream& os, const Value& value, const ExifData* metadata) {
1727
456
  try {
1728
456
    long index = 0;
1729
1730
456
    std::string model = getKeyString("Exif.Image.Model", metadata);
1731
456
    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
1732
456
    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
1733
1734
    // F4
1735
456
    if (model == "SLT-A77V" && maxAperture == "1024/256" && inRange(focalLength, 18, 200)) {
1736
0
      index = 2;
1737
0
    }
1738
1739
456
    if (index > 0) {
1740
0
      const long lensID = 0x80;
1741
0
      return resolvedLens(os, lensID, index);
1742
0
    }
1743
456
  } catch (...) {
1744
108
  }
1745
456
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1746
456
}
1747
1748
636
static std::ostream& resolveLens0xff(std::ostream& os, const Value& value, const ExifData* metadata) {
1749
636
  try {
1750
636
    long index = 0;
1751
1752
636
    std::string model = getKeyString("Exif.Image.Model", metadata);
1753
636
    long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
1754
636
    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
1755
1756
    // F2_8
1757
636
    if (model == "SLT-A77V" && maxAperture == "760/256" && inRange(focalLength, 17, 50)) {
1758
0
      index = 1;
1759
0
    }
1760
1761
636
    if (index > 0) {
1762
0
      const long lensID = 0xff;
1763
0
      return resolvedLens(os, lensID, index);
1764
0
    }
1765
636
  } catch (...) {
1766
264
  }
1767
636
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1768
636
}
1769
1770
110
static std::ostream& resolveLens0xffff(std::ostream& os, const Value& value, const ExifData* metadata) {
1771
110
  try {
1772
110
    long index = 1;
1773
1774
    // #1153
1775
110
    std::string model = getKeyString("Exif.Image.Model", metadata);
1776
110
    std::string maxAperture = getKeyString("Exif.Photo.MaxApertureValue", metadata);
1777
1778
110
    std::string F1_8 = "434/256";
1779
110
    static constexpr const char* maxApertures[] = {
1780
110
        "926/256",   // F3.5
1781
110
        "1024/256",  // F4
1782
110
        "1110/256",  // F4.5
1783
110
        "1188/256",  // F5
1784
110
        "1272/256",  // F5.6
1785
110
    };
1786
1787
110
    if (model == "ILCE-6000" && maxAperture == F1_8)
1788
0
      try {
1789
0
        long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
1790
0
        if (focalLength > 0) {
1791
0
          long focalL35mm = getKeyLong("Exif.Photo.FocalLengthIn35mmFilm", metadata);
1792
0
          long focalRatio = (focalL35mm * 100) / focalLength;
1793
0
          if (inRange(focalRatio, 145, 155))
1794
0
            index = 2;
1795
0
        }
1796
0
      } catch (...) {
1797
0
      }
1798
1799
110
    if (model == "ILCE-6000" && Exiv2::find(maxApertures, maxAperture))
1800
0
      try {
1801
0
        long focalLength = getKeyLong("Exif.Photo.FocalLength", metadata);
1802
0
        if (focalLength > 0) {
1803
0
          long focalL35mm = getKeyLong("Exif.Photo.FocalLengthIn35mmFilm", metadata);
1804
0
          long focalRatio = (focalL35mm * 100) / focalLength;
1805
0
          if (inRange(focalRatio, 145, 155))
1806
0
            index = 3;
1807
0
        }
1808
0
      } catch (...) {
1809
0
      }
1810
1811
110
    if (index > 0) {
1812
110
      const long lensID = 0xffff;
1813
110
      return resolvedLens(os, lensID, index);
1814
110
    }
1815
110
  } catch (...) {
1816
0
  }
1817
1818
0
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1819
110
}
1820
1821
5.05k
std::ostream& printMinoltaSonyLensID(std::ostream& os, const Value& value, const ExifData* metadata) {
1822
  //! List of lens ids which require special treatment from printMinoltaSonyLensID
1823
5.05k
  static constexpr struct LensIdFct {
1824
5.05k
    uint32_t idx;
1825
5.05k
    PrintFct fct;
1826
1827
11.0k
    bool operator==(uint32_t i) const {
1828
11.0k
      return i == idx;
1829
11.0k
    }
1830
5.05k
  } lensIdFct[] = {
1831
5.05k
      {0x001cu, &resolveLens0x1c}, {0x0029u, &resolveLens0x29}, {0x0034u, &resolveLens0x34},
1832
5.05k
      {0x0080u, &resolveLens0x80}, {0x00ffu, &resolveLens0xff}, {0xffffu, &resolveLens0xffff},
1833
      //{0x00ffu, &resolveLensTypeUsingExiftool}, // was used for debugging
1834
5.05k
  };
1835
  // #1145 end - respect lenses with shared LensID
1836
  // ----------------------------------------------------------------------
1837
1838
  // #1034
1839
5.05k
  const std::string undefined("undefined");
1840
5.05k
  const std::string minolta("minolta");
1841
5.05k
  const std::string sony("sony");
1842
5.05k
  if (Internal::readExiv2Config(minolta, value.toString(), undefined) != undefined) {
1843
0
    return os << Internal::readExiv2Config(minolta, value.toString(), undefined);
1844
0
  }
1845
5.05k
  if (Internal::readExiv2Config(sony, value.toString(), undefined) != undefined) {
1846
0
    return os << Internal::readExiv2Config(sony, value.toString(), undefined);
1847
0
  }
1848
1849
  // #1145 - respect lenses with shared LensID
1850
5.05k
  uint32_t index = value.toUint32();
1851
5.05k
  if (metadata)
1852
2.52k
    if (auto f = Exiv2::find(lensIdFct, index))
1853
1.89k
      return f->fct(os, value, metadata);
1854
3.15k
  return EXV_PRINT_TAG(minoltaSonyLensID)(os, value, metadata);
1855
5.05k
}
1856
1857
// ----------------------------------------------------------------------------------------------------
1858
1859
//! Lookup table to translate Minolta A100 and all other Sony Alpha camera color mode values to readable labels
1860
constexpr TagDetails minoltaSonyColorMode[] = {
1861
    {0, N_("Standard")}, {1, N_("Vivid Color")},         {2, N_("Portrait")},        {3, N_("Landscape")},
1862
    {4, N_("Sunset")},   {5, N_("Night View/Portrait")}, {6, N_("Black & White")},   {7, N_("AdobeRGB")},
1863
    {12, N_("Neutral")}, {100, N_("Neutral")},           {101, N_("Clear")},         {102, N_("Deep")},
1864
    {103, N_("Light")},  {104, N_("Night View")},        {105, N_("Autumn Leaves")},
1865
};
1866
1867
196
std::ostream& printMinoltaSonyColorMode(std::ostream& os, const Value& value, const ExifData* metadata) {
1868
196
  return EXV_PRINT_TAG(minoltaSonyColorMode)(os, value, metadata);
1869
196
}
1870
1871
// ----------------------------------------------------------------------------------------------------
1872
1873
//! Lookup table to translate Minolta/Sony bool function values to readable labels
1874
constexpr TagDetails minoltaSonyBoolFunction[] = {
1875
    {0, N_("Off")},
1876
    {1, N_("On")},
1877
};
1878
1879
3.87k
std::ostream& printMinoltaSonyBoolValue(std::ostream& os, const Value& value, const ExifData* metadata) {
1880
3.87k
  return EXV_PRINT_TAG(minoltaSonyBoolFunction)(os, value, metadata);
1881
3.87k
}
1882
1883
// ----------------------------------------------------------------------------------------------------
1884
1885
//! Lookup table to translate Minolta/Sony bool inverse function values to readable labels
1886
constexpr TagDetails minoltaSonyBoolInverseFunction[] = {
1887
    {0, N_("On")},
1888
    {1, N_("Off")},
1889
};
1890
1891
906
std::ostream& printMinoltaSonyBoolInverseValue(std::ostream& os, const Value& value, const ExifData* metadata) {
1892
906
  return EXV_PRINT_TAG(minoltaSonyBoolInverseFunction)(os, value, metadata);
1893
906
}
1894
1895
// ----------------------------------------------------------------------------------------------------
1896
1897
//! Lookup table to translate Sony camera settings focus mode values to readable labels
1898
constexpr TagDetails minoltaSonyAFAreaMode[] = {
1899
    {0, N_("Wide")},
1900
    {1, N_("Local")},
1901
    {2, N_("Spot")},
1902
};
1903
1904
712
std::ostream& printMinoltaSonyAFAreaMode(std::ostream& os, const Value& value, const ExifData* metadata) {
1905
712
  return EXV_PRINT_TAG(minoltaSonyAFAreaMode)(os, value, metadata);
1906
712
}
1907
1908
// ----------------------------------------------------------------------------------------------------
1909
1910
//! Lookup table to translate Sony camera settings Local AF Area Point values to readable labels
1911
constexpr TagDetails minoltaSonyLocalAFAreaPoint[] = {
1912
    {1, N_("Center")},       {2, N_("Top")},        {3, N_("Top-Right")},   {4, N_("Right")},
1913
    {5, N_("Bottom-Right")}, {6, N_("Bottom")},     {7, N_("Bottom-Left")}, {8, N_("Left")},
1914
    {9, N_("Top-Left")},     {10, N_("Far-Right")}, {11, N_("Far-Left")},
1915
};
1916
1917
712
std::ostream& printMinoltaSonyLocalAFAreaPoint(std::ostream& os, const Value& value, const ExifData* metadata) {
1918
712
  return EXV_PRINT_TAG(minoltaSonyLocalAFAreaPoint)(os, value, metadata);
1919
712
}
1920
1921
// ----------------------------------------------------------------------------------------------------
1922
1923
//! Lookup table to translate Sony camera settings dynamic range optimizer mode values to readable labels
1924
constexpr TagDetails minoltaSonyDynamicRangeOptimizerMode[] = {
1925
    {0, N_("Off")}, {1, N_("Standard")}, {2, N_("Advanced Auto")}, {3, N_("Advanced Level")}, {4097, N_("Auto")},
1926
};
1927
1928
std::ostream& printMinoltaSonyDynamicRangeOptimizerMode(std::ostream& os, const Value& value,
1929
908
                                                        const ExifData* metadata) {
1930
908
  return EXV_PRINT_TAG(minoltaSonyDynamicRangeOptimizerMode)(os, value, metadata);
1931
908
}
1932
1933
// ----------------------------------------------------------------------------------------------------
1934
1935
//! Lookup table to translate Sony camera settings priority setup shutter release values to readable labels
1936
constexpr TagDetails minoltaSonyPrioritySetupShutterRelease[] = {
1937
    {0, N_("AF")},
1938
    {1, N_("Release")},
1939
};
1940
1941
std::ostream& printMinoltaSonyPrioritySetupShutterRelease(std::ostream& os, const Value& value,
1942
646
                                                          const ExifData* metadata) {
1943
646
  return EXV_PRINT_TAG(minoltaSonyPrioritySetupShutterRelease)(os, value, metadata);
1944
646
}
1945
1946
// ----------------------------------------------------------------------------------------------------
1947
1948
//! Lookup table to translate Sony camera settings quality values to readable labels
1949
constexpr TagDetails minoltaSonyQualityCs[] = {
1950
    {0, N_("RAW")},       {2, N_("CRAW")},       {16, N_("Extra Fine")}, {32, N_("Fine")},
1951
    {34, N_("RAW+JPEG")}, {35, N_("CRAW+JPEG")}, {48, N_("Standard")},
1952
};
1953
1954
554
std::ostream& printMinoltaSonyQualityCs(std::ostream& os, const Value& value, const ExifData* metadata) {
1955
554
  return EXV_PRINT_TAG(minoltaSonyQualityCs)(os, value, metadata);
1956
554
}
1957
1958
// ----------------------------------------------------------------------------------------------------
1959
1960
//! Lookup table to translate Sony camera settings rotation values to readable labels
1961
constexpr TagDetails minoltaSonyRotation[] = {
1962
    {0, N_("Horizontal (normal)")},
1963
    {1, N_("Rotate 90 CW")},
1964
    {2, N_("Rotate 270 CW")},
1965
};
1966
1967
592
std::ostream& printMinoltaSonyRotation(std::ostream& os, const Value& value, const ExifData* metadata) {
1968
592
  return EXV_PRINT_TAG(minoltaSonyRotation)(os, value, metadata);
1969
592
}
1970
1971
// ----------------------------------------------------------------------------------------------------
1972
1973
//! Lookup table to translate Minolta/Sony scene mode values to readable labels
1974
constexpr TagDetails minoltaSonySceneMode[] = {
1975
    {0, N_("Standard")},
1976
    {1, N_("Portrait")},
1977
    {2, N_("Text")},
1978
    {3, N_("Night Scene")},
1979
    {4, N_("Sunset")},
1980
    {5, N_("Sports")},
1981
    {6, N_("Landscape")},
1982
    {7, N_("Night Portrait")},
1983
    {8, N_("Macro")},
1984
    {9, N_("Super Macro")},
1985
    {16, N_("Auto")},
1986
    {17, N_("Night View/Portrait")},
1987
    {18, N_("Sweep Panorama")},
1988
    {19, N_("Handheld Night Shot")},
1989
    {20, N_("Anti Motion Blur")},
1990
    {21, N_("Cont. Priority AE")},
1991
    {22, N_("Auto+")},
1992
    {23, N_("3D Sweep Panorama")},
1993
    {24, N_("Superior Auto")},
1994
    {25, N_("High Sensitivity")},
1995
    {26, N_("Fireworks")},
1996
    {27, N_("Food")},
1997
    {28, N_("Pet")},
1998
    {33, N_("HDR")},
1999
    {0xffff, N_("n/a")},
2000
};
2001
2002
3.24k
std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, const ExifData* metadata) {
2003
3.24k
  return EXV_PRINT_TAG(minoltaSonySceneMode)(os, value, metadata);
2004
3.24k
}
2005
2006
// ----------------------------------------------------------------------------------------------------
2007
2008
//! Lookup table to translate Sony/Minolta teleconverter model values to readable labels
2009
constexpr TagDetails minoltaSonyTeleconverterModel[] = {
2010
    {0x00, N_("None")},
2011
    {0x04, N_("Minolta/Sony AF 1.4x APO (D) (0x04)")},
2012
    {0x05, N_("Minolta/Sony AF 2x APO (D) (0x05)")},
2013
    {0x48, N_("Minolta/Sony AF 2x APO (D)")},
2014
    {0x50, N_("Minolta AF 2x APO II")},
2015
    {0x60, N_("Minolta AF 2x APO")},
2016
    {0x88, N_("Minolta/Sony AF 1.4x APO (D)")},
2017
    {0x90, N_("Minolta AF 1.4x APO II")},
2018
    {0xa0, N_("Minolta AF 1.4x APO")},
2019
};
2020
2021
514
std::ostream& printMinoltaSonyTeleconverterModel(std::ostream& os, const Value& value, const ExifData* metadata) {
2022
514
  return EXV_PRINT_TAG(minoltaSonyTeleconverterModel)(os, value, metadata);
2023
514
}
2024
2025
// ----------------------------------------------------------------------------------------------------
2026
2027
//! Lookup table to translate Sony/Minolta zone matching values to readable labels
2028
constexpr TagDetails minoltaSonyZoneMatching[] = {
2029
    {0, N_("ISO Setting Used")},
2030
    {1, N_("High Key")},
2031
    {2, N_("Low Key")},
2032
};
2033
2034
196
std::ostream& printMinoltaSonyZoneMatching(std::ostream& os, const Value& value, const ExifData* metadata) {
2035
196
  return EXV_PRINT_TAG(minoltaSonyZoneMatching)(os, value, metadata);
2036
196
}
2037
2038
}  // namespace Exiv2::Internal