#726: Added support for thumbnail found in sub-IFD of IFD1 of Samsung .SRW files.
This commit is contained in:
parent
76577d5eca
commit
f25fca8808
@ -123,7 +123,7 @@ namespace Exiv2 {
|
||||
case LogMsg::info: break;
|
||||
case LogMsg::warn: std::cerr << "Warning: "; break;
|
||||
case LogMsg::error: std::cerr << "Error: "; break;
|
||||
case LogMsg::mute: assert(true);
|
||||
case LogMsg::mute: assert(false);
|
||||
}
|
||||
std::cerr << s;
|
||||
}
|
||||
|
||||
@ -693,6 +693,7 @@ namespace Exiv2 {
|
||||
subImage7Id,
|
||||
subImage8Id,
|
||||
subImage9Id,
|
||||
subThumb1Id,
|
||||
panaRawId,
|
||||
ifd2Id,
|
||||
ifd3Id
|
||||
|
||||
@ -255,14 +255,16 @@ namespace {
|
||||
{ 0, createLoaderTiff, 3 },
|
||||
{ 0, createLoaderTiff, 4 },
|
||||
{ 0, createLoaderTiff, 5 },
|
||||
{ 0, createLoaderTiff, 6 },
|
||||
{ 0, createLoaderExifJpeg, 0 },
|
||||
{ 0, createLoaderExifJpeg, 1 },
|
||||
{ 0, createLoaderExifJpeg, 2 },
|
||||
{ 0, createLoaderExifJpeg, 3 },
|
||||
{ 0, createLoaderExifJpeg, 4 },
|
||||
{ 0, createLoaderExifJpeg, 5 },
|
||||
{ "image/x-canon-cr2", createLoaderExifJpeg, 6 },
|
||||
{ 0, createLoaderExifJpeg, 7 }
|
||||
{ 0, createLoaderExifJpeg, 6 },
|
||||
{ "image/x-canon-cr2", createLoaderExifJpeg, 7 },
|
||||
{ 0, createLoaderExifJpeg, 8 }
|
||||
};
|
||||
|
||||
const LoaderExifJpeg::Param LoaderExifJpeg::param_[] = {
|
||||
@ -271,9 +273,10 @@ namespace {
|
||||
{ "Exif.SubImage2.JPEGInterchangeFormat", "Exif.SubImage2.JPEGInterchangeFormatLength", 0 }, // 2
|
||||
{ "Exif.SubImage3.JPEGInterchangeFormat", "Exif.SubImage3.JPEGInterchangeFormatLength", 0 }, // 3
|
||||
{ "Exif.SubImage4.JPEGInterchangeFormat", "Exif.SubImage4.JPEGInterchangeFormatLength", 0 }, // 4
|
||||
{ "Exif.Image2.JPEGInterchangeFormat", "Exif.Image2.JPEGInterchangeFormatLength", 0 }, // 5
|
||||
{ "Exif.Image.StripOffsets", "Exif.Image.StripByteCounts", 0 }, // 6
|
||||
{ "Exif.OlympusCs.PreviewImageStart", "Exif.OlympusCs.PreviewImageLength", "Exif.MakerNote.Offset"} // 7
|
||||
{ "Exif.SubThumb1.JPEGInterchangeFormat", "Exif.SubThumb1.JPEGInterchangeFormatLength", 0 }, // 5
|
||||
{ "Exif.Image2.JPEGInterchangeFormat", "Exif.Image2.JPEGInterchangeFormatLength", 0 }, // 6
|
||||
{ "Exif.Image.StripOffsets", "Exif.Image.StripByteCounts", 0 }, // 7
|
||||
{ "Exif.OlympusCs.PreviewImageStart", "Exif.OlympusCs.PreviewImageLength", "Exif.MakerNote.Offset"} // 8
|
||||
};
|
||||
|
||||
const LoaderExifDataJpeg::Param LoaderExifDataJpeg::param_[] = {
|
||||
@ -294,7 +297,8 @@ namespace {
|
||||
{ "SubImage2", "Exif.SubImage2.NewSubfileType", "1" }, // 2
|
||||
{ "SubImage3", "Exif.SubImage3.NewSubfileType", "1" }, // 3
|
||||
{ "SubImage4", "Exif.SubImage4.NewSubfileType", "1" }, // 4
|
||||
{ "Thumbnail", 0, 0 } // 5
|
||||
{ "SubThumb1", "Exif.SubThumb1.NewSubfileType", "1" }, // 5
|
||||
{ "Thumbnail", 0, 0 } // 6
|
||||
};
|
||||
|
||||
Loader::AutoPtr Loader::create(PreviewId id, const Image &image)
|
||||
|
||||
@ -99,6 +99,7 @@ namespace Exiv2 {
|
||||
{ subImage7Id, "SubImage7", "SubImage7", ifdTagList },
|
||||
{ subImage8Id, "SubImage8", "SubImage8", ifdTagList },
|
||||
{ subImage9Id, "SubImage9", "SubImage9", ifdTagList },
|
||||
{ subThumb1Id, "SubThumb1", "SubThumb1", ifdTagList },
|
||||
{ panaRawId, "PanaRaw", "PanasonicRaw", PanasonicMakerNote::tagListRaw },
|
||||
{ mnId, "Makernote", "MakerNote", mnTagList },
|
||||
{ canonId, "Makernote", "Canon", CanonMakerNote::tagList },
|
||||
@ -1956,6 +1957,7 @@ namespace Exiv2 {
|
||||
case subImage7Id:
|
||||
case subImage8Id:
|
||||
case subImage9Id:
|
||||
case subThumb1Id:
|
||||
case panaRawId: rc = true; break;
|
||||
default: rc = false; break;
|
||||
}
|
||||
|
||||
@ -71,6 +71,7 @@ namespace Exiv2 {
|
||||
subImage7Id,
|
||||
subImage8Id,
|
||||
subImage9Id,
|
||||
subThumb1Id,
|
||||
panaRawId,
|
||||
mnId,
|
||||
canonId,
|
||||
|
||||
@ -1100,6 +1100,7 @@ namespace Exiv2 {
|
||||
{ Tag::root, ifd3Id, ifd2Id, Tag::next },
|
||||
{ Tag::root, olympusId, exifId, 0x927c },
|
||||
{ Tag::root, olympus2Id, exifId, 0x927c },
|
||||
{ Tag::root, subThumb1Id, ifd1Id, 0x014a },
|
||||
{ Tag::root, olympusEqId, olympus2Id, 0x2010 },
|
||||
{ Tag::root, olympusCsId, olympus2Id, 0x2020 },
|
||||
{ Tag::root, olympusRdId, olympus2Id, 0x2030 },
|
||||
@ -1321,11 +1322,22 @@ namespace Exiv2 {
|
||||
{ 0x0117, ifd1Id, newTiffThumbSize<0x0111, ifd1Id> },
|
||||
{ 0x0144, ifd1Id, newTiffImageData<0x0145, ifd1Id> },
|
||||
{ 0x0145, ifd1Id, newTiffImageSize<0x0144, ifd1Id> },
|
||||
{ 0x014a, ifd1Id, newTiffSubIfd<subThumb1Id> },
|
||||
{ 0x0201, ifd1Id, newTiffThumbData<0x0202, ifd1Id> },
|
||||
{ 0x0202, ifd1Id, newTiffThumbSize<0x0201, ifd1Id> },
|
||||
{ Tag::next, ifd1Id, newTiffDirectory<ifd2Id> },
|
||||
{ Tag::all, ifd1Id, newTiffEntry },
|
||||
|
||||
// Subdir subThumb1
|
||||
{ 0x0111, subThumb1Id, newTiffImageData<0x0117, subThumb1Id> },
|
||||
{ 0x0117, subThumb1Id, newTiffImageSize<0x0111, subThumb1Id> },
|
||||
{ 0x0144, subThumb1Id, newTiffImageData<0x0145, subThumb1Id> },
|
||||
{ 0x0145, subThumb1Id, newTiffImageSize<0x0144, subThumb1Id> },
|
||||
{ 0x0201, subThumb1Id, newTiffImageData<0x0202, subThumb1Id> },
|
||||
{ 0x0202, subThumb1Id, newTiffImageSize<0x0201, subThumb1Id> },
|
||||
{ Tag::next, subThumb1Id, newTiffDirectory<ignoreId> },
|
||||
{ Tag::all, subThumb1Id, newTiffEntry },
|
||||
|
||||
// IFD2 (eg, in Pentax PEF and Canon CR2 files)
|
||||
{ 0x0111, ifd2Id, newTiffImageData<0x0117, ifd2Id> },
|
||||
{ 0x0117, ifd2Id, newTiffImageSize<0x0111, ifd2Id> },
|
||||
|
||||
@ -1337,6 +1337,9 @@ namespace Exiv2 {
|
||||
if ( (object->tiffType() == ttUnsignedLong || object->tiffType() == ttSignedLong
|
||||
|| object->tiffType() == ttTiffIfd)
|
||||
&& object->count() >= 1) {
|
||||
// Todo: Fix hack
|
||||
uint32_t maxi = 9;
|
||||
if (object->group() == ifd1Id) maxi = 1;
|
||||
for (uint32_t i = 0; i < object->count(); ++i) {
|
||||
int32_t offset = getLong(object->pData() + 4*i, byteOrder());
|
||||
if ( baseOffset() + offset > size_
|
||||
@ -1350,7 +1353,7 @@ namespace Exiv2 {
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
if (object->newGroup_ + i == subImage9Id + 1) {
|
||||
if (i >= maxi) {
|
||||
#ifndef SUPPRESS_WARNINGS
|
||||
EXV_WARNING << "Directory " << groupName(object->group())
|
||||
<< ", entry 0x" << std::setw(4)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user