diff --git a/src/tags.cpp b/src/tags.cpp index 21b153bf..da30360d 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -86,6 +86,7 @@ namespace Exiv2 { { gpsIfdId, "GPSInfo", "GPSInfo", ExifTags::gpsTagList }, { iopIfdId, "Iop", "Iop", ExifTags::iopTagList }, { ifd1Id, "IFD1", "Thumbnail", ExifTags::ifdTagList }, + { ifd2Id, "IFD2", "Image2", ExifTags::ifdTagList }, { subImage1Id, "SubImage1", "SubImage1", ExifTags::ifdTagList }, { subImage2Id, "SubImage2", "SubImage2", ExifTags::ifdTagList }, { subImage3Id, "SubImage3", "SubImage3", ExifTags::ifdTagList }, @@ -1639,6 +1640,7 @@ namespace Exiv2 { case gpsIfdId: case iopIfdId: case ifd1Id: + case ifd2Id: case subImage1Id: case subImage2Id: case subImage3Id: diff --git a/src/tiffcomposite.cpp b/src/tiffcomposite.cpp index be72f1a4..e4605edb 100644 --- a/src/tiffcomposite.cpp +++ b/src/tiffcomposite.cpp @@ -69,13 +69,14 @@ namespace Exiv2 { extern const TiffGroupInfo tiffGroupInfo[] = { { 1, "Image" }, { 2, "Thumbnail" }, - { 3, "Photo" }, - { 4, "GPSInfo" }, - { 5, "Iop" }, - { 6, "SubImage1" }, - { 7, "SubImage2" }, - { 8, "SubImage3" }, - { 9, "SubImage4" }, + { 3, "Image2" }, + { 4, "Photo" }, + { 5, "GPSInfo" }, + { 6, "Iop" }, + { 7, "SubImage1" }, + { 8, "SubImage2" }, + { 9, "SubImage3" }, + { 10, "SubImage4" }, { 257, "Olympus" }, { 258, "Fujifilm" }, { 259, "Canon" }, @@ -897,7 +898,8 @@ namespace Exiv2 { uint32_t& imageIdx) { #ifdef DEBUG - std::cerr << "TiffImageEntry, tag 0x" << std::setw(4) + std::cerr << "TiffImageEntry, Directory " << tiffGroupName(group()) + << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex << tag() << std::dec << ": Writing offset " << imageIdx << "\n"; #endif @@ -1088,9 +1090,19 @@ namespace Exiv2 { ByteOrder byteOrder) const { uint32_t len = 0; + TiffComponent* pSubIfd = 0; for (Components::const_iterator i = components_.begin(); i != components_.end(); ++i) { + if ((*i)->tag() == 0x014a) { + // Hack: delay writing of sub-IFD image data to get the order correct + assert(pSubIfd == 0); + pSubIfd = *i; + continue; + } len += (*i)->writeImage(blob, byteOrder); } + if (pSubIfd) { + len += pSubIfd->writeImage(blob, byteOrder); + } if (pNext_) { len += pNext_->writeImage(blob, byteOrder); } @@ -1126,7 +1138,8 @@ namespace Exiv2 { uint32_t len = pValue()->sizeDataArea(); if (len > 0) { #ifdef DEBUG - std::cerr << "TiffImageEntry, tag 0x" << std::setw(4) + std::cerr << "TiffImageEntry, Directory " << tiffGroupName(group()) + << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex << tag() << std::dec << ": Writing data area, blob-size = " << blob.size(); #endif @@ -1138,7 +1151,8 @@ namespace Exiv2 { } else { #ifdef DEBUG - std::cerr << "TiffImageEntry, tag 0x" << std::setw(4) + std::cerr << "TiffImageEntry, Directory " << tiffGroupName(group()) + << ", entry 0x" << std::setw(4) << std::setfill('0') << std::hex << tag() << std::dec << ": Writing data area, blob-size = " << blob.size(); #endif diff --git a/src/tiffcomposite_int.hpp b/src/tiffcomposite_int.hpp index ca9935b6..f50bbee4 100644 --- a/src/tiffcomposite_int.hpp +++ b/src/tiffcomposite_int.hpp @@ -81,13 +81,14 @@ namespace Exiv2 { const uint16_t none = 0; //!< Dummy group const uint16_t ifd0 = 1; //!< Exif IFD0 const uint16_t ifd1 = 2; //!< Thumbnail IFD - const uint16_t exif = 3; //!< Exif IFD - const uint16_t gps = 4; //!< GPS IFD - const uint16_t iop = 5; //!< Interoperability IFD - const uint16_t subimg1 = 6; //!< 1st TIFF SubIFD in IFD0 - const uint16_t subimg2 = 7; //!< 2nd TIFF SubIFD in IFD0 - const uint16_t subimg3 = 8; //!< 3rd TIFF SubIFD in IFD0 - const uint16_t subimg4 = 9; //!< 4th TIFF SubIFD in IFD0 + const uint16_t ifd2 = 3; //!< IFD2 + const uint16_t exif = 4; //!< Exif IFD + const uint16_t gps = 5; //!< GPS IFD + const uint16_t iop = 6; //!< Interoperability IFD + const uint16_t subimg1 = 7; //!< 1st TIFF SubIFD in IFD0 + const uint16_t subimg2 = 8; //!< 2nd TIFF SubIFD in IFD0 + const uint16_t subimg3 = 9; //!< 3rd TIFF SubIFD in IFD0 + const uint16_t subimg4 = 10; //!< 4th TIFF SubIFD in IFD0 const uint16_t mn = 256; //!< Makernote const uint16_t ignr = 511; //!< Read but do not decode } diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index 0ebb3e12..4abd8619 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -290,8 +290,8 @@ namespace Exiv2 { { 0x0117, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffImageSize<0x0111, Group::ifd0> }, { 0x0144, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffImageData<0x0145, Group::ifd0> }, { 0x0145, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffImageSize<0x0144, Group::ifd0> }, - { 0x0201, Group::ifd0, Group::ifd0, Tag::root, Group::ifd0, newTiffImageData<0x0202, Group::ifd0> }, - { 0x0202, Group::ifd0, Group::ifd0, Tag::root, Group::ifd0, newTiffImageSize<0x0201, Group::ifd0> }, + { 0x0201, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffImageData<0x0202, Group::ifd0> }, + { 0x0202, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffImageSize<0x0201, Group::ifd0> }, { 0x014a, Group::ifd0, Group::subimg1, Tag::root, Group::none, newTiffSubIfd }, { Tag::next, Group::ifd0, Group::ifd1, Tag::root, Group::none, newTiffDirectory }, { Tag::all, Group::ifd0, Group::ifd0, Tag::root, Group::none, newTiffEntry }, @@ -355,9 +355,17 @@ namespace Exiv2 { { 0x0117, Group::ifd1, Group::ifd1, Tag::next, Group::ifd0, newTiffThumbSize<0x0111, Group::ifd1> }, { 0x0201, Group::ifd1, Group::ifd1, Tag::next, Group::ifd0, newTiffThumbData<0x0202, Group::ifd1> }, { 0x0202, Group::ifd1, Group::ifd1, Tag::next, Group::ifd0, newTiffThumbSize<0x0201, Group::ifd1> }, - { Tag::next, Group::ifd1, Group::ignr, Tag::next, Group::ifd0, newTiffDirectory }, + { Tag::next, Group::ifd1, Group::ifd2, Tag::next, Group::ifd0, newTiffDirectory }, { Tag::all, Group::ifd1, Group::ifd1, Tag::next, Group::ifd0, newTiffEntry }, + // IFD2 (eg, in Pentax PEF files) + { 0x0111, Group::ifd2, Group::ifd2, Tag::next, Group::ifd1, newTiffImageData<0x0117, Group::ifd2> }, + { 0x0117, Group::ifd2, Group::ifd2, Tag::next, Group::ifd1, newTiffImageSize<0x0111, Group::ifd2> }, + { 0x0201, Group::ifd2, Group::ifd2, Tag::next, Group::ifd1, newTiffImageData<0x0202, Group::ifd2> }, + { 0x0202, Group::ifd2, Group::ifd2, Tag::next, Group::ifd1, newTiffImageSize<0x0201, Group::ifd2> }, + { Tag::next, Group::ifd2, Group::ignr, Tag::next, Group::ifd1, newTiffDirectory }, + { Tag::all, Group::ifd2, Group::ifd2, Tag::next, Group::ifd1, newTiffEntry }, + // Olympus makernote - some Olympus cameras use Minolta structures // Todo: Adding such tags will not work (maybe result in a Minolta makernote), need separate groups { 0x0001, Group::olympmn, Group::minocso, 0x927c, Group::exif, newTiffArrayEntry }, @@ -409,6 +417,8 @@ namespace Exiv2 { { Tag::all, Group::panamn, Group::panamn, 0x927c, Group::exif, newTiffEntry }, // Pentax makernote + { 0x0003, Group::pentaxmn, Group::pentaxmn, 0x927c, Group::exif, newTiffThumbSize<0x0004, Group::pentaxmn> }, + { 0x0004, Group::pentaxmn, Group::pentaxmn, 0x927c, Group::exif, newTiffThumbData<0x0003, Group::pentaxmn> }, { Tag::next, Group::pentaxmn, Group::ignr, 0x927c, Group::exif, newTiffDirectory }, { Tag::all, Group::pentaxmn, Group::pentaxmn, 0x927c, Group::exif, newTiffEntry }, diff --git a/src/types.hpp b/src/types.hpp index 2ffc5ea7..676eb3d2 100644 --- a/src/types.hpp +++ b/src/types.hpp @@ -134,7 +134,7 @@ namespace Exiv2 { //! Type to specify the IFD to which a metadata belongs enum IfdId { ifdIdNotSet, - ifd0Id, exifIfdId, gpsIfdId, iopIfdId, ifd1Id, + ifd0Id, exifIfdId, gpsIfdId, iopIfdId, ifd1Id, ifd2Id, subImage1Id, subImage2Id, subImage3Id, subImage4Id, canonIfdId, canonCsIfdId, canonSiIfdId, canonCfIfdId, canonPiIfdId, canonPaIfdId,