|
|
|
@ -859,35 +859,46 @@ struct NikonArrayIdx {
|
|
|
|
|
#define NA ((uint32_t)-1)
|
|
|
|
|
|
|
|
|
|
//! Nikon binary array version lookup table
|
|
|
|
|
constexpr auto nikonArrayIdx = std::array{
|
|
|
|
|
constexpr NikonArrayIdx nikonArrayIdx[] = {
|
|
|
|
|
// NikonSi
|
|
|
|
|
NikonArrayIdx{0x0091, "0208", 0, 0, 4}, // D80
|
|
|
|
|
NikonArrayIdx{0x0091, "0209", 0, 1, 4}, // D40
|
|
|
|
|
NikonArrayIdx{0x0091, "0210", 5291, 2, 4}, // D300
|
|
|
|
|
NikonArrayIdx{0x0091, "0210", 5303, 3, 4}, // D300, firmware version 1.10
|
|
|
|
|
NikonArrayIdx{0x0091, "02", 0, 4, 4}, // Other v2.* (encrypted)
|
|
|
|
|
NikonArrayIdx{0x0091, "01", 0, 5, NA}, // Other v1.* (not encrypted)
|
|
|
|
|
{0x0091, "0208", 0, 0, 4}, // D80
|
|
|
|
|
{0x0091, "0209", 0, 1, 4}, // D40
|
|
|
|
|
{0x0091, "0210", 5291, 2, 4}, // D300
|
|
|
|
|
{0x0091, "0210", 5303, 3, 4}, // D300, firmware version 1.10
|
|
|
|
|
{0x0091, "02", 0, 4, 4}, // Other v2.* (encrypted)
|
|
|
|
|
{0x0091, "01", 0, 5, NA}, // Other v1.* (not encrypted)
|
|
|
|
|
// NikonCb
|
|
|
|
|
NikonArrayIdx{0x0097, "0100", 0, 0, NA}, NikonArrayIdx{0x0097, "0102", 0, 1, NA},
|
|
|
|
|
NikonArrayIdx{0x0097, "0103", 0, 4, NA}, NikonArrayIdx{0x0097, "0205", 0, 2, 4},
|
|
|
|
|
NikonArrayIdx{0x0097, "0209", 0, 5, 284}, NikonArrayIdx{0x0097, "0212", 0, 5, 284},
|
|
|
|
|
NikonArrayIdx{0x0097, "0214", 0, 5, 284}, NikonArrayIdx{0x0097, "02", 0, 3, 284},
|
|
|
|
|
{0x0097, "0100", 0, 0, NA},
|
|
|
|
|
{0x0097, "0102", 0, 1, NA},
|
|
|
|
|
{0x0097, "0103", 0, 4, NA},
|
|
|
|
|
{0x0097, "0205", 0, 2, 4},
|
|
|
|
|
{0x0097, "0209", 0, 5, 284},
|
|
|
|
|
{0x0097, "0212", 0, 5, 284},
|
|
|
|
|
{0x0097, "0214", 0, 5, 284},
|
|
|
|
|
{0x0097, "02", 0, 3, 284},
|
|
|
|
|
// NikonLd
|
|
|
|
|
NikonArrayIdx{0x0098, "0100", 0, 0, NA}, NikonArrayIdx{0x0098, "0101", 0, 1, NA},
|
|
|
|
|
NikonArrayIdx{0x0098, "0201", 0, 1, 4}, NikonArrayIdx{0x0098, "0202", 0, 1, 4},
|
|
|
|
|
NikonArrayIdx{0x0098, "0203", 0, 1, 4}, NikonArrayIdx{0x0098, "0204", 0, 2, 4},
|
|
|
|
|
NikonArrayIdx{0x0098, "0800", 0, 3, 4}, // for e.g. Z6/7
|
|
|
|
|
NikonArrayIdx{0x0098, "0801", 0, 3, 4}, // for e.g. Z6/7
|
|
|
|
|
NikonArrayIdx{0x0098, "0802", 0, 3, 4}, // for e.g. Z9
|
|
|
|
|
{0x0098, "0100", 0, 0, NA},
|
|
|
|
|
{0x0098, "0101", 0, 1, NA},
|
|
|
|
|
{0x0098, "0201", 0, 1, 4},
|
|
|
|
|
{0x0098, "0202", 0, 1, 4},
|
|
|
|
|
{0x0098, "0203", 0, 1, 4},
|
|
|
|
|
{0x0098, "0204", 0, 2, 4},
|
|
|
|
|
{0x0098, "0800", 0, 3, 4}, // for e.g. Z6/7
|
|
|
|
|
{0x0098, "0801", 0, 3, 4}, // for e.g. Z6/7
|
|
|
|
|
{0x0098, "0802", 0, 3, 4}, // for e.g. Z9
|
|
|
|
|
// NikonFl
|
|
|
|
|
NikonArrayIdx{0x00a8, "0100", 0, 0, NA}, NikonArrayIdx{0x00a8, "0101", 0, 0, NA},
|
|
|
|
|
NikonArrayIdx{0x00a8, "0102", 0, 1, NA}, NikonArrayIdx{0x00a8, "0103", 0, 2, NA},
|
|
|
|
|
NikonArrayIdx{0x00a8, "0104", 0, 2, NA}, NikonArrayIdx{0x00a8, "0105", 0, 2, NA},
|
|
|
|
|
NikonArrayIdx{0x00a8, "0106", 0, 3, NA}, NikonArrayIdx{0x00a8, "0107", 0, 4, NA},
|
|
|
|
|
NikonArrayIdx{0x00a8, "0108", 0, 4, NA},
|
|
|
|
|
{0x00a8, "0100", 0, 0, NA},
|
|
|
|
|
{0x00a8, "0101", 0, 0, NA},
|
|
|
|
|
{0x00a8, "0102", 0, 1, NA},
|
|
|
|
|
{0x00a8, "0103", 0, 2, NA},
|
|
|
|
|
{0x00a8, "0104", 0, 2, NA},
|
|
|
|
|
{0x00a8, "0105", 0, 2, NA},
|
|
|
|
|
{0x00a8, "0106", 0, 3, NA},
|
|
|
|
|
{0x00a8, "0107", 0, 4, NA},
|
|
|
|
|
{0x00a8, "0108", 0, 4, NA},
|
|
|
|
|
// NikonAf
|
|
|
|
|
NikonArrayIdx{0x00b7, "0100", 30, 0, NA}, // These sizes have been found in tiff headers of MN
|
|
|
|
|
NikonArrayIdx{0x00b7, "0101", 84, 1, NA}, // tag 0xb7 in sample image metadata for each version
|
|
|
|
|
{0x00b7, "0100", 30, 0, NA}, // These sizes have been found in tiff headers of MN
|
|
|
|
|
{0x00b7, "0101", 84, 1, NA}, // tag 0xb7 in sample image metadata for each version
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int nikonSelector(uint16_t tag, const byte* pData, size_t size, TiffComponent* /*pRoot*/) {
|
|
|
|
@ -895,8 +906,8 @@ int nikonSelector(uint16_t tag, const byte* pData, size_t size, TiffComponent* /
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
auto ix = NikonArrayIdx::Key(tag, reinterpret_cast<const char*>(pData), size);
|
|
|
|
|
auto it = std::find(nikonArrayIdx.begin(), nikonArrayIdx.end(), ix);
|
|
|
|
|
if (it == nikonArrayIdx.end())
|
|
|
|
|
auto it = Exiv2::find(nikonArrayIdx, ix);
|
|
|
|
|
if (!it)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
return it->idx_;
|
|
|
|
@ -907,9 +918,8 @@ DataBuf nikonCrypt(uint16_t tag, const byte* pData, size_t size, TiffComponent*
|
|
|
|
|
|
|
|
|
|
if (size < 4)
|
|
|
|
|
return buf;
|
|
|
|
|
auto nci = std::find(nikonArrayIdx.begin(), nikonArrayIdx.end(),
|
|
|
|
|
NikonArrayIdx::Key(tag, reinterpret_cast<const char*>(pData), size));
|
|
|
|
|
if (nci == nikonArrayIdx.end() || nci->start_ == NA || size <= nci->start_)
|
|
|
|
|
auto nci = Exiv2::find(nikonArrayIdx, NikonArrayIdx::Key(tag, reinterpret_cast<const char*>(pData), size));
|
|
|
|
|
if (!nci || nci->start_ == NA || size <= nci->start_)
|
|
|
|
|
return buf;
|
|
|
|
|
|
|
|
|
|
// Find Exif.Nikon3.ShutterCount
|
|
|
|
@ -955,12 +965,12 @@ int sonyCsSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, Tif
|
|
|
|
|
return idx;
|
|
|
|
|
}
|
|
|
|
|
int sony2010eSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
|
|
|
|
|
static constexpr auto models = std::array{
|
|
|
|
|
static constexpr const char* models[] = {
|
|
|
|
|
"SLT-A58", "SLT-A99", "ILCE-3000", "ILCE-3500", "NEX-3N", "NEX-5R", "NEX-5T",
|
|
|
|
|
"NEX-6", "VG30E", "VG900", "DSC-RX100", "DSC-RX1", "DSC-RX1R", "DSC-HX300",
|
|
|
|
|
"DSC-HX50V", "DSC-TX30", "DSC-WX60", "DSC-WX200", "DSC-WX300",
|
|
|
|
|
};
|
|
|
|
|
return std::find(models.begin(), models.end(), getExifModel(pRoot)) != models.end() ? 0 : -1;
|
|
|
|
|
return Exiv2::find(models, getExifModel(pRoot)) ? 0 : -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int sony2FpSelector(uint16_t /*tag*/, const byte* /*pData*/, size_t /*size*/, TiffComponent* pRoot) {
|
|
|
|
|