2929namespace Exiv2 {
3030namespace {
3131// JPEG Segment markers (The first byte is always 0xFF, the value of these constants correspond to the 2nd byte)
32- constexpr byte dht_ = 0xc4 ; // !< JPEG DHT marker: Define Huffman Table(s)
33- constexpr byte dqt_ = 0xdb ; // !< JPEG DQT marker: Define Quantization Table(s)
34- constexpr byte dri_ = 0xdd ; // !< JPEG DRI marker
3532constexpr byte sos_ = 0xda ; // !< JPEG SOS marker
36- constexpr byte eoi_ = 0xd9 ; // !< JPEG EOI marker
3733constexpr byte app0_ = 0xe0 ; // !< JPEG APP0 marker
3834constexpr byte app1_ = 0xe1 ; // !< JPEG APP1 marker
3935constexpr byte app2_ = 0xe2 ; // !< JPEG APP2 marker
4036constexpr byte app13_ = 0xed ; // !< JPEG APP13 marker
4137constexpr byte com_ = 0xfe ; // !< JPEG Comment marker
42- constexpr byte soi_ = 0xd8 ; // /!< SOI marker
38+
39+ // Markers without payload
40+ constexpr byte soi_ = 0xd8 ; // /!< SOI marker
41+ constexpr byte eoi_ = 0xd9 ; // !< JPEG EOI marker
42+ constexpr byte rst1_ = 0xd0 ; // !< JPEG Restart 0 Marker (from 0xD0 to 0xD7 there might be 8 of these markers)
4343
4444// Start of Frame markers, nondifferential Huffman-coding frames
4545constexpr byte sof0_ = 0xc0 ; // !< JPEG Start-Of-Frame marker
46- constexpr byte sof1_ = 0xc1 ; // !< JPEG Start-Of-Frame marker
47- constexpr byte sof2_ = 0xc2 ; // !< JPEG Start-Of-Frame marker
4846constexpr byte sof3_ = 0xc3 ; // !< JPEG Start-Of-Frame marker
4947
5048// Start of Frame markers, differential Huffman-coding frames
5149constexpr byte sof5_ = 0xc5 ; // !< JPEG Start-Of-Frame marker
52- constexpr byte sof6_ = 0xc6 ; // !< JPEG Start-Of-Frame marker
53- constexpr byte sof7_ = 0xc7 ; // !< JPEG Start-Of-Frame marker
54-
55- // Start of Frame markers, nondifferential arithmetic-coding frames
56- constexpr byte sof9_ = 0xc9 ; // !< JPEG Start-Of-Frame marker
57- constexpr byte sof10_ = 0xca ; // !< JPEG Start-Of-Frame marker
58- constexpr byte sof11_ = 0xcb ; // !< JPEG Start-Of-Frame marker
5950
6051// Start of Frame markers, differential arithmetic-coding frames
61- constexpr byte sof13_ = 0xcd ; // !< JPEG Start-Of-Frame marker
62- constexpr byte sof14_ = 0xce ; // !< JPEG Start-Of-Frame marker
6352constexpr byte sof15_ = 0xcf ; // !< JPEG Start-Of-Frame marker
6453
65- constexpr auto exifId_ = " Exif\0\0 " ; // !< Exif identifier
66- constexpr auto jfifId_ = " JFIF\0 " ; // !< JFIF identifier
54+ constexpr auto exifId_ = " Exif\0\0 " ; // !< Exif identifier
55+ // constexpr auto jfifId_ = "JFIF\0"; //!< JFIF identifier
6756constexpr auto xmpId_ = " http://ns.adobe.com/xap/1.0/\0 " ; // !< XMP packet identifier
6857constexpr auto iccId_ = " ICC_PROFILE\0 " ; // !< ICC profile identifier
6958
@@ -76,12 +65,11 @@ inline bool inRange2(int value, int lo1, int hi1, int lo2, int hi2) {
7665}
7766
7867// / @brief has the segment a non-zero payload?
79- // / @param marker The marker at the start of a segment
68+ // / @param m The marker at the start of a segment
8069// / @return true if the segment has a length field/payload
81- bool markerHasLength (byte marker) {
82- // / \todo there are less markers without payload. Maybe we should revert the logic.
83- return (marker >= sof0_ && marker <= sof15_) || (marker >= app0_ && marker <= (app0_ | 0x0F )) || marker == dht_ ||
84- marker == dqt_ || marker == dri_ || marker == com_ || marker == sos_;
70+ bool markerHasLength (byte m) {
71+ bool markerWithoutLength = m >= rst1_ && m <= eoi_;
72+ return !markerWithoutLength;
8573}
8674
8775void readSegmentSize (const byte marker, BasicIo& io, std::array<byte, 2 >& buf, std::uint16_t & size) {
@@ -294,6 +282,7 @@ byte JpegBase::advanceToMarker(ErrorCode err) const {
294282 throw Error (err);
295283 }
296284
285+ // / \todo should we check for validity of the marker? 0x59 does not look fine
297286 // Markers can start with any number of 0xff
298287 while ((c = io_->getb ()) == 0xff ) {
299288 }
0 commit comments