aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYujie Qin <yujieqin@google.com>2016-01-11 16:21:21 +0100
committerYujie Qin <yujieqin@google.com>2016-01-11 16:21:21 +0100
commit3cda805d84a285063face5033992d755ab468e10 (patch)
treee15d2f50c499164ceba78d8846b3f4c1c47e4767 /src
parent75ba919fdcd78a4bfc30efde3ed9bc92b2c42ea3 (diff)
downloadpiex-3cda805d84a285063face5033992d755ab468e10.tar.gz
Update PIEX.
Diffstat (limited to 'src')
-rw-r--r--src/piex.cc57
-rw-r--r--src/piex_types.h13
2 files changed, 39 insertions, 31 deletions
diff --git a/src/piex.cc b/src/piex.cc
index 9fd028c..1d7401f 100644
--- a/src/piex.cc
+++ b/src/piex.cc
@@ -77,6 +77,19 @@ Error GetExifData(const std::uint32_t exif_offset, StreamInterface* stream,
&tiff_content, preview_image_data);
}
+// Reads the jpeg compressed thumbnail information.
+void GetThumbnailOffsetAndLength(StreamInterface* stream,
+ PreviewImageData* preview_image_data) {
+ const std::uint32_t kNumberOfIfds = 2;
+ const TagSet extended_tags = {kTiffTagJpegByteCount, kTiffTagJpegOffset};
+ PreviewImageData thumbnail_data;
+ if (GetPreviewData(extended_tags, kNumberOfIfds, stream, &thumbnail_data) ==
+ kOk) {
+ preview_image_data->thumbnail_offset = thumbnail_data.jpeg_offset;
+ preview_image_data->thumbnail_length = thumbnail_data.jpeg_length;
+ }
+}
+
Error GetExifIfd(const Endian endian, StreamInterface* stream,
TiffDirectory* exif_ifd) {
const std::uint32_t kTiffOffset = 0;
@@ -114,9 +127,10 @@ Error GetMakernoteIfd(const TiffDirectory& exif_ifd, const Endian endian,
}
std::uint32_t next_ifd_offset;
- return ParseDirectory(*makernote_offset, *makernote_offset + 12, endian,
- {kOlymTagCameraSettings, kOlymTagRawProcessing}, stream,
- makernote_ifd, &next_ifd_offset);
+ return ParseDirectory(
+ *makernote_offset, *makernote_offset + 12, endian,
+ {kTiffTagImageWidth, kOlymTagCameraSettings, kOlymTagRawProcessing},
+ stream, makernote_ifd, &next_ifd_offset);
}
Error GetCameraSettingsIfd(const TiffDirectory& makernote_ifd,
@@ -190,6 +204,16 @@ Error GetOlympusPreviewImage(StreamInterface* stream,
return error;
}
+ const std::uint32_t kThumbnailTag = 0x0100;
+ if (makernote_ifd.Has(kThumbnailTag)) {
+ if (!makernote_ifd.GetOffsetAndLength(
+ kThumbnailTag, tiff_directory::TIFF_TYPE_UNDEFINED,
+ &preview_image_data->thumbnail_offset,
+ &preview_image_data->thumbnail_length)) {
+ return kFail;
+ }
+ }
+
TiffDirectory camera_settings_ifd(endian);
error = GetCameraSettingsIfd(makernote_ifd, makernote_offset, endian, stream,
&camera_settings_ifd);
@@ -275,8 +299,9 @@ Error ArwGetPreviewData(StreamInterface* stream,
const TagSet extended_tags = {kExifTagHeight, kExifTagWidth,
kTiffTagJpegByteCount, kTiffTagJpegOffset,
kTiffTagSubIfd};
- // This camera maker doesn't embed a full jpeg.
- preview_image_data->full_preview = false;
+
+ GetThumbnailOffsetAndLength(stream, preview_image_data);
+
const std::uint32_t kNumberOfIfds = 1;
return GetPreviewData(extended_tags, kNumberOfIfds, stream,
preview_image_data);
@@ -286,8 +311,9 @@ Error Cr2GetPreviewData(StreamInterface* stream,
PreviewImageData* preview_image_data) {
const TagSet extended_tags = {kExifTagHeight, kExifTagWidth,
kTiffTagStripByteCounts, kTiffTagStripOffsets};
- // This camera maker embeds at least a full sized jpeg.
- preview_image_data->full_preview = true;
+
+ GetThumbnailOffsetAndLength(stream, preview_image_data);
+
const std::uint32_t kNumberOfIfds = 1;
return GetPreviewData(extended_tags, kNumberOfIfds, stream,
preview_image_data);
@@ -332,10 +358,6 @@ Error DngGetPreviewData(StreamInterface* stream,
}
preview_image_data->jpeg_length = jpeg_length;
preview_image_data->jpeg_offset = jpeg_offset;
-
- // This format doesn't necessarily embed a full jpeg.
- preview_image_data->full_preview = false;
-
return kOk;
}
@@ -344,8 +366,6 @@ Error NefGetPreviewData(StreamInterface* stream,
const TagSet extended_tags = {kTiffTagImageWidth, kTiffTagImageLength,
kTiffTagJpegByteCount, kTiffTagJpegOffset,
kTiffTagSubIfd};
- // This camera maker embeds a full jpeg.
- preview_image_data->full_preview = true;
const std::uint32_t kNumberOfIfds = 2;
Error error =
GetPreviewData(extended_tags, kNumberOfIfds, stream, preview_image_data);
@@ -386,9 +406,6 @@ Error NefGetPreviewData(StreamInterface* stream,
Error OrfGetPreviewData(StreamInterface* stream,
PreviewImageData* preview_image_data) {
- // This camera maker embeds a full jpeg.
- preview_image_data->full_preview = true;
-
// Omit kUnsupported, because the exif data does not contain any preview
// image.
if (GetExifData(0, stream, preview_image_data) == kFail) {
@@ -427,10 +444,6 @@ Error RafGetPreviewData(StreamInterface* stream,
// Merge the Exif data with the RAW data to form the preview_image_data.
preview_image_data->jpeg_offset = jpeg_offset;
preview_image_data->jpeg_length = jpeg_length;
-
- // This camera maker doesn't embed a full jpeg.
- preview_image_data->full_preview = false;
-
return kOk;
}
@@ -440,10 +453,6 @@ Error Rw2GetPreviewData(StreamInterface* stream,
kPanaTagBottomBorder, kPanaTagRightBorder,
kPanaTagIso, kPanaTagJpegImage,
kTiffTagJpegByteCount, kTiffTagJpegOffset};
-
- // This camera maker embeds not a full jpeg.
- preview_image_data->full_preview = false;
-
// Parse the RAW data to get the ISO, offset and length of the preview image,
// which contains the Exif information.
const std::uint32_t kNumberOfIfds = 1;
diff --git a/src/piex_types.h b/src/piex_types.h
index 54dc5b6..ad96b76 100644
--- a/src/piex_types.h
+++ b/src/piex_types.h
@@ -56,9 +56,14 @@ struct PreviewImageData {
std::string date_stamp; // Giving as "YYYY:MM:DD" format.
};
- // Optional data to find the preview image and to handle it correctly.
+ // Optional data to find the preview and thumbnail image to handle them
+ // correctly. A thumbnail is typically 160x120 pixel small and usually
+ // has black borders at the top and bottom. If length is 0 the image could not
+ // be extracted.
std::uint32_t jpeg_offset = 0;
std::uint32_t jpeg_length = 0;
+ std::uint32_t thumbnail_offset = 0;
+ std::uint32_t thumbnail_length = 0;
std::uint32_t exif_orientation = 1; // horizontal as default
ColorSpace color_space = kSrgb;
@@ -73,12 +78,6 @@ struct PreviewImageData {
Rational fnumber;
Rational focal_length;
Gps gps;
-
- // Hint of the extracted preview size compared to the actual RAW image.
- // If full_preview == true, then the preview suppose to have a similar or
- // larger size then the RAW image, else the preview image might be
- // significantly smaller, e.g. only half of the RAW image size.
- bool full_preview;
};
// Defines the StreamInterface that needs to be implemented by the client.