Update Sony(1|2) tags (#2323)

* Update Sony(1|2) group (minor Minolta changes)

Transcribe all tags (except for `LensID`) from main ExifTool Sony
group into Exiv2.
Changes include:
- Rename `ColorReproduction` -> `CreativeStyle` and
  `LongExposureNoiseReduction` -> `FocusMode3` to reflect use.
- Rename `0x*` tagnames to equivalent ExifTool tags (e.g.,
  `0x2006` -> `Sharpness`).
- Remove tag entries that are Groups (e.g., `ShotInfo`).
- Separate some common Sony/Minolta data as the camera types use
  different values (e.g., `Quality`)
- Additional `exiv2-Sony*.exv` test files come from ExifTool Sony
  samples (https://exiftool.org/Sony.tar.gz).

ExifTool Sony tags sources:
https://www.exiftool.org/TagNames/Sony.html
1e17485cbb/lib/Image/ExifTool/Sony.pm

* Improve coverage of `Sony(1|2)` group

* Fix clang compilation on macOS

* Fix github-code-scanning warnings

* Fix minor `Exif.Sony(1|2)` problems

* Fix tests and update `Sony(1|2)` group coverage

* Fix testing

* Minor fixes and regenerate Regression data

* Update Sony tags with `getModel()`

Make finding the Sony model more resilient by also using
`SonyModelID`.

* Fix `Exif.Sony(1|2).AFPointsUsed` type

* Improve `Exif.Sony(1|2).*` coverage

* Fix types in Sony func `getFocusMode()`

* Update Regression tests for `Sony(1|2)`

* Minor fixes to `Sony(1|2)` tags

* Update `Sony(1|2)` tag coverage

* Improve `Sony(1|2)` tag coverage

* Update easyaccess with `Exif.Sony(1|2)` tags

* Update `SonyModelID` array comment

* Add Sony `LensSpec` tag to easyaccess

* Update `Sony(1|2)` label/descriptions

* Update `int` to `size_t` (credit:@kevinbackhouse)

* Fix Windows build warning in `src/tags_int.hpp`
main
Peter 3 years ago committed by GitHub
parent 84f566b4b7
commit 9dc34ad39c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -134,7 +134,7 @@ int main(int argc, char* const argv[]) {
Exiv2::ExifData edMn9; Exiv2::ExifData edMn9;
edMn9["Exif.Image.Make"] = "SONY"; edMn9["Exif.Image.Make"] = "SONY";
edMn9["Exif.Image.Model"] = "DSC-W7"; edMn9["Exif.Image.Model"] = "DSC-W7";
edMn9["Exif.Sony1.0x2000"] = "0 1 2 3 4 5"; edMn9["Exif.Sony1.Quality"] = static_cast<uint32_t>(2);
write(file, edMn9); write(file, edMn9);
print(file); print(file);

@ -163,10 +163,11 @@ ExifData::const_iterator flashBias(const ExifData& ed) {
ExifData::const_iterator exposureMode(const ExifData& ed) { ExifData::const_iterator exposureMode(const ExifData& ed) {
static const char* keys[] = { static const char* keys[] = {
"Exif.Photo.ExposureProgram", "Exif.Image.ExposureProgram", "Exif.CanonCs.ExposureProgram", "Exif.Photo.ExposureProgram", "Exif.Image.ExposureProgram", "Exif.CanonCs.ExposureProgram",
"Exif.MinoltaCs7D.ExposureMode", "Exif.MinoltaCs5D.ExposureMode", "Exif.MinoltaCsNew.ExposureMode", "Exif.MinoltaCs7D.ExposureMode", "Exif.MinoltaCs5D.ExposureMode", "Exif.MinoltaCsNew.ExposureMode",
"Exif.MinoltaCsOld.ExposureMode", "Exif.Sony1MltCsA100.ExposureMode", "Exif.Sony1Cs.ExposureProgram", "Exif.MinoltaCsOld.ExposureMode", "Exif.Sony1.ExposureMode", "Exif.Sony2.ExposureMode",
"Exif.Sony2Cs.ExposureProgram", "Exif.Sigma.ExposureMode"}; "Exif.Sony1Cs.ExposureProgram", "Exif.Sony2Cs.ExposureProgram", "Exif.Sony1MltCsA100.ExposureMode",
"Exif.Sigma.ExposureMode"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -196,27 +197,28 @@ ExifData::const_iterator macroMode(const ExifData& ed) {
} }
ExifData::const_iterator imageQuality(const ExifData& ed) { ExifData::const_iterator imageQuality(const ExifData& ed) {
static const char* keys[] = {"Exif.CanonCs.Quality", "Exif.Fujifilm.Quality", "Exif.Sigma.Quality", static const char* keys[] = {"Exif.CanonCs.Quality", "Exif.Fujifilm.Quality", "Exif.Sigma.Quality",
"Exif.Nikon1.Quality", "Exif.Nikon2.Quality", "Exif.Nikon3.Quality", "Exif.Nikon1.Quality", "Exif.Nikon2.Quality", "Exif.Nikon3.Quality",
"Exif.Olympus.Quality", "Exif.OlympusCs.Quality", "Exif.Panasonic.Quality", "Exif.Olympus.Quality", "Exif.OlympusCs.Quality", "Exif.Panasonic.Quality",
"Exif.Minolta.Quality", "Exif.MinoltaCsNew.Quality", "Exif.MinoltaCsOld.Quality", "Exif.Sony1.JPEGQuality", "Exif.Sony1.Quality", "Exif.Sony1.Quality2",
"Exif.MinoltaCs5D.Quality", "Exif.MinoltaCs7D.Quality", "Exif.Sony1MltCsA100.Quality", "Exif.Sony1Cs.Quality", "Exif.Sony2.JPEGQuality", "Exif.Sony2.Quality",
"Exif.Sony1.JPEGQuality", "Exif.Sony1.Quality", "Exif.Sony1Cs.Quality", "Exif.Sony2.Quality2", "Exif.Sony2Cs.Quality", "Exif.Minolta.Quality",
"Exif.Sony2.JPEGQuality", "Exif.Sony2.Quality", "Exif.Sony2Cs.Quality", "Exif.MinoltaCsNew.Quality", "Exif.MinoltaCsOld.Quality", "Exif.MinoltaCs5D.Quality",
"Exif.Casio.Quality", "Exif.Casio2.QualityMode", "Exif.Casio2.Quality"}; "Exif.MinoltaCs7D.Quality", "Exif.Sony1MltCsA100.Quality", "Exif.Casio.Quality",
"Exif.Casio2.QualityMode", "Exif.Casio2.Quality"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
ExifData::const_iterator whiteBalance(const ExifData& ed) { ExifData::const_iterator whiteBalance(const ExifData& ed) {
static const char* keys[] = { static const char* keys[] = {
"Exif.CanonSi.WhiteBalance", "Exif.Fujifilm.WhiteBalance", "Exif.Sigma.WhiteBalance", "Exif.CanonSi.WhiteBalance", "Exif.Fujifilm.WhiteBalance", "Exif.Sigma.WhiteBalance",
"Exif.Nikon1.WhiteBalance", "Exif.Nikon2.WhiteBalance", "Exif.Nikon3.WhiteBalance", "Exif.Nikon1.WhiteBalance", "Exif.Nikon2.WhiteBalance", "Exif.Nikon3.WhiteBalance",
"Exif.Olympus.WhiteBalance", "Exif.OlympusCs.WhiteBalance", "Exif.Panasonic.WhiteBalance", "Exif.Olympus.WhiteBalance", "Exif.OlympusCs.WhiteBalance", "Exif.Panasonic.WhiteBalance",
"Exif.MinoltaCs5D.WhiteBalance", "Exif.MinoltaCs7D.WhiteBalance", "Exif.MinoltaCsNew.WhiteBalance", "Exif.MinoltaCs5D.WhiteBalance", "Exif.MinoltaCs7D.WhiteBalance", "Exif.MinoltaCsNew.WhiteBalance",
"Exif.MinoltaCsOld.WhiteBalance", "Exif.Minolta.WhiteBalance", "Exif.Sony1MltCsA100.WhiteBalance", "Exif.MinoltaCsOld.WhiteBalance", "Exif.Minolta.WhiteBalance", "Exif.Sony1.WhiteBalance",
"Exif.SonyMinolta.WhiteBalance", "Exif.Sony1.WhiteBalance", "Exif.Sony2.WhiteBalance", "Exif.Sony2.WhiteBalance", "Exif.Sony1.WhiteBalance2", "Exif.Sony2.WhiteBalance2",
"Exif.Sony1.WhiteBalance2", "Exif.Sony2.WhiteBalance2", "Exif.Casio.WhiteBalance", "Exif.Sony1MltCsA100.WhiteBalance", "Exif.SonyMinolta.WhiteBalance", "Exif.Casio.WhiteBalance",
"Exif.Casio2.WhiteBalance", "Exif.Casio2.WhiteBalance2", "Exif.Photo.WhiteBalance"}; "Exif.Casio2.WhiteBalance", "Exif.Casio2.WhiteBalance2", "Exif.Photo.WhiteBalance"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -226,8 +228,9 @@ ExifData::const_iterator lensName(const ExifData& ed) {
"Exif.CanonCs.LensType", "Exif.Photo.LensModel", "Exif.NikonLd1.LensIDNumber", "Exif.CanonCs.LensType", "Exif.Photo.LensModel", "Exif.NikonLd1.LensIDNumber",
"Exif.NikonLd2.LensIDNumber", "Exif.NikonLd3.LensIDNumber", "Exif.Pentax.LensType", "Exif.NikonLd2.LensIDNumber", "Exif.NikonLd3.LensIDNumber", "Exif.Pentax.LensType",
"Exif.PentaxDng.LensType", "Exif.Minolta.LensID", "Exif.SonyMinolta.LensID", "Exif.PentaxDng.LensType", "Exif.Minolta.LensID", "Exif.SonyMinolta.LensID",
"Exif.Sony1.LensID", "Exif.Sony2.LensID", "Exif.OlympusEq.LensType", "Exif.Sony1.LensID", "Exif.Sony2.LensID", "Exif.Sony1.LensSpec",
"Exif.Panasonic.LensType", "Exif.Samsung2.LensType"}; "Exif.Sony2.LensSpec", "Exif.OlympusEq.LensType", "Exif.Panasonic.LensType",
"Exif.Samsung2.LensType"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -237,7 +240,8 @@ ExifData::const_iterator saturation(const ExifData& ed) {
"Exif.MinoltaCsOld.Saturation", "Exif.MinoltaCs7D.Saturation", "Exif.MinoltaCs5D.Saturation", "Exif.MinoltaCsOld.Saturation", "Exif.MinoltaCs7D.Saturation", "Exif.MinoltaCs5D.Saturation",
"Exif.Fujifilm.Color", "Exif.Nikon3.Saturation", "Exif.Panasonic.Saturation", "Exif.Fujifilm.Color", "Exif.Nikon3.Saturation", "Exif.Panasonic.Saturation",
"Exif.Pentax.Saturation", "Exif.PentaxDng.Saturation", "Exif.Sigma.Saturation", "Exif.Pentax.Saturation", "Exif.PentaxDng.Saturation", "Exif.Sigma.Saturation",
"Exif.Casio.Saturation", "Exif.Casio2.Saturation", "Exif.Casio2.Saturation2"}; "Exif.Sony1.Saturation", "Exif.Sony2.Saturation", "Exif.Casio.Saturation",
"Exif.Casio2.Saturation", "Exif.Casio2.Saturation2"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -247,19 +251,18 @@ ExifData::const_iterator sharpness(const ExifData& ed) {
"Exif.MinoltaCsNew.Sharpness", "Exif.MinoltaCsOld.Sharpness", "Exif.MinoltaCs7D.Sharpness", "Exif.MinoltaCsNew.Sharpness", "Exif.MinoltaCsOld.Sharpness", "Exif.MinoltaCs7D.Sharpness",
"Exif.MinoltaCs5D.Sharpness", "Exif.Olympus.SharpnessFactor", "Exif.Panasonic.Sharpness", "Exif.MinoltaCs5D.Sharpness", "Exif.Olympus.SharpnessFactor", "Exif.Panasonic.Sharpness",
"Exif.Pentax.Sharpness", "Exif.PentaxDng.Sharpness", "Exif.Sigma.Sharpness", "Exif.Pentax.Sharpness", "Exif.PentaxDng.Sharpness", "Exif.Sigma.Sharpness",
"Exif.Casio.Sharpness", "Exif.Casio2.Sharpness", "Exif.Casio2.Sharpness2"}; "Exif.Sony1.Sharpness", "Exif.Sony2.Sharpness", "Exif.Casio.Sharpness",
"Exif.Casio2.Sharpness", "Exif.Casio2.Sharpness2"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
ExifData::const_iterator contrast(const ExifData& ed) { ExifData::const_iterator contrast(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.Contrast", "Exif.CanonCs.Contrast", static const char* keys[] = {"Exif.Photo.Contrast", "Exif.CanonCs.Contrast", "Exif.Fujifilm.Tone",
"Exif.Fujifilm.Tone", "Exif.MinoltaCsNew.Contrast", "Exif.MinoltaCsNew.Contrast", "Exif.MinoltaCsOld.Contrast", "Exif.MinoltaCs7D.Contrast",
"Exif.MinoltaCsOld.Contrast", "Exif.MinoltaCs7D.Contrast", "Exif.MinoltaCs5D.Contrast", "Exif.Olympus.Contrast", "Exif.Panasonic.Contrast",
"Exif.MinoltaCs5D.Contrast", "Exif.Olympus.Contrast", "Exif.Pentax.Contrast", "Exif.PentaxDng.Contrast", "Exif.Sigma.Contrast",
"Exif.Panasonic.Contrast", "Exif.Pentax.Contrast", "Exif.Sony1.Contrast", "Exif.Sony2.Contrast", "Exif.Casio.Contrast",
"Exif.PentaxDng.Contrast", "Exif.Sigma.Contrast", "Exif.Casio2.Contrast", "Exif.Casio2.Contrast2"
"Exif.Casio.Contrast", "Exif.Casio2.Contrast",
"Exif.Casio2.Contrast2"
}; };
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
@ -271,8 +274,9 @@ ExifData::const_iterator sceneCaptureType(const ExifData& ed) {
} }
ExifData::const_iterator meteringMode(const ExifData& ed) { ExifData::const_iterator meteringMode(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.MeteringMode", "Exif.Image.MeteringMode", "Exif.CanonCs.MeteringMode", static const char* keys[] = {"Exif.Photo.MeteringMode", "Exif.Image.MeteringMode",
"Exif.Sony1MltCsA100.MeteringMode"}; "Exif.CanonCs.MeteringMode", "Exif.Sony1.MeteringMode2",
"Exif.Sony2.MeteringMode2", "Exif.Sony1MltCsA100.MeteringMode"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -282,7 +286,7 @@ ExifData::const_iterator make(const ExifData& ed) {
} }
ExifData::const_iterator model(const ExifData& ed) { ExifData::const_iterator model(const ExifData& ed) {
static const char* keys[] = {"Exif.Image.Model"}; static const char* keys[] = {"Exif.Image.Model", "Exif.Sony1.SonyModelID", "Exif.Sony2.SonyModelID"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -307,7 +311,8 @@ ExifData::const_iterator apertureValue(const ExifData& ed) {
} }
ExifData::const_iterator brightnessValue(const ExifData& ed) { ExifData::const_iterator brightnessValue(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.BrightnessValue", "Exif.Image.BrightnessValue"}; static const char* keys[] = {"Exif.Photo.BrightnessValue", "Exif.Image.BrightnessValue", "Exif.Sony1.Brightness",
"Exif.Sony2.Brightness"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -337,14 +342,16 @@ ExifData::const_iterator lightSource(const ExifData& ed) {
} }
ExifData::const_iterator flash(const ExifData& ed) { ExifData::const_iterator flash(const ExifData& ed) {
static const char* keys[] = {"Exif.Photo.Flash", "Exif.Image.Flash"}; static const char* keys[] = {"Exif.Photo.Flash", "Exif.Image.Flash", "Exif.Sony1.FlashAction",
"Exif.Sony2.FlashAction"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
ExifData::const_iterator serialNumber(const ExifData& ed) { ExifData::const_iterator serialNumber(const ExifData& ed) {
static const char* keys[] = { static const char* keys[] = {
"Exif.Image.CameraSerialNumber", "Exif.Canon.SerialNumber", "Exif.Nikon3.SerialNumber", "Exif.Nikon3.SerialNO", "Exif.Image.CameraSerialNumber", "Exif.Canon.SerialNumber", "Exif.Nikon3.SerialNumber",
"Exif.Fujifilm.SerialNumber", "Exif.Olympus.SerialNumber2", "Exif.Sigma.SerialNumber"}; "Exif.Nikon3.SerialNO", "Exif.Fujifilm.SerialNumber", "Exif.Olympus.SerialNumber2",
"Exif.Sigma.SerialNumber", "Exif.Sony1.SerialNumber", "Exif.Sony2.SerialNumber"};
return findMetadatum(ed, keys, std::size(keys)); return findMetadatum(ed, keys, std::size(keys));
} }
@ -392,6 +399,8 @@ ExifData::const_iterator afPoint(const ExifData& ed) {
"Exif.Pentax.AFPointInFocus", "Exif.Pentax.AFPointInFocus",
"Exif.PentaxDng.AFPoint", "Exif.PentaxDng.AFPoint",
"Exif.PentaxDng.AFPointInFocus", "Exif.PentaxDng.AFPointInFocus",
"Exif.Sony1.AFPointSelected",
"Exif.Sony2.AFPointSelected",
"Exif.Sony1Cs.LocalAFAreaPoint", "Exif.Sony1Cs.LocalAFAreaPoint",
"Exif.Sony2Cs.LocalAFAreaPoint", "Exif.Sony2Cs.LocalAFAreaPoint",
"Exif.Sony1Cs2.LocalAFAreaPoint", "Exif.Sony1Cs2.LocalAFAreaPoint",

@ -18,6 +18,14 @@
namespace Exiv2::Internal { namespace Exiv2::Internal {
// -- Standard Minolta Makernotes tags --------------------------------------------------------------- // -- Standard Minolta Makernotes tags ---------------------------------------------------------------
//! Lookup table to translate Minolta Std (tag 0x0115) white balance values to readable labels
constexpr TagDetails minoltaWhiteBalanceStd0x0115[] = {
{0x00, N_("Auto")}, {0x01, N_("Color Temperature/Color Filter")},
{0x10, N_("Daylight")}, {0x20, N_("Cloudy")},
{0x30, N_("Shade")}, {0x40, N_("Tungsten")},
{0x50, N_("Flash")}, {0x60, N_("Fluorescent")},
{0x70, N_("Custom")}};
//! Lookup table to translate Minolta color mode values to readable labels //! Lookup table to translate Minolta color mode values to readable labels
constexpr TagDetails minoltaColorMode[] = { constexpr TagDetails minoltaColorMode[] = {
{0, N_("Natural Color")}, {1, N_("Black & White")}, {2, N_("Vivid Color")}, {3, N_("Solarization")}, {0, N_("Natural Color")}, {1, N_("Black & White")}, {2, N_("Vivid Color")}, {3, N_("Solarization")},
@ -26,9 +34,8 @@ constexpr TagDetails minoltaColorMode[] = {
{17, N_("Night Scene")}, {18, N_("Night Portrait")}}; {17, N_("Night Scene")}, {18, N_("Night Portrait")}};
//! Lookup table to translate Minolta image quality values to readable labels //! Lookup table to translate Minolta image quality values to readable labels
[[maybe_unused]] constexpr TagDetails minoltaImageQuality[] = {{0, N_("Raw")}, {1, N_("Super Fine")}, constexpr TagDetails minoltaImageQuality[] = {{0, N_("Raw")}, {1, N_("Super Fine")}, {2, N_("Fine")},
{2, N_("Fine")}, {3, N_("Standard")}, {3, N_("Standard")}, {4, N_("Economy")}, {5, N_("Extra Fine")}};
{4, N_("Economy")}, {5, N_("Extra Fine")}};
//! Lookup table to translate Minolta image stabilization values //! Lookup table to translate Minolta image stabilization values
constexpr TagDetails minoltaImageStabilization[] = {{1, N_("Off")}, {5, N_("On")}}; constexpr TagDetails minoltaImageStabilization[] = {{1, N_("Off")}, {5, N_("On")}};
@ -68,7 +75,7 @@ constexpr TagInfo MinoltaMakerNote::tagInfo_[] = {
EXV_PRINT_TAG(minoltaColorMode)}, EXV_PRINT_TAG(minoltaColorMode)},
{0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, {0x0102, "Quality", N_("Image Quality"), N_("Image quality"), IfdId::minoltaId, SectionId::makerTags, unsignedLong,
-1, printMinoltaSonyImageQuality}, -1, EXV_PRINT_TAG(minoltaImageQuality)},
// TODO: Tag 0x0103 : quality or image size (see ExifTool doc). // TODO: Tag 0x0103 : quality or image size (see ExifTool doc).
{0x0103, "0x0103", N_("0x0103"), N_("Unknown"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1, {0x0103, "0x0103", N_("0x0103"), N_("Unknown"), IfdId::minoltaId, SectionId::makerTags, unsignedLong, -1,
@ -101,7 +108,7 @@ constexpr TagInfo MinoltaMakerNote::tagInfo_[] = {
IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue}, IfdId::minoltaId, SectionId::makerTags, undefined, -1, printValue},
{0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaId, SectionId::makerTags, {0x0115, "WhiteBalance", N_("White Balance"), N_("White balance"), IfdId::minoltaId, SectionId::makerTags,
unsignedLong, -1, printMinoltaSonyWhiteBalanceStd}, unsignedLong, -1, EXV_PRINT_TAG(minoltaWhiteBalanceStd0x0115)},
{0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::minoltaId, SectionId::makerTags, undefined, {0x0e00, "PrintIM", N_("Print IM"), N_("PrintIM information"), IfdId::minoltaId, SectionId::makerTags, undefined,
-1, printValue}, -1, printValue},
{0x0f00, "CameraSettingsZ1", N_("Camera Settings (Z1)"), N_("Camera Settings (for Z1, DImage X, and F100 models)"), {0x0f00, "CameraSettingsZ1", N_("Camera Settings (Z1)"), N_("Camera Settings (for Z1, DImage X, and F100 models)"),
@ -1768,9 +1775,32 @@ std::ostream& printMinoltaSonyRotation(std::ostream& os, const Value& value, con
//! Lookup table to translate Minolta/Sony scene mode values to readable labels //! Lookup table to translate Minolta/Sony scene mode values to readable labels
constexpr TagDetails minoltaSonySceneMode[] = { constexpr TagDetails minoltaSonySceneMode[] = {
{0, N_("Standard")}, {1, N_("Portrait")}, {2, N_("Text")}, {3, N_("Night Scene")}, {0, N_("Standard")},
{4, N_("Sunset")}, {5, N_("Sports")}, {6, N_("Landscape")}, {7, N_("Night Portrait")}, {1, N_("Portrait")},
{8, N_("Macro")}, {9, N_("Super Macro")}, {16, N_("Auto")}, {17, N_("Night View/Portrait")}}; {2, N_("Text")},
{3, N_("Night Scene")},
{4, N_("Sunset")},
{5, N_("Sports")},
{6, N_("Landscape")},
{7, N_("Night Portrait")},
{8, N_("Macro")},
{9, N_("Super Macro")},
{16, N_("Auto")},
{17, N_("Night View/Portrait")},
{18, N_("Sweep Panorama")},
{19, N_("Handheld Night Shot")},
{20, N_("Anti Motion Blur")},
{21, N_("Cont. Priority AE")},
{22, N_("Auto+")},
{23, N_("3D Sweep Panorama")},
{24, N_("Superior Auto")},
{25, N_("High Sensitivity")},
{26, N_("Fireworks")},
{27, N_("Food")},
{28, N_("Pet")},
{33, N_("HDR")},
{0xffff, N_("n/a")},
};
std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, const ExifData* metadata) { std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonySceneMode)(os, value, metadata); return EXV_PRINT_TAG(minoltaSonySceneMode)(os, value, metadata);
@ -1778,18 +1808,6 @@ std::ostream& printMinoltaSonySceneMode(std::ostream& os, const Value& value, co
// ---------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------
//! Lookup table to translate Sony/Minolta image quality values to readable labels
constexpr TagDetails minoltaSonyImageQuality[] = {
{0, N_("Raw")}, {1, N_("Super Fine")}, {2, N_("Fine")},
{3, N_("Standard")}, {4, N_("Economy")}, {5, N_("Extra Fine")},
{6, N_("Raw + JPEG")}, {7, N_("Compressed Raw")}, {8, N_("Compressed Raw + JPEG")}};
std::ostream& printMinoltaSonyImageQuality(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonyImageQuality)(os, value, metadata);
}
// ----------------------------------------------------------------------------------------------------
//! Lookup table to translate Sony/Minolta teleconverter model values to readable labels //! Lookup table to translate Sony/Minolta teleconverter model values to readable labels
constexpr TagDetails minoltaSonyTeleconverterModel[] = {{0x00, N_("None")}, constexpr TagDetails minoltaSonyTeleconverterModel[] = {{0x00, N_("None")},
{0x04, N_("Minolta/Sony AF 1.4x APO (D) (0x04)")}, {0x04, N_("Minolta/Sony AF 1.4x APO (D) (0x04)")},
@ -1807,18 +1825,6 @@ std::ostream& printMinoltaSonyTeleconverterModel(std::ostream& os, const Value&
// ---------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------
//! Lookup table to translate Sony/Minolta Std camera settings white balance values to readable labels
constexpr TagDetails minoltaSonyWhiteBalanceStd[] = {
{0x00, N_("Auto")}, {0x01, N_("Color Temperature/Color Filter")},
{0x10, N_("Daylight")}, {0x20, N_("Cloudy")},
{0x30, N_("Shade")}, {0x40, N_("Tungsten")},
{0x50, N_("Flash")}, {0x60, N_("Fluorescent")},
{0x70, N_("Custom")}};
std::ostream& printMinoltaSonyWhiteBalanceStd(std::ostream& os, const Value& value, const ExifData* metadata) {
return EXV_PRINT_TAG(minoltaSonyWhiteBalanceStd)(os, value, metadata);
}
//! Lookup table to translate Sony/Minolta zone matching values to readable labels //! Lookup table to translate Sony/Minolta zone matching values to readable labels
constexpr TagDetails minoltaSonyZoneMatching[] = {{0, N_("ISO Setting Used")}, {1, N_("High Key")}, {2, N_("Low Key")}}; constexpr TagDetails minoltaSonyZoneMatching[] = {{0, N_("ISO Setting Used")}, {1, N_("High Key")}, {2, N_("Low Key")}};

File diff suppressed because it is too large Load Diff

@ -37,6 +37,54 @@ class SonyMakerNote {
//! @name Print functions for Sony %MakerNote tags //! @name Print functions for Sony %MakerNote tags
//@{ //@{
//! Print Sony white balance fine tune values
static std::ostream& printWhiteBalanceFineTune(std::ostream&, const Value&, const ExifData*);
//! Print Sony multi-burst mode values
static std::ostream& printMultiBurstMode(std::ostream&, const Value&, const ExifData*);
//! Print Sony multi-burst size values
static std::ostream& printMultiBurstSize(std::ostream&, const Value&, const ExifData*);
//! Print Sony HDR values
static std::ostream& printAutoHDRStd(std::ostream&, const Value&, const ExifData*);
//! Print Sony white balance shift amber/blue or green/magenta values
static std::ostream& printWBShiftABGM(std::ostream&, const Value&, const ExifData*);
//! Print Sony focus mode 2 values
static std::ostream& printFocusMode2(std::ostream&, const Value&, const ExifData*);
//! Print Sony auto-focus area mode Settings values
static std::ostream& printAFAreaModeSetting(std::ostream&, const Value&, const ExifData*);
//! Print Sony flexible spot position values
static std::ostream& printFlexibleSpotPosition(std::ostream&, const Value&, const ExifData*);
//! Print Sony auto-focus point selected values
static std::ostream& printAFPointSelected(std::ostream&, const Value&, const ExifData*);
//! Print Sony auto-focus points used values
static std::ostream& printAFPointsUsed(std::ostream&, const Value&, const ExifData*);
//! Print Sony auto-focus tracking values
static std::ostream& printAFTracking(std::ostream&, const Value&, const ExifData*);
//! Print Sony focal plane auto-focus points used values
static std::ostream& printFocalPlaneAFPointsUsed(std::ostream&, const Value&, const ExifData*);
//! Print Sony white balance shift amber/blue and green/magenta precise values
static std::ostream& printWBShiftABGMPrecise(std::ostream&, const Value&, const ExifData*);
//! Print Sony variable low pass filter values
static std::ostream& printExposureStandardAdjustment(std::ostream&, const Value&, const ExifData*);
//! Print Sony pixel shift information values
static std::ostream& printPixelShiftInfo(std::ostream&, const Value&, const ExifData*);
//! Print Sony focus frame size values
static std::ostream& printFocusFrameSize(std::ostream&, const Value&, const ExifData*);
//! Print Sony color temperature values
static std::ostream& printColorTemperature(std::ostream&, const Value&, const ExifData*);
//! Print Sony color compensation filter values
static std::ostream& printColorCompensationFilter(std::ostream&, const Value&, const ExifData*);
//! Print Sony lens specification values
static std::ostream& printLensSpec(std::ostream&, const Value&, const ExifData*);
//! Print Sony focus mode values
static std::ostream& printFocusMode(std::ostream&, const Value&, const ExifData*);
//! Print Sony full and preview image size values
static std::ostream& printImageSize(std::ostream&, const Value&, const ExifData*);
//! Print Sony auto-focus area mode values
static std::ostream& printAFMode(std::ostream&, const Value&, const ExifData*);
//! Print Sony focus mode 3 values
static std::ostream& printFocusMode3(std::ostream&, const Value&, const ExifData*);
//! Print Sony high ISO noise reduction 2 values
static std::ostream& printHighISONoiseReduction2(std::ostream&, const Value&, const ExifData*);
//! Print Sony SonyMisc1 CameraTemperature values (in degrees Celsius) //! Print Sony SonyMisc1 CameraTemperature values (in degrees Celsius)
static std::ostream& printSonyMisc1CameraTemperature(std::ostream&, const Value&, const ExifData*); static std::ostream& printSonyMisc1CameraTemperature(std::ostream&, const Value&, const ExifData*);
//! Print Sony2Fp Focus Mode value //! Print Sony2Fp Focus Mode value
@ -59,10 +107,6 @@ class SonyMakerNote {
static std::ostream& printSonyMisc3cModelReleaseYear(std::ostream&, const Value&, const ExifData* metadata); static std::ostream& printSonyMisc3cModelReleaseYear(std::ostream&, const Value&, const ExifData* metadata);
//! Print SonyMisc3c quality 2 value //! Print SonyMisc3c quality 2 value
static std::ostream& printSonyMisc3cQuality2(std::ostream&, const Value&, const ExifData* metadata); static std::ostream& printSonyMisc3cQuality2(std::ostream&, const Value&, const ExifData* metadata);
//! Print Sony Camera Model
static std::ostream& print0xb000(std::ostream&, const Value&, const ExifData*);
//! Print Full and Preview Image size
static std::ostream& printImageSize(std::ostream&, const Value&, const ExifData*);
private: private:
//! Tag information //! Tag information

@ -5,6 +5,7 @@
// ***************************************************************************** // *****************************************************************************
// included header files // included header files
#include "error.hpp"
#include "tags.hpp" #include "tags.hpp"
// ***************************************************************************** // *****************************************************************************
@ -38,12 +39,38 @@ struct TagDetails {
} }
}; // struct TagDetails }; // struct TagDetails
/*!
@brief Helper structure for lookup tables for translations of string
tag values to human readable labels.
*/
struct StringTagDetails {
const char* val_; //!< Tag value
const char* label_; //!< Translation of the tag value
//! Comparison operator for use with the find template
bool operator==(const char* key) const {
return (strcmp(val_, key) == 0);
}
bool operator==(const std::string key) const {
return (key == val_);
}
}; // struct TagDetails
/*! /*!
@brief Helper structure for lookup tables for translations of bitmask @brief Helper structure for lookup tables for translations of bitmask
values to human readable labels. values to human readable labels.
*/ */
using TagDetailsBitmask = std::pair<uint32_t, const char*>; using TagDetailsBitmask = std::pair<uint32_t, const char*>;
/*!
@brief Helper structure for lookup tables for translations of lists of
individual bit values to human readable labels.
Required to be sorted by the first element (e.g.,
{{0, N_("Center")}, {1, N_("Top")}, {2, N_("Upper-right")},
{3, N_("Right")}})
*/
using TagDetailsBitlistSorted = std::pair<uint32_t, const char*>;
/*! /*!
@brief Helper structure for lookup tables for translations of controlled @brief Helper structure for lookup tables for translations of controlled
vocabulary strings to their descriptions. vocabulary strings to their descriptions.
@ -62,11 +89,95 @@ struct TagVocabulary {
bool operator==(const std::string& key) const; bool operator==(const std::string& key) const;
}; // struct TagDetails }; // struct TagDetails
/*!
@brief Generic pretty-print function to translate a full string value to a description
by looking up a reference table.
*/
template <size_t N, const StringTagDetails (&array)[N]>
std::ostream& printTagString(std::ostream& os, const std::string value, const ExifData*) {
const StringTagDetails* td = find(array, value);
if (td) {
os << exvGettext(td->label_);
} else {
os << "(" << value << ")";
}
return os;
}
/*!
@brief Generic pretty-print function to translate the full string value in Value, to a description
by looking up a reference table.
*/
template <size_t N, const StringTagDetails (&array)[N]>
std::ostream& printTagString(std::ostream& os, const Value& value, const ExifData* data) {
return printTagString<N, array>(os, value.toString(0), data);
}
//! Shortcut for the printStringTag template which requires typing the array name only once.
#define EXV_PRINT_STRING_TAG_1(array) printTagString<std::size(array), array>
/*!
@brief Generic pretty-print function to translate the first 2 values in Value as a string,
to a description by looking up a reference table.
*/
template <size_t N, const StringTagDetails (&array)[N]>
std::ostream& printTagString2(std::ostream& os, const Value& value, const ExifData* data) {
if (value.count() < 2)
return os << "(" << value << ")";
std::string temp = value.toString(0) + " " + value.toString(1);
return printTagString<N, array>(os, temp, data);
}
//! Shortcut for the printTagString2 template which requires typing the array name only once.
#define EXV_PRINT_STRING_TAG_2(array) printTagString2<std::size(array), array>
/*!
@brief Generic pretty-print function to translate the first 4 values in Value as a string,
to a description by looking up a reference table.
*/
template <size_t N, const StringTagDetails (&array)[N]>
std::ostream& printTagString4(std::ostream& os, const Value& value, const ExifData* data) {
if (value.count() < 4)
return os << "(" << value << ")";
std::string temp = value.toString(0) + " " + value.toString(1) + " " + value.toString(2) + " " + value.toString(3);
return printTagString<N, array>(os, temp, data);
}
//! Shortcut for the printTagString4 template which requires typing the array name only once.
#define EXV_PRINT_STRING_TAG_4(array) printTagString4<std::size(array), array>
/*!
@brief Generic pretty-print function to translate a long value to a description
by looking up a reference table. Unknown values are passed through without error.
*/
template <size_t N, const TagDetails (&array)[N]>
std::ostream& printTagNoError(std::ostream& os, const int64_t value, const ExifData*) {
const TagDetails* td = find(array, value);
if (td) {
os << exvGettext(td->label_);
} else {
os << value;
}
return os;
}
/*!
@brief Generic pretty-print function to translate the full string value in Value, to a description
by looking up a reference table.
*/
template <size_t N, const TagDetails (&array)[N]>
std::ostream& printTagNoError(std::ostream& os, const Value& value, const ExifData* data) {
return printTagNoError<N, array>(os, value.toInt64(), data);
}
//! Shortcut for the printStringTag template which requires typing the array name only once.
#define EXV_PRINT_TAG_NO_ERROR(array) printTagNoError<std::size(array), array>
/*! /*!
@brief Generic pretty-print function to translate a long value to a description @brief Generic pretty-print function to translate a long value to a description
by looking up a reference table. by looking up a reference table.
*/ */
template <int N, const TagDetails (&array)[N]> template <size_t N, const TagDetails (&array)[N]>
std::ostream& printTag(std::ostream& os, const int64_t value, const ExifData*) { std::ostream& printTag(std::ostream& os, const int64_t value, const ExifData*) {
const TagDetails* td = find(array, value); const TagDetails* td = find(array, value);
if (td) { if (td) {
@ -81,7 +192,7 @@ std::ostream& printTag(std::ostream& os, const int64_t value, const ExifData*) {
@brief Generic pretty-print function to translate the first long value in Value, to a description @brief Generic pretty-print function to translate the first long value in Value, to a description
by looking up a reference table. by looking up a reference table.
*/ */
template <int N, const TagDetails (&array)[N]> template <size_t N, const TagDetails (&array)[N]>
std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) { std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* data) {
return printTag<N, array>(os, value.toInt64(), data); return printTag<N, array>(os, value.toInt64(), data);
} }
@ -93,7 +204,7 @@ std::ostream& printTag(std::ostream& os, const Value& value, const ExifData* dat
@brief Generic print function to translate a long value to a description @brief Generic print function to translate a long value to a description
by looking up bitmasks in a reference table. by looking up bitmasks in a reference table.
*/ */
template <int N, const TagDetailsBitmask (&array)[N]> template <size_t N, const TagDetailsBitmask (&array)[N]>
std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) { std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifData*) {
const auto val = value.toUint32(); const auto val = value.toUint32();
if (val == 0 && N > 0) { if (val == 0 && N > 0) {
@ -102,7 +213,7 @@ std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifDa
return os << exvGettext(label); return os << exvGettext(label);
} }
bool sep = false; bool sep = false;
for (int i = 0; i < N; ++i) { for (size_t i = 0; i < N; ++i) {
// *& acrobatics is a workaround for a MSVC 7.1 bug // *& acrobatics is a workaround for a MSVC 7.1 bug
auto [mask, label] = *(array + i); auto [mask, label] = *(array + i);
@ -121,11 +232,73 @@ std::ostream& printTagBitmask(std::ostream& os, const Value& value, const ExifDa
//! Shortcut for the printTagBitmask template which requires typing the array name only once. //! Shortcut for the printTagBitmask template which requires typing the array name only once.
#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array> #define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<std::size(array), array>
/*!
@brief Generic print function to translate the bits in the values
by looking up the indices in a reference table. The function
processes the values using little endian format. Any bits not
found in the array are also output.
*/
template <size_t N, const TagDetailsBitlistSorted (&array)[N]>
std::ostream& printTagBitlistAllLE(std::ostream& os, const Value& value, const ExifData*) {
if (N == 0)
throw Error(ErrorCode::kerErrorMessage, std::string("Passed zero length TagDetailsBitlistSorted"));
uint32_t vN = 0;
uint32_t currentVNBit = 0;
size_t lastArrayPos = 0; // Prevents unneeded searching of array
constexpr auto maxArrayBit = (array + N - 1)->first;
auto allVNZero = true;
auto useSep = false;
// For each value
for (size_t i = 0; i < value.count(); i++) {
vN = value.toUint32(i);
if (vN == 0) { // If all bits zero, then nothing to process
currentVNBit += 8;
continue;
}
allVNZero = false;
// Cycle through every bit in that byte
for (auto j = 0; j < 8; j++, currentVNBit++) {
if ((vN >> j & 0x01) == 0) { // If bit not set, then nothing to process
continue;
}
if (currentVNBit > maxArrayBit) { // If beyond array values, output unknown index
os << ", [" << currentVNBit << "]";
continue;
}
// Check to see if the numbered bit is found in the array
for (size_t k = lastArrayPos; k < N; ++k) {
// *& acrobatics is a workaround for a MSVC 7.1 bug
auto [bit, label] = *(array + k);
if (currentVNBit == bit) {
lastArrayPos = k;
if (useSep) {
os << ", " << exvGettext(label);
} else {
os << exvGettext(label);
useSep = true;
}
break;
}
}
}
}
if (allVNZero)
os << exvGettext("None");
return os;
}
//! Shortcut for the printTagBitlistAllLE template which requires typing the array name only once.
#define EXV_PRINT_TAG_BITLIST_ALL_LE(array) printTagBitlistAllLE<std::size(array), array>
/*! /*!
@brief Generic pretty-print function to translate a controlled vocabulary value (string) @brief Generic pretty-print function to translate a controlled vocabulary value (string)
to a description by looking up a reference table. to a description by looking up a reference table.
*/ */
template <int N, const TagVocabulary (&array)[N]> template <size_t N, const TagVocabulary (&array)[N]>
std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const ExifData*) { std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const ExifData*) {
const TagVocabulary* td = find(array, value.toString()); const TagVocabulary* td = find(array, value.toString());
if (td) { if (td) {
@ -139,7 +312,7 @@ std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const Exi
//! Shortcut for the printTagVocabulary template which requires typing the array name only once. //! Shortcut for the printTagVocabulary template which requires typing the array name only once.
#define EXV_PRINT_VOCABULARY(array) printTagVocabulary<std::size(array), array> #define EXV_PRINT_VOCABULARY(array) printTagVocabulary<std::size(array), array>
template <int N, const TagVocabulary (&array)[N]> template <size_t N, const TagVocabulary (&array)[N]>
std::ostream& printTagVocabularyMulti(std::ostream& os, const Value& value, const ExifData*) { std::ostream& printTagVocabularyMulti(std::ostream& os, const Value& value, const ExifData*) {
if (value.count() == 0) { if (value.count() == 0) {
os << "(" << value << ")"; os << "(" << value << ")";

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -124,10 +124,10 @@ Exif.Panasonic.Quality 0x0001 Makernote Short 1
Exif.Image.Make 0x010f IFD0 Ascii 5 SONY Exif.Image.Make 0x010f IFD0 Ascii 5 SONY
Exif.Image.Model 0x0110 IFD0 Ascii 7 DSC-W7 Exif.Image.Model 0x0110 IFD0 Ascii 7 DSC-W7
Exif.Image.ExifTag 0x8769 IFD0 Long 1 64 Exif.Image.ExifTag 0x8769 IFD0 Long 1 64
Exif.Photo.MakerNote 0x927c Exif Undefined 32 83 79 78 89 32 68 83 67 32 0 0 0 1 0 0 32 7 0 6 0 0 0 108 0 0 0 0 1 2 3 4 5 Exif.Photo.MakerNote 0x927c Exif Undefined 26 83 79 78 89 32 68 83 67 32 0 0 0 1 0 2 1 4 0 1 0 0 0 2 0 0 0
Exif.MakerNote.Offset 0x0001 Makernote Long 1 82 Exif.MakerNote.Offset 0x0001 Makernote Long 1 82
Exif.MakerNote.ByteOrder 0x0002 Makernote Ascii 3 II Exif.MakerNote.ByteOrder 0x0002 Makernote Ascii 3 II
Exif.Sony1.0x2000 0x2000 Makernote Undefined 6 0 1 2 3 4 5 Exif.Sony1.Quality 0x0102 Makernote Long 1 2
----- Minolta MakerNote tags ----- Minolta MakerNote tags
Exif.Image.Make 0x010f IFD0 Ascii 8 Minolta Exif.Image.Make 0x010f IFD0 Ascii 8 Minolta

@ -36,7 +36,10 @@ Exif.Photo.DateTimeOriginal Ascii 20 2021:02:18 19:55:41
Exif.Photo.DateTimeDigitized Ascii 20 2021:02:18 19:55:41 Exif.Photo.DateTimeDigitized Ascii 20 2021:02:18 19:55:41
Exif.Photo.ExposureBiasValue SRational 1 0 EV Exif.Photo.ExposureBiasValue SRational 1 0 EV
Exif.Photo.Flash Short 1 No, compulsory Exif.Photo.Flash Short 1 No, compulsory
Exif.Sony1.LongExposureNoiseReduction Long 1 Off
Exif.Sony1.FlashExposureComp SRational 1 0 EV Exif.Sony1.FlashExposureComp SRational 1 0 EV
Exif.Sony1.FlashAction Long 1 Did not fire
Exif.Sony1.ExposureStandardAdjustment SRational 1 0.0
Exif.Sony1.ExposureMode Short 1 Manual Exif.Sony1.ExposureMode Short 1 Manual
Exif.Sony1.FlashLevel SShort 1 Normal Exif.Sony1.FlashLevel SShort 1 Normal
Exif.Photo.FlashpixVersion Undefined 4 1.00 Exif.Photo.FlashpixVersion Undefined 4 1.00

@ -21,22 +21,27 @@ class CheckSonyMinoltaLenses(metaclass=system_tests.CaseMeta):
] ]
stdout = [ """Exif.Sony1.LensID Long 1 Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF stdout = [ """Exif.Sony1.LensID Long 1 Tamron SP AF 11-18mm F4.5-5.6 Di II LD Aspherical IF
Exif.Sony1.LensSpec Byte 8 Unknown
Exif.Photo.LensSpecification Rational 4 110/10 180/10 45/10 56/10 Exif.Photo.LensSpecification Rational 4 110/10 180/10 45/10 56/10
Exif.Photo.LensModel Ascii 20 DT 11-18mm F4.5-5.6 Exif.Photo.LensModel Ascii 20 DT 11-18mm F4.5-5.6
""", """,
"""Exif.Sony1.LensID Long 1 Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical """Exif.Sony1.LensID Long 1 Tamron SP AF 17-50mm F2.8 XR Di II LD Aspherical
Exif.Sony1.LensSpec Byte 8 Unknown
Exif.Photo.LensSpecification Rational 4 0/10 0/10 0/10 0/10 Exif.Photo.LensSpecification Rational 4 0/10 0/10 0/10 0/10
Exif.Photo.LensModel Ascii 5 ---- Exif.Photo.LensModel Ascii 5 ----
""", """,
"""Exif.Sony1.LensID Long 1 Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro """Exif.Sony1.LensID Long 1 Tamron AF 18-200mm F3.5-6.3 XR Di II LD Aspherical [IF] Macro
Exif.Sony1.LensSpec Byte 8 Unknown
Exif.Photo.LensSpecification Rational 4 0/10 0/10 0/10 0/10 Exif.Photo.LensSpecification Rational 4 0/10 0/10 0/10 0/10
Exif.Photo.LensModel Ascii 5 ---- Exif.Photo.LensModel Ascii 5 ----
""", """,
"""Exif.Sony1.LensID Long 1 Tamron SP 70-300mm F4-5.6 Di USD """Exif.Sony1.LensID Long 1 Tamron SP 70-300mm F4-5.6 Di USD
Exif.Sony1.LensSpec Byte 8 70-300mm F4.0-5.6
Exif.Photo.LensSpecification Rational 4 700/10 3000/10 40/10 56/10 Exif.Photo.LensSpecification Rational 4 700/10 3000/10 40/10 56/10
Exif.Photo.LensModel Ascii 16 70-300mm F4-5.6 Exif.Photo.LensModel Ascii 16 70-300mm F4-5.6
""", """,
"""Exif.Sony1.LensID Long 1 Tamron SP AF 90mm F2.8 Di Macro """Exif.Sony1.LensID Long 1 Tamron SP AF 90mm F2.8 Di Macro
Exif.Sony1.LensSpec Byte 8 Unknown
Exif.Photo.LensSpecification Rational 4 1000/10 1000/10 28/10 28/10 Exif.Photo.LensSpecification Rational 4 1000/10 1000/10 28/10 28/10
Exif.Photo.LensModel Ascii 17 100mm F2.8 Macro Exif.Photo.LensModel Ascii 17 100mm F2.8 Macro
""", """,

Loading…
Cancel
Save