#include "image_io/jpeg/jpeg_marker.h"
|
|
#include <iomanip>
|
#include <limits>
|
#include <sstream>
|
#include <string>
|
#include <vector>
|
|
namespace photos_editing_formats {
|
namespace image_io {
|
|
using std::string;
|
using std::stringstream;
|
using std::vector;
|
|
// Storage for class (static) data members.
|
const size_t JpegMarker::kLength; // = 2;
|
const size_t JpegMarker::kTypeOffset; // = 1;
|
const Byte JpegMarker::kZERO; // = 0x00;
|
const Byte JpegMarker::kStart; // = 0xFF;
|
const Byte JpegMarker::kSOS; // = 0xDA;
|
const Byte JpegMarker::kSOI; // = 0xD8;
|
const Byte JpegMarker::kEOI; // = 0xD9;
|
const Byte JpegMarker::kAPP0; // = 0xE0;
|
const Byte JpegMarker::kAPP1; // = 0xE1;
|
const Byte JpegMarker::kAPP2; // = 0xE2;
|
const Byte JpegMarker::kFILL; // = 0xFF;
|
|
const std::string JpegMarker::GetName() const {
|
switch (type_) {
|
case 0x01:
|
return "TEM";
|
case 0xC4:
|
return "DHT";
|
case 0xC8:
|
return "JPG";
|
case 0xCC:
|
return "DAC";
|
case JpegMarker::kSOI:
|
return"SOI";
|
case JpegMarker::kEOI:
|
return "EOI";
|
case JpegMarker::kSOS:
|
return "SOS";
|
case 0xDB:
|
return "DQT";
|
case 0xDC:
|
return "DNL";
|
case 0xDD:
|
return "DRI";
|
case 0xDE:
|
return "DHP";
|
case 0xDF:
|
return "EXP";
|
case 0xFE:
|
return "COM";
|
}
|
|
stringstream name_stream;
|
|
if (0xC0 <= type_ && type_ <= 0xC0+15) {
|
name_stream << "SOF" << type_-0xC0;
|
return name_stream.str();
|
}
|
if (0xD0 <= type_ && type_ <= 0xD0+7) {
|
name_stream << "RST" << type_-0xD0;
|
return name_stream.str();
|
}
|
if (JpegMarker::kAPP0 <= type_ && type_ <= JpegMarker::kAPP0+15) {
|
name_stream << "APP" << type_-JpegMarker::kAPP0;
|
return name_stream.str();
|
}
|
if (0xF0 <= type_ && type_ <= 0xF0+13) {
|
name_stream << "JPG" << type_-0xF0;
|
return name_stream.str();
|
}
|
return GetHexString("0x");
|
}
|
|
const std::string JpegMarker::GetHexString(const std::string& prefix) const {
|
stringstream name_stream;
|
name_stream << prefix << std::hex << std::uppercase << std::setfill('0')
|
<< std::setw(2) << static_cast<int>(type_);
|
return name_stream.str();
|
}
|
|
bool JpegMarker::HasVariablePayloadSize() const {
|
return type_ != 0x00 && type_ != 0x01 && (type_ < 0xD0 || type_ > 0xD7) &&
|
type_ != JpegMarker::kSOI && type_ != JpegMarker::kEOI &&
|
type_ != 0xFF;
|
}
|
|
bool JpegMarker::IsEntropySegmentDelimiter() const {
|
return (type_ == kSOS || (type_ >= 0xD0 && type_ <= 0xD7));
|
}
|
|
} // namespace image_io
|
} // namespace photos_editing_formats
|