Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Larger black level separate pattern size support #594

Draft
wants to merge 6 commits into
base: develop
Choose a base branch
from
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Change blackLevelSeparateStorage to be std::vector-based
LebedevRI committed Dec 26, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit a7fca6ccd80719bdbaa5e54efde48715bdcca426
2 changes: 1 addition & 1 deletion src/librawspeed/common/RawImage.h
Original file line number Diff line number Diff line change
@@ -160,7 +160,7 @@ class RawImageData : public ErrorLog {
bool isCFA{true};
ColorFilterArray cfa;
int blackLevel = -1;
std::array<int, 4> blackLevelSeparateStorage;
std::vector<int> blackLevelSeparateStorage;
Array2DRef<int> blackLevelSeparate;
int whitePoint = 65536;
std::vector<BlackArea> blackAreas;
2 changes: 1 addition & 1 deletion src/librawspeed/common/RawImageDataFloat.cpp
Original file line number Diff line number Diff line change
@@ -87,7 +87,7 @@ void RawImageDataFloat::calculateBlackAreas() {
}
}

blackLevelSeparate = Array2DRef(blackLevelSeparateStorage.data(), 2, 2);
blackLevelSeparate = Array2DRef<int>::create(blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();

if (!totalpixels) {
2 changes: 1 addition & 1 deletion src/librawspeed/common/RawImageDataU16.cpp
Original file line number Diff line number Diff line change
@@ -108,7 +108,7 @@ void RawImageDataU16::calculateBlackAreas() {
}
}

blackLevelSeparate = Array2DRef(blackLevelSeparateStorage.data(), 2, 2);
blackLevelSeparate = Array2DRef<int>::create(blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *blackLevelSeparate.getAsArray1DRef();

if (!totalpixels) {
2 changes: 1 addition & 1 deletion src/librawspeed/decoders/ArwDecoder.cpp
Original file line number Diff line number Diff line change
@@ -646,7 +646,7 @@ void ArwDecoder::GetWB() const {
if (bl->count != 4)
ThrowRDE("Black Level has %d entries instead of 4", bl->count);
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int i = 0; i < 4; ++i)
blackLevelSeparate1D(i) = bl->getU16(i) >> mShiftDownScaleForExif;
2 changes: 1 addition & 1 deletion src/librawspeed/decoders/Cr2Decoder.cpp
Original file line number Diff line number Diff line change
@@ -407,7 +407,7 @@ bool Cr2Decoder::decodeCanonColorData() const {
mRaw->whitePoint = wb->getU16(levelOffsets->second);

mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int c = 0; c != 4; ++c)
blackLevelSeparate1D(c) = wb->getU16(c + levelOffsets->first);
8 changes: 4 additions & 4 deletions src/librawspeed/decoders/DngDecoder.cpp
Original file line number Diff line number Diff line change
@@ -633,7 +633,7 @@ void DngDecoder::handleMetadata(const TiffIFD* raw) {
mRaw->blackAreas.clear();
mRaw->blackLevel = 0;
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
std::fill(blackLevelSeparate1D.begin(), blackLevelSeparate1D.end(), 0);
// FIXME: why do we provide both the `blackLevel` and `blackLevelSeparate`?
@@ -831,15 +831,15 @@ bool DngDecoder::decodeBlackLevels(const TiffIFD* raw) const {
ThrowRDE("Error decoding black level");

mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int y = 0; y < 2; y++) {
for (int x = 0; x < 2; x++)
blackLevelSeparate1D(y * 2 + x) = implicit_cast<int>(value);
}
} else {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int y = 0; y < 2; y++) {
for (int x = 0; x < 2; x++) {
@@ -914,7 +914,7 @@ void DngDecoder::setBlack(const TiffIFD* raw) const {
// Black defaults to 0
// FIXME: is this the right thing to do?
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
std::fill(blackLevelSeparate1D.begin(), blackLevelSeparate1D.end(), 0);

2 changes: 1 addition & 1 deletion src/librawspeed/decoders/NefDecoder.cpp
Original file line number Diff line number Diff line change
@@ -628,7 +628,7 @@ void NefDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
ThrowRDE("Bad bit per pixel: %i", bitPerPixel);
const int sh = 14 - bitPerPixel;
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
blackLevelSeparate1D(0) = bl->getU16(0) >> sh;
blackLevelSeparate1D(1) = bl->getU16(1) >> sh;
2 changes: 1 addition & 1 deletion src/librawspeed/decoders/OrfDecoder.cpp
Original file line number Diff line number Diff line change
@@ -317,7 +317,7 @@ void OrfDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
// Order is assumed to be RGGB
if (blackEntry->count == 4) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int i = 0; i < 4; i++) {
auto c = mRaw->cfa.getColorAt(i & 1, i >> 1);
2 changes: 1 addition & 1 deletion src/librawspeed/decoders/PefDecoder.cpp
Original file line number Diff line number Diff line change
@@ -132,7 +132,7 @@ void PefDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
mRootIFD->getEntryRecursive(static_cast<TiffTag>(0x200));
if (black->count == 4) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int i = 0; i < 4; i++)
blackLevelSeparate1D(i) = black->getU32(i);
4 changes: 2 additions & 2 deletions src/librawspeed/decoders/RafDecoder.cpp
Original file line number Diff line number Diff line change
@@ -300,13 +300,13 @@ void RafDecoder::decodeMetaDataInternal(const CameraMetaData* meta) {
mRootIFD->getEntryRecursive(TiffTag::FUJI_BLACKLEVEL);
if (sep_black->count == 4) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int k = 0; k < 4; k++)
blackLevelSeparate1D(k) = sep_black->getU32(k);
} else if (sep_black->count == 36) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int& k : blackLevelSeparate1D)
k = 0;
4 changes: 2 additions & 2 deletions src/librawspeed/decoders/RawDecoder.cpp
Original file line number Diff line number Diff line change
@@ -260,15 +260,15 @@ void RawDecoder::setMetaData(const CameraMetaData* meta,
if (mRaw->isCFA &&
cfaArea <= implicit_cast<int>(sensor->mBlackLevelSeparate.size())) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int i = 0; i < cfaArea; i++) {
blackLevelSeparate1D(i) = sensor->mBlackLevelSeparate[i];
}
} else if (!mRaw->isCFA &&
mRaw->getCpp() <= sensor->mBlackLevelSeparate.size()) {
mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (uint32_t i = 0; i < mRaw->getCpp(); i++) {
blackLevelSeparate1D(i) = sensor->mBlackLevelSeparate[i];
2 changes: 1 addition & 1 deletion src/librawspeed/decoders/Rw2Decoder.cpp
Original file line number Diff line number Diff line change
@@ -268,7 +268,7 @@ void Rw2Decoder::decodeMetaDataInternal(const CameraMetaData* meta) {
const int blackBlue = getBlack(static_cast<TiffTag>(0x1e));

mRaw->blackLevelSeparate =
Array2DRef(mRaw->blackLevelSeparateStorage.data(), 2, 2);
Array2DRef<int>::create(mRaw->blackLevelSeparateStorage, 2, 2);
auto blackLevelSeparate1D = *mRaw->blackLevelSeparate.getAsArray1DRef();
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {