blob: a9f1928a81f895f29c2686736faa28e042a975a4 [file] [log] [blame]
#ifndef IMAGE_IO_JPEG_JPEG_INFO_BUILDER_H_ // NOLINT
#define IMAGE_IO_JPEG_JPEG_INFO_BUILDER_H_ // NOLINT
#include <set>
#include <string>
#include <vector>
#include "image_io/base/data_range.h"
#include "image_io/jpeg/jpeg_info.h"
#include "image_io/jpeg/jpeg_segment_processor.h"
#include "image_io/jpeg/jpeg_xmp_info_builder.h"
namespace photos_editing_formats {
namespace image_io {
/// JpegInfoBuilder is JpegSegmentProcessor that collects the location and type
/// of depth information in the JPEG file so that subsequent operations can
/// efficiently maniuplate it.
class JpegInfoBuilder : public JpegSegmentProcessor {
public:
JpegInfoBuilder();
/// @return The JpegInfo with the depth information obtained from the
/// scanner as a result of processing the segments it processes.
const JpegInfo& GetInfo() const { return jpeg_info_; }
/// @param image_limit The max number of images to process. By default there
/// is no limit on the number of images processed.
void SetImageLimit(int image_limit) { image_limit_ = image_limit; }
/// By default the info builder does not capture the value of the segment in
/// the segment infos contained in the @c JpegInfo object. Call this function
/// to capture the bytes of the indicated segment types.
/// @param type The type of segment info to capture the value of.
void SetCaptureSegmentBytes(const std::string& segment_info_type);
/// @return True if the segment is a primary Xmp segment.
bool IsPrimaryXmpSegment(const JpegSegment& segment) const;
/// @return True if the segment is an extended Xmp segment.
bool IsExtendedXmpSegment(const JpegSegment& segment) const;
void Start(JpegScanner* scanner) override;
void Process(JpegScanner* scanner, const JpegSegment& segment) override;
void Finish(JpegScanner* scanner) override;
private:
/// @return True if the data members indicate Apple depth is present.
bool HasAppleDepth() const;
/// @return True if the data members indicate Apple matte is present.
bool HasAppleMatte() const;
/// @return True if the segment is an Mpf segment.
bool IsMpfSegment(const JpegSegment& segment) const;
/// @return True if the segment is an Exif segment.
bool IsExifSegment(const JpegSegment& segment) const;
/// @return True if the segment is an Jfif segment.
bool IsJfifSegment(const JpegSegment& segment) const;
/// Captures the segment bytes into the a JpegSegmentInfo's byte vector if
/// the SetCaptureSegmentBytes() has been called for the segment info type.
/// @param type The type of segment info being processed.
/// @param segment The segment being processed.
/// @param bytes A vector to hold the segment bytes.
void MaybeCaptureSegmentBytes(const std::string& type,
const JpegSegment& segment,
std::vector<Byte>* bytes) const;
/// @return True if the segment's extended xmp guid matches the one from the
/// primary xmp segment.
bool HasMatchingExtendedXmpGuid(const JpegSegment& segment) const;
/// @return True if the segment contains the given id.
bool HasId(const JpegSegment& segment, const char* id) const;
/// Sets the primary segment guid value using properties in the given segment.
/// @param The segment from which to obtain the primary xmp guid value.
void SetPrimaryXmpGuid(const JpegSegment& segment);
/// Sets the Xmp mime type using property values in the given segment.
/// @param The segment from which to obtain the mime property value.
/// @param xmp_info_type The type of xmp data that determines the mime
/// property name to look for.
void SetXmpMimeType(const JpegSegment& segment,
JpegXmpInfo::Type xmp_info_type);
/// The limit on the number of images to process. After this many images have
/// been found, the Process() function will tell the JpegScanner to stop.
int image_limit_;
/// The number of images encountered in the JPEG file so far.
int image_count_;
/// The number of APP2/MPF segments encountered per image. One criterial used
/// to determine if Apple depth data is present is that the first image has
/// an APP2/MPF segment.
std::vector<int> image_mpf_count_;
/// The number of APP1/XMP segments encountered per image. Another criteria
/// used to determine if Apple depth data is present is that the second or
/// following image contains one of these segments.
std::vector<int> image_xmp_apple_depth_count_;
/// The number of APP1/XMP segments encountered per image. Another criteria
/// used to determine if Apple matte data is present is that the second or
/// following image contains one of these segments.
std::vector<int> image_xmp_apple_matte_count_;
/// The DataRange of the most recent SOI type segment. This is used to compute
/// the range of the image that represents the Apple depth data.
DataRange most_recent_soi_marker_range_;
/// The GUID value of the APP1/XMP segments that contain GDepth/GImage data.
std::string primary_xmp_guid_;
/// Builder helpers for gdepth and gimage xmp type segments.
JpegXmpInfoBuilder gdepth_info_builder_;
JpegXmpInfoBuilder gimage_info_builder_;
/// The collected data describing the type/location of data in the JPEG file.
JpegInfo jpeg_info_;
/// The types of the segment info type to capture the bytes of.
std::set<std::string> capture_segment_bytes_types_;
};
} // namespace image_io
} // namespace photos_editing_formats
#endif // IMAGE_IO_JPEG_JPEG_INFO_BUILDER_H_ // NOLINT