Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/fujimn_int.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@ namespace Exiv2 {
{ 32768, N_("Film simulation mode") }
};

//! CropMode, tag 0x104d
extern const TagDetails fujiCropMode[] = {
{ 0, N_("None") },
{ 1, N_("Full frame") },
{ 2, N_("Sports Finder Mode") },
{ 4, N_("Electronic Shutter 1.25x Crop") },
};

//! DRangePriority, tag 0x1443
extern const TagDetails fujiDRangePriority[] = {
{ 0, N_("Auto") },
Expand Down Expand Up @@ -264,6 +272,8 @@ namespace Exiv2 {
TagInfo(0x1041, "HighlightTone", N_("Highlight Tone"),
N_("Highlight tone"),
fujiId, makerTags, signedLong, -1, EXV_PRINT_TAG(fujiSHTone)),
TagInfo(0x104d, "CropMode", N_("Crop Mode"), N_("Crop mode"),
fujiId, makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiCropMode)),
TagInfo(0x1100, "Continuous", N_("Continuous"),
N_("Continuous shooting or auto bracketing setting"),
fujiId, makerTags, unsignedShort, -1, EXV_PRINT_TAG(fujiContinuous)),
Expand Down Expand Up @@ -330,6 +340,47 @@ namespace Exiv2 {
TagInfo(0x8003, "FrameNumber", N_("Frame Number"),
N_("Frame number"),
fujiId, makerTags, unsignedShort, -1, printValue),
// #1402
TagInfo(0xf000, "FujiIFD", N_("FujiIFD"),
N_("Fujifilm IFD"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf001, "RawImageFullWidth", N_("Raw Image Full Width"),
N_("Raw Image Full Width"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf002, "RawImageFullHeight", N_("Raw Image Full Height"),
N_("Raw Image Full Height"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf003, "BitsPerSample", N_("Bits Per Sample"),
N_("Bits Per Sample"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf007, "StripOffsets", N_("Strip Offsets"),
N_("Strip Offsets"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf008, "StripByteCounts", N_("Strip Byte Counts"),
N_("Strip Byte Counts"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00a, "BlackLevel", N_("Black Level"),
N_("Black Level"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00b, "GeometricDistortionParams", N_("Geometric Distortion Params"),
N_("Geometric Distortion Params"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00c, "WB_GRBLevelsStandard", N_("WB GRB Levels Standard"),
N_("WB GRB Levels Standard"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00d, "WB_GRBLevelsAuto", N_("WB GRB Levels Auto"),
N_("WB GRB Levels Auto"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00e, "WB_GRBLevels", N_("WB GRB Levels"),
N_("WB GRB Levels"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf00f, "ChromaticAberrationParams", N_("Chromatic Aberration Params"),
N_("Chromatic Aberration Params"),
fujiId, makerTags, undefined, -1, printValue),
TagInfo(0xf010, "VignettingParams", N_("Vignetting Params"),
N_("Vignetting Params"),
fujiId, makerTags, undefined, -1, printValue),

// End of list marker
TagInfo(0xffff, "(UnknownFujiMakerNoteTag)", "(UnknownFujiMakerNoteTag)",
N_("Unknown FujiMakerNote tag"),
Expand Down
120 changes: 86 additions & 34 deletions src/rafimage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#include "enforce.hpp"
#include "safe_op.hpp"

// + standard includes
// +standard includes
#include <string>
#include <cstring>
#include <iostream>
Expand Down Expand Up @@ -92,7 +92,7 @@ namespace Exiv2 {
// not supported
throw(Error(kerInvalidSettingForImage, "Image comment", "RAF"));
}

void RafImage::printStructure(std::ostream& out, PrintStructureOption option, int depth) {
if (io_->open() != 0) {
throw Error(kerDataSourceOpenFailed, io_->path(), strError());
Expand All @@ -102,17 +102,21 @@ namespace Exiv2 {
if (io_->error() || io_->eof()) throw Error(kerFailedToReadImageData);
throw Error(kerNotAnImage, "RAF");
}
size_t address = 0 ;
size_t address2 = 0 ;
const bool bPrint = option==kpsBasic || option==kpsRecursive;
if ( bPrint ) {
io_->seek(0,BasicIo::beg); // rewind
address = io_->tell();
const char* format = " %8d | %8d | ";

{
out << Internal::indent(depth)
<< "STRUCTURE OF RAF FILE: "
<< io().path()
<< std::endl;
out << Internal::indent(depth)
<< Internal::stringFormat(" Length | Offset | Payload")
<< Internal::stringFormat(" Address | Length | Payload")
<< std::endl;
}

Expand All @@ -121,63 +125,79 @@ namespace Exiv2 {
magicdata[16] = 0;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 16, 0)
<< "Magic number : "
<< std::string((char*)&magicdata)
<< Internal::stringFormat(format,address, 16, 0)
<< " magic : "
<< (char*) magicdata
<< std::endl;
}

address = io_->tell();
byte data1 [5];
io_->read(data1, 4);
data1[4] = 0;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 16)
<< "data 1 : "
<< Internal::stringFormat(format,address, 4, 16)
<< " data1 : "
<< std::string((char*)&data1)
<< std::endl;
}

address = io_->tell();
byte data2 [9];
io_->read(data2, 8);
data2[8] = 0;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 8, 20)
<< "data 2 : "
<< Internal::stringFormat(format,address, 8, 20)
<< " data2 : "
<< std::string((char*)&data2)
<< std::endl;
}

address = io_->tell();
byte camdata [33];
io_->read(camdata, 32);
camdata[32] = 0;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 32, 28)
<< "camera : "
<< Internal::stringFormat(format,address, 32, 28)
<< " camera : "
<< std::string((char*)&camdata)
<< std::endl;
}

address = io_->tell();
byte dir_version [5];
io_->read(dir_version, 4);
dir_version[4] = 0;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 60)
<< "dir version : "
<< Internal::stringFormat(format,address, 4, 60)
<< " version : "
<< std::string((char*)&dir_version)
<< std::endl;
}

byte unknown [20];
io_->read(unknown, 20);
address = io_->tell();
DataBuf unknown(20);
io_->read(unknown.pData_,unknown.size_);
{
out << Internal::indent(depth)
<< Internal::stringFormat(format,address, 20)
<< " unknown : "
<< Internal::binaryToString(makeSlice(unknown, 0,unknown.size_))
<< std::endl;
}


address = io_->tell();
byte jpg_img_offset [4];
io_->read(jpg_img_offset, 4);
byte jpg_img_length [4];
address2 = io_->tell();
io_->read(jpg_img_length, 4);

long jpg_img_off = Exiv2::getULong((const byte *) jpg_img_offset, bigEndian);
long jpg_img_len = Exiv2::getULong((const byte *) jpg_img_length, bigEndian);
std::stringstream j_off;
Expand All @@ -186,20 +206,22 @@ namespace Exiv2 {
j_len << jpg_img_len;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 84)
<< "JPEG Image Offset : "
<< Internal::stringFormat(format,address, 4)
<< "JPEG Offset : "
<< j_off.str()
<< std::endl;
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 88)
<< "JPEG Image Length : "
<< Internal::stringFormat(format,address2, 4)
<< "JPEG Length : "
<< j_len.str()
<< std::endl;
}

address = io_->tell();
byte cfa_header_offset [4];
io_->read(cfa_header_offset, 4);
byte cfa_header_length [4];
address2 = io_->tell();
io_->read(cfa_header_length, 4);
long cfa_hdr_off = Exiv2::getULong((const byte *) cfa_header_offset, bigEndian);
long cfa_hdr_len = Exiv2::getULong((const byte *) cfa_header_length, bigEndian);
Expand All @@ -209,20 +231,22 @@ namespace Exiv2 {
ch_len << cfa_hdr_len;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 92)
<< "CFA Header Offset : "
<< Internal::stringFormat(format,address, 4)
<< " CFA Offset : "
<< ch_off.str()
<< std::endl;
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 96)
<< "CFA Header Length : "
<< Internal::stringFormat(format,address2, 4)
<< " CFA Length : "
<< ch_len.str()
<< std::endl;
}

byte cfa_offset [4];
address = io_->tell();
io_->read(cfa_offset, 4);
byte cfa_length [4];
address2 = io_->tell();
io_->read(cfa_length, 4);
long cfa_off = Exiv2::getULong((const byte *) cfa_offset, bigEndian);
long cfa_len = Exiv2::getULong((const byte *) cfa_length, bigEndian);
Expand All @@ -232,44 +256,47 @@ namespace Exiv2 {
c_len << cfa_len;
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 100)
<< "CFA Offset : "
<< Internal::stringFormat(format,address,4)
<< "TIFF Offset : "
<< c_off.str()
<< std::endl;
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", 4, 104)
<< "CFA Length : "
<< Internal::stringFormat(format,address2,4)
<< "TIFF Length : "
<< c_len.str()
<< std::endl;
}

io_->seek(jpg_img_off, BasicIo::beg); // rewind
address = io_->tell();
DataBuf payload(16); // header is different from chunks
io_->read(payload.pData_, payload.size_);
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", jpg_img_len, jpg_img_off)
<< "jpg image / exif : "
<< Internal::stringFormat(format,address, jpg_img_len) // , jpg_img_off)
<< " JPEG : "
<< Internal::binaryToString(makeSlice(payload, 0, payload.size_))
<< std::endl;
}

io_->seek(cfa_hdr_off, BasicIo::beg); // rewind
address = io_->tell();
io_->read(payload.pData_, payload.size_);
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", cfa_hdr_len, cfa_hdr_off)
<< "CFA Header: "
<< Internal::stringFormat(format,address, cfa_hdr_len, cfa_hdr_off)
<< " CFA : "
<< Internal::binaryToString(makeSlice(payload, 0, payload.size_))
<< std::endl;
}

io_->seek(cfa_off, BasicIo::beg); // rewind
address = io_->tell();
io_->read(payload.pData_, payload.size_);
{
out << Internal::indent(depth)
<< Internal::stringFormat(" %8u | %8u | ", cfa_len, cfa_off)
<< "CFA : "
<< Internal::stringFormat(format,address, cfa_len, cfa_off)
<< " TIFF : "
<< Internal::binaryToString(makeSlice(payload, 0, payload.size_))
<< std::endl;
}
Expand Down Expand Up @@ -330,6 +357,31 @@ namespace Exiv2 {
exifData_["Exif.Image2.JPEGInterchangeFormatLength"] = getULong(jpg_img_length, bigEndian);

setByteOrder(bo);

// parse the tiff
byte readBuff[4];
if (io_->seek(100, BasicIo::beg) != 0) throw Error(kerFailedToReadImageData);
if (io_->read(readBuff, 4) != 4 ) throw Error(kerFailedToReadImageData);
uint32_t tiffOffset = Exiv2::getULong(readBuff, bigEndian);

if (io_->read(readBuff, 4) != 4) throw Error(kerFailedToReadImageData);
uint32_t tiffLength = Exiv2::getULong(readBuff, bigEndian);

// sanity check. Does tiff lie inside the file?
enforce(Safe::add(tiffOffset, tiffLength) <= io_->size(), kerCorruptedMetadata);

DataBuf tiff(tiffLength);
if (io_->seek(tiffOffset, BasicIo::beg) != 0) throw Error(kerFailedToReadImageData);
io_->read(tiff.pData_, tiff.size_);

if (!io_->error() && !io_->eof())
{
TiffParser::decode(exifData_,
iptcData_,
xmpData_,
tiff.pData_,
tiff.size_);
}
} // RafImage::readMetadata

void RafImage::writeMetadata()
Expand Down
12 changes: 7 additions & 5 deletions src/tiffcomposite_int.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ namespace Exiv2 {
Special TIFF tags for the use in TIFF structures only
*/
namespace Tag {
const uint32_t none = 0x10000; //!< Dummy tag
const uint32_t root = 0x20000; //!< Special tag: root IFD
const uint32_t next = 0x30000; //!< Special tag: next IFD
const uint32_t all = 0x40000; //!< Special tag: all tags in a group
const uint32_t pana = 0x80000; //!< Special tag: root IFD of Panasonic RAW images
const uint32_t none = 0x10000; //!< Dummy tag
const uint32_t root = 0x20000; //!< Special tag: root IFD
const uint32_t next = 0x30000; //!< Special tag: next IFD
const uint32_t all = 0x40000; //!< Special tag: all tags in a group
const uint32_t pana = 0x80000; //!< Special tag: root IFD of Panasonic RAW images
const uint32_t fuji = 0x100000; //!< Special tag: root IFD of Fujifilm RAF images
}

/*!
Expand Down Expand Up @@ -860,6 +861,7 @@ namespace Exiv2 {
*/
class TiffDirectory : public TiffComponent {
friend class TiffEncoder;
friend class TiffDecoder;
public:
//! @name Creators
//@{
Expand Down
12 changes: 11 additions & 1 deletion src/tiffimage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,12 +256,22 @@ namespace Exiv2 {
uint32_t size
)
{
uint32_t root = Tag::root;

// #1402 Fujifilm RAF. Change root when parsing embedded tiff
Exiv2::ExifKey key("Exif.Image.Make");
if (exifData.findKey(key) != exifData.end()) {
if ( exifData.findKey(key)->toString() == "FUJIFILM" ) {
root = Tag::fuji;
}
}

return TiffParserWorker::decode(exifData,
iptcData,
xmpData,
pData,
size,
Tag::root,
root,
TiffMapping::findDecoder);
} // TiffParser::decode

Expand Down
Loading