65 if (width == 0 || height == 0 || width > 5632 || height > 3720)
66 ThrowRDE(
"Unexpected image dimensions found: (%u; %u)", width, height);
71 ThrowRDE(
"Byte count number does not match strip size: "
72 "count:%u, stips:%u ",
76 if (yPerSlice == 0 || yPerSlice >
static_cast<uint32_t>(
mRaw->dim.y) ||
78 ThrowRDE(
"Invalid y per slice %u or strip count %u (height = %d)",
82 switch (bitPerPixel) {
87 ThrowRDE(
"Unexpected bits per pixel: %u.", bitPerPixel);
90 vector<RawSlice> slices;
91 slices.reserve(counts->
count);
102 if (offY + yPerSlice > height)
103 slice.
h = height - offY;
110 ThrowRDE(
"Slice offset/count invalid");
112 slices.push_back(slice);
116 ThrowRDE(
"No valid slices found. File probably truncated.");
127 for (
const RawSlice& slice : slices) {
131 (
static_cast<uint64_t>(slice.count) * 8U) / (slice.h * width));
132 const auto inputPitch = width * bitPerPixel / 8;
134 ThrowRDE(
"Bad input pitch. Can not decode anything.");
140 u.readUncompressedRaw();
147 const std::string& make,
148 const std::string& model,
149 const std::string& mode) {
156 switch (supportStatus) {
162 "Unable to find camera in database: '%s' '%s' '%s'\nPlease "
163 "consider providing samples on <https://raw.pixls.us/>, thanks!",
164 make.c_str(), model.c_str(), mode.c_str());
167 case UnknownNoSamples:
168 case SupportedNoSamples:
171 "Camera support status is unknown: '%s' '%s' '%s'\n"
172 "Please consider providing samples on <https://raw.pixls.us/> "
173 "if you wish for the support to not be discontinued, thanks!",
174 make.c_str(), model.c_str(), mode.c_str());
183 switch (supportStatus) {
186 case SupportedNoSamples:
189 ThrowRDE(
"Camera not supported (explicit). Sorry.");
191 case UnknownNoSamples:
194 ThrowRDE(
"Camera '%s' '%s', mode '%s' not supported, and not allowed to "
196 make.c_str(), model.c_str(), mode.c_str());
205 const std::string& make,
206 const std::string& model,
207 const std::string& mode) {
208 mRaw->metadata.make = make;
209 mRaw->metadata.model = model;
219 "Camera not supported in this version. Update RawSpeed for support.");
226 const std::string& make,
const std::string& model,
227 const std::string& mode,
int iso_speed) {
228 mRaw->metadata.isoSpeed = iso_speed;
248 mRaw->metadata.make = make;
249 mRaw->metadata.model = model;
250 mRaw->metadata.mode = mode;
271 mRaw->blackLevel = sensor->mBlackLevel;
272 mRaw->whitePoint = sensor->mWhiteLevel;
273 if (
mRaw->blackAreas.empty() && !sensor->mBlackLevelSeparate.empty()) {
277 mRaw->blackLevelSeparate =
279 auto blackLevelSeparate1D =
280 *
mRaw->blackLevelSeparate->getAsArray1DRef();
281 for (
int i = 0; i < cfaArea; i++) {
282 blackLevelSeparate1D(i) = sensor->mBlackLevelSeparate[i];
284 }
else if (!
mRaw->isCFA &&
285 mRaw->getCpp() <= sensor->mBlackLevelSeparate.size()) {
286 mRaw->blackLevelSeparate =
288 auto blackLevelSeparate1D =
289 *
mRaw->blackLevelSeparate->getAsArray1DRef();
291 blackLevelSeparate1D(i) = sensor->mBlackLevelSeparate[i];
301 std::string cfa_black =
hints.get(
"final_cfa_black", std::string());
302 if (!cfa_black.empty()) {
303 vector<std::string> v =
splitString(cfa_black,
',');
305 mRaw->setError(
"Expected 4 values '10,20,30,20' as values for "
306 "final_cfa_black hint.");
308 auto blackLevelSeparate1D = *
mRaw->blackLevelSeparate->getAsArray1DRef();
309 for (
int i = 0; i < 4; i++) {
310 blackLevelSeparate1D(i) = stoi(v[i]);
assert(dim.area() >=area)
std::string canonical_alias
std::string canonical_model
std::string canonical_make
std::vector< BlackArea > blackAreas
const CameraSensorInfo * getSensorInfo(int iso) const
SupportStatus supportStatus
std::vector< NotARational< int > > color_matrix
virtual void setMetaData(const CameraMetaData *meta, const std::string &make, const std::string &model, const std::string &mode, int iso_speed=0)
bool interpolateBadPixels
void checkSupport(const CameraMetaData *meta)
bool checkCameraSupported(const CameraMetaData *meta, const std::string &make, const std::string &model, const std::string &mode)
virtual void decodeMetaDataInternal(const CameraMetaData *meta)=0
bool handleCameraSupport(const CameraMetaData *meta, const std::string &make, const std::string &model, const std::string &mode)
void decodeUncompressed(const TiffIFD *rawIFD, BitOrder order) const
void decodeMetaData(const CameraMetaData *meta)
virtual int getDecoderVersion() const =0
virtual RawImage decodeRawInternal()=0
virtual void checkSupportInternal(const CameraMetaData *meta)=0
virtual iRectangle2D getDefaultCrop()
void fixBadPixels() REQUIRES(!mBadPixelMutex)
Array2DRef< std::byte > getByteDataAsUncroppedArray2DRef() noexcept
uint32_t getU32(uint32_t index=0) const
TiffEntry * getEntry(TiffTag tag) const
area_type RAWSPEED_READONLY area() const
constexpr uint64_t RAWSPEED_READNONE roundUpDivisionSafe(uint64_t value, uint64_t div)
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
void writeLog(DEBUG_PRIO priority, const char *format,...)
Array2DRef(Array1DRef< T > data, int width, int height, int pitch) -> Array2DRef< T >
std::vector< std::string > splitString(const std::string &input, char c=' ')
static void CheckMemIsInitialized(const void *addr, size_t size)