fix646_NikonAF22

This commit is contained in:
Robin Mills 2019-06-07 17:41:56 +01:00 committed by Luis Diaz Mas
parent 1eab4e0d13
commit b02c80f7e4
10 changed files with 156 additions and 37 deletions

View File

@ -1185,6 +1185,15 @@ namespace Exiv2 {
return aix == 0 ? -1 : aix->idx_;
}
int nikonAf2Selector(uint16_t tag, const byte* /*pData*/, uint32_t size, TiffComponent* const /*pRoot*/)
{
int result = tag == 0x00b7 ? 0 : -1 ;
if (result > -1 && size == 84 ) {
result = 1;
}
return result;
}
DataBuf nikonCrypt(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot)
{
DataBuf buf;

View File

@ -741,6 +741,17 @@ namespace Exiv2 {
*/
int nikonSelector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
/*!
@brief Function to select cfg + def of a Nikon complex binary array.
@param tag Tag number of the binary array
@param pData Pointer to the raw array data.
@param size Size of the array data.
@param pRoot Pointer to the root component of the TIFF tree.
@return An index into the array set, -1 if no match was found.
*/
int nikonAf2Selector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
/*!
@brief Encrypt and decrypt Nikon data.

View File

@ -888,31 +888,57 @@ namespace Exiv2 {
{ 6, N_("On (105-point)") }
};
// Nikon3 Auto Focus Tag Info
const TagInfo Nikon3MakerNote::tagInfoAf2_[] = {
TagInfo( 0, "Version", N_("Version"), N_("Version"), nikonAf2Id, makerTags, undefined, 4, printExifVersion),
TagInfo( 4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), nikonAf2Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)),
TagInfo( 5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAf2Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), nikonAf2Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonPhaseDetectAF)),
TagInfo( 7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), nikonAf2Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), nikonAf2Id, makerTags, unsignedByte, 7, printValue),
TagInfo( 16, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 18, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 20, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 22, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 24, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 26, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 28, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), nikonAf2Id, makerTags, unsignedShort, 1, printValue),
// End of list marker
TagInfo(0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), nikonAf2Id, makerTags, unsignedByte, 1, printValue)
};
const TagInfo* Nikon3MakerNote::tagListAf2()
{
return tagInfoAf2_;
}
// Nikon3 Auto Focus Tag Info
const TagInfo Nikon3MakerNote::tagInfoAf21_[] = {
TagInfo( 0, "Version", N_("Version"), N_("Version"), nikonAf21Id, makerTags, undefined, 4, printExifVersion),
TagInfo( 4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), nikonAf21Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)),
TagInfo( 5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAf21Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), nikonAf21Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonPhaseDetectAF)),
TagInfo( 7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), nikonAf21Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), nikonAf21Id, makerTags, unsignedByte, 7, printValue),
TagInfo( 16, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 18, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 20, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 22, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 24, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 26, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 28, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), nikonAf21Id, makerTags, unsignedShort, 1, printValue),
// End of list marker
TagInfo(0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), nikonAf21Id, makerTags, unsignedByte, 1, printValue)
};
// Nikon3 File Info Tag Info
const TagInfo* Nikon3MakerNote::tagListAf21()
{
return tagInfoAf21_;
}
// Nikon3 Auto Focus Tag Info
const TagInfo Nikon3MakerNote::tagInfoAf22_[] = {
TagInfo( 0, "Version", N_("Version"), N_("Version"), nikonAf22Id, makerTags, undefined, 4, printExifVersion),
TagInfo( 4, "ContrastDetectAF", N_("Contrast Detect AF"), N_("Contrast detect AF"), nikonAf22Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonOffOn)),
TagInfo( 5, "AFAreaMode", N_("AF Area Mode"), N_("AF area mode"), nikonAf22Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 6, "PhaseDetectAF", N_("Phase Detect AF"), N_("Phase detect AF"), nikonAf22Id, makerTags, unsignedByte, 1, EXV_PRINT_TAG(nikonPhaseDetectAF)),
TagInfo( 7, "PrimaryAFPoint", N_("Primary AF Point"), N_("Primary AF point"), nikonAf22Id, makerTags, unsignedByte, 1, printValue),
TagInfo( 8, "AFPointsUsed", N_("AF Points Used"), N_("AF points used"), nikonAf22Id, makerTags, unsignedByte, 7, printValue),
TagInfo( 70, "AFImageWidth", N_("AF Image Width"), N_("AF image width"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 72, "AFImageHeight", N_("AF Image Height"), N_("AF image height"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 74, "AFAreaXPosition", N_("AF Area X Position"), N_("AF area x position"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 76, "AFAreaYPosition", N_("AF Area Y Position"), N_("AF area y position"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 78, "AFAreaWidth", N_("AF Area Width"), N_("AF area width"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 80, "AFAreaHeight", N_("AF Area Height"), N_("AF area height"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
TagInfo( 82, "ContrastDetectAFInFocus", N_("Contrast Detect AF In Focus"), N_("Contrast detect AF in focus"), nikonAf22Id, makerTags, unsignedShort, 1, printValue),
// End of list marker
TagInfo(0xffff, "(UnknownNikonAf2Tag)", "(UnknownNikonAf2Tag)", N_("Unknown Nikon Auto Focus 2 Tag"), nikonAf22Id, makerTags, unsignedByte, 1, printValue)
};
const TagInfo* Nikon3MakerNote::tagListAf22()
{
return tagInfoAf22_;
}
// Nikon3 File Info Tag Info
const TagInfo Nikon3MakerNote::tagInfoFi_[] = {
TagInfo( 0, "Version", N_("Version"), N_("Version"), nikonFiId, makerTags, undefined, 4, printExifVersion),
TagInfo( 6, "DirectoryNumber", N_("Directory Number"), N_("Directory number"), nikonFiId, makerTags, unsignedShort, 1, printValue),

View File

@ -124,7 +124,9 @@ namespace Exiv2 {
//! Return read-only list of built-in Auto Focus tags
static const TagInfo* tagListAf();
//! Return read-only list of built-in Auto Focus 2 tags
static const TagInfo* tagListAf2();
static const TagInfo* tagListAf21();
//! Return read-only list of built-in Auto Focus 2 tags
static const TagInfo* tagListAf22();
//! Return read-only list of built-in AF Fine Tune tags
static const TagInfo* tagListAFT();
//! Return read-only list of built-in File Info tags
@ -235,7 +237,9 @@ namespace Exiv2 {
//! Auto Focus tag information
static const TagInfo tagInfoAf_[];
//! Auto Focus tag 2 information
static const TagInfo tagInfoAf2_[];
static const TagInfo tagInfoAf21_[];
//! Auto Focus tag 2 information
static const TagInfo tagInfoAf22_[];
//! AF Fine Tune tag information
static const TagInfo tagInfoAFT_[];
//! File Info tag information

View File

@ -106,7 +106,8 @@ namespace Exiv2 {
{ nikonWtId, "Makernote", "NikonWt", Nikon3MakerNote::tagListWt },
{ nikonIiId, "Makernote", "NikonIi", Nikon3MakerNote::tagListIi },
{ nikonAfId, "Makernote", "NikonAf", Nikon3MakerNote::tagListAf },
{ nikonAf2Id, "Makernote", "NikonAf2", Nikon3MakerNote::tagListAf2 },
{ nikonAf21Id, "Makernote", "NikonAf2", Nikon3MakerNote::tagListAf21 },
{ nikonAf22Id, "Makernote", "NikonAf22", Nikon3MakerNote::tagListAf22 },
{ nikonAFTId, "Makernote", "NikonAFT", Nikon3MakerNote::tagListAFT },
{ nikonFiId, "Makernote", "NikonFi", Nikon3MakerNote::tagListFi },
{ nikonMeId, "Makernote", "NikonMe", Nikon3MakerNote::tagListMe },

View File

@ -99,7 +99,8 @@ namespace Exiv2 {
nikonWtId,
nikonIiId,
nikonAfId,
nikonAf2Id,
nikonAf21Id,
nikonAf22Id,
nikonAFTId,
nikonFiId,
nikonMeId,

View File

@ -221,9 +221,9 @@ namespace Exiv2 {
{ 2, ttUnsignedShort, 1 } // The array contains 4 bytes
};
//! Nikon Auto Focus 2 binary array - configuration
extern const ArrayCfg nikonAf2Cfg = {
nikonAf2Id, // Group for the elements
//! Nikon Auto Focus 21 binary array - configuration
extern const ArrayCfg nikonAf21Cfg = {
nikonAf21Id, // Group for the elements
invalidByteOrder, // Use byte order from parent
ttUndefined, // Type for array entry
notEncrypted, // Not encrypted
@ -232,8 +232,8 @@ namespace Exiv2 {
true, // Concatenate gaps
{ 0, ttUnsignedByte, 1 }
};
//! Nikon Auto Focus 2 binary array - definition
extern const ArrayDef nikonAf2Def[] = {
//! Nikon Auto Focus 21 binary array - definition
extern const ArrayDef nikonAf21Def[] = {
{ 0, ttUndefined, 4 }, // Version
{ 4, ttUnsignedByte, 1 }, // ContrastDetectAF
{ 5, ttUnsignedByte, 1 }, // AFAreaMode
@ -248,6 +248,39 @@ namespace Exiv2 {
{ 26, ttUnsignedShort, 1 }, // AFAreaHeight
{ 28, ttUnsignedShort, 1 }, // ContrastDetectAFInFocus
};
//! Nikon Auto Focus 22 binary array - configuration
extern const ArrayCfg nikonAf22Cfg = {
nikonAf22Id, // Group for the elements
littleEndian, // Byte order
ttUndefined, // Type for array entry
notEncrypted, // Not encrypted
false, // No size element
true, // Write all tags
true, // Concatenate gaps
{ 0, ttUnsignedByte, 1 }
};
//! Nikon Auto Focus 22 binary array - definition
extern const ArrayDef nikonAf22Def[] = {
{ 0, ttUndefined, 4 }, // Version
{ 4, ttUnsignedByte, 1 }, // ContrastDetectAF
{ 5, ttUnsignedByte, 1 }, // AFAreaMode
{ 6, ttUnsignedByte, 1 }, // PhaseDetectAF
{ 7, ttUnsignedByte, 1 }, // PrimaryAFPoint
{ 8, ttUnsignedByte, 7 }, // AFPointsUsed
{ 70, ttUnsignedShort, 1 }, // AFImageWidth
{ 72, ttUnsignedShort, 1 }, // AFImageHeight
{ 74, ttUnsignedShort, 1 }, // AFAreaXPosition
{ 76, ttUnsignedShort, 1 }, // AFAreaYPosition
{ 78, ttUnsignedShort, 1 }, // AFAreaWidth
{ 80, ttUnsignedShort, 1 }, // AFAreaHeight
};
//! Nikon AF2 configuration and definitions
// https://github.com/Exiv2/exiv2/issues/646
extern const ArraySet nikonAf2Set[] = {
{ nikonAf21Cfg, nikonAf21Def, EXV_COUNTOF(nikonAf21Def) },
{ nikonAf22Cfg, nikonAf22Def, EXV_COUNTOF(nikonAf22Def) },
};
//! Nikon AF Fine Tune binary array - configuration
extern const ArrayCfg nikonAFTCfg = {
@ -932,7 +965,8 @@ namespace Exiv2 {
{ Tag::root, nikonLd2Id, nikon3Id, 0x0098 },
{ Tag::root, nikonLd3Id, nikon3Id, 0x0098 },
{ Tag::root, nikonMeId, nikon3Id, 0x00b0 },
{ Tag::root, nikonAf2Id, nikon3Id, 0x00b7 },
{ Tag::root, nikonAf21Id, nikon3Id, 0x00b7 },
{ Tag::root, nikonAf22Id, nikon3Id, 0x00b7 },
{ Tag::root, nikonFiId, nikon3Id, 0x00b8 },
{ Tag::root, nikonAFTId, nikon3Id, 0x00b9 },
{ Tag::root, nikonFl1Id, nikon3Id, 0x00a8 },
@ -1274,7 +1308,7 @@ namespace Exiv2 {
{ 0x0098, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonLdSet, nikonSelector) },
{ 0x00a8, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonFlSet, nikonSelector) },
{ 0x00b0, nikon3Id, EXV_BINARY_ARRAY(nikonMeCfg, nikonMeDef) },
{ 0x00b7, nikon3Id, EXV_BINARY_ARRAY(nikonAf2Cfg, nikonAf2Def)},
{ 0x00b7, nikon3Id, EXV_COMPLEX_BINARY_ARRAY(nikonAf2Set, nikonAf2Selector) },
{ 0x00b8, nikon3Id, EXV_BINARY_ARRAY(nikonFiCfg, nikonFiDef) },
{ 0x00b9, nikon3Id, EXV_BINARY_ARRAY(nikonAFTCfg, nikonAFTDef) },
{ Tag::all, nikon3Id, newTiffEntry },
@ -1301,7 +1335,8 @@ namespace Exiv2 {
{ Tag::all, nikonAfId, newTiffBinaryElement },
// Nikon3 auto focus 2
{ Tag::all, nikonAf2Id, newTiffBinaryElement },
{ Tag::all, nikonAf21Id, newTiffBinaryElement },
{ Tag::all, nikonAf22Id, newTiffBinaryElement },
// Nikon3 AF Fine Tune
{ Tag::all, nikonAFTId, newTiffBinaryElement },

View File

@ -473,7 +473,11 @@ namespace Exiv2 {
object->group());
// skip decoding if decoderFct == 0
if (decoderFct) {
EXV_CALL_MEMBER_FN(*this, decoderFct)(object);
if ( object->group() == nikonAf22Id ) {
EXV_CALL_MEMBER_FN(*this, decoderFct)(object);
} else {
EXV_CALL_MEMBER_FN(*this, decoderFct)(object);
}
}
} // TiffDecoder::decodeTiffEntry
@ -1582,7 +1586,6 @@ namespace Exiv2 {
postList_.push_back(object);
return;
}
// Check duplicates
TiffFinder finder(object->tag(), object->group());
pRoot_->accept(finder);

BIN
test/data/_DSC8437.exv Normal file

Binary file not shown.

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
from system_tests import CaseMeta, path
class Fix646_NikonAF22(metaclass=CaseMeta):
url = "http://dev.exiv2.org/issues/646"
filename = "$data_path/_DSC8437.exv"
commands = [
"$exiv2 -pa --grep NikonAf $filename"
]
stdout = [
"""Exif.NikonAf22.Version Undefined 4 1.01
Exif.NikonAf22.ContrastDetectAF Byte 1 On
Exif.NikonAf22.AFAreaMode Byte 1 1
Exif.NikonAf22.PhaseDetectAF Byte 1 Off
Exif.NikonAf22.PrimaryAFPoint Byte 1 0
Exif.NikonAf22.AFPointsUsed Byte 7 0 0 0 0 0 0 0
Exif.NikonAf22.AFImageWidth Short 1 8256
Exif.NikonAf22.AFImageHeight Short 1 5504
Exif.NikonAf22.AFAreaXPosition Short 1 3950
Exif.NikonAf22.AFAreaYPosition Short 1 2871
Exif.NikonAf22.AFAreaWidth Short 1 435
Exif.NikonAf22.AFAreaHeight Short 1 360
Exif.NikonAf22.ContrastDetectAFInFocus Byte 2 1 0
"""
]
stderr = [ "" ] * len(commands)
retval = [ 0 ] * len(commands)