47const std::array<std::array<std::array<uint8_t, 16>, 2>, 6>
50 {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
51 {5, 4, 3, 6, 2, 7, 1, 0, 8, 9, 11, 10, 12}}},
53 {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
54 {0x39, 0x5a, 0x38, 0x27, 0x16, 5, 4, 3, 2, 1, 0, 11, 12, 12}}},
56 {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
57 {5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10, 11, 12}}},
59 {0, 1, 4, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
60 {5, 6, 4, 7, 8, 3, 9, 2, 1, 0, 10, 11, 12, 13, 14}}},
62 {0, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0},
63 {8, 0x5c, 0x4b, 0x3a, 0x29, 7, 6, 5, 4, 3, 2, 1, 0, 13, 14}}},
65 {0, 1, 4, 2, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0},
66 {7, 6, 8, 5, 9, 4, 10, 3, 11, 12, 2, 0, 1, 13, 14}}},
72 {0xffffffff, 0x7fffffff, 0x3fffffff, 0x1fffffff, 0x0fffffff, 0x07ffffff,
73 0x03ffffff, 0x01ffffff, 0x00ffffff, 0x007fffff, 0x003fffff, 0x001fffff,
74 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
75 0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff,
76 0x000000ff, 0x0000007f, 0x0000003f, 0x0000001f, 0x0000000f, 0x00000007,
77 0x00000003, 0x00000001}};
88 std::array<uint32_t, 17>
bits;
112 std::array<int8_t, 257> huffsize;
113 std::array<uint16_t, 257> huffcode;
125 for (l = 1; l <= 16; l++) {
126 for (i = 1; i <= static_cast<int>(
dctbl1.bits[l]); i++) {
127 huffsize[p] =
static_cast<int8_t
>(l);
130 ThrowRDE(
"LJpegDecoder::createPrefixCodeDecoder: Code length too "
131 "long. Corrupt data.");
144 while (huffsize[p]) {
145 while ((
static_cast<int>(huffsize[p])) == si) {
154 "createPrefixCodeDecoder: Code length too long. Corrupt data.");
163 for (l = 1; l <= 16; l++) {
166 dctbl1.mincode[l] = huffcode[p];
168 dctbl1.maxcode[l] = huffcode[p - 1];
176 "createPrefixCodeDecoder: Code length too long. Corrupt data.");
182 dctbl1.maxcode[17] = 0xFFFFFL;
192 for (p = 0; p < lastp; p++) {
195 value =
dctbl1.huffval[p];
197 ll = code << (8 - size);
203 if (ul > 256 || ll > ul)
205 "createPrefixCodeDecoder: Code length too long. Corrupt data.");
206 for (i = ll; i <= ul; i++) {
207 dctbl1.numbits[i] = size | (value << 4);
213 dctbl1.initialized =
true;
236 dctbl1.bigTable.resize(size);
237 for (
uint32_t i = 0; i < size; i++) {
239 int code = input >> 8;
246 while (code >
dctbl1.maxcode[l]) {
248 code = (code << 1) | temp;
256 if (l > 16 ||
dctbl1.valptr[l] == 0xff) {
257 dctbl1.bigTable[i] = 0xff;
265 dctbl1.bigTable[i] = (-(32768 << 8)) | (16 + l);
267 dctbl1.bigTable[i] = (-(32768 << 8)) | l;
272 dctbl1.bigTable[i] = 0xff;
278 if ((
x & (1 << (rv - 1))) == 0)
281 static_cast<int>((
static_cast<unsigned>(
x) << 8) | (l + rv));
292 dctbl1.bits[i + 1] = data[i];
293 acc +=
dctbl1.bits[i + 1];
300 for (
int i = 0; i < data.
size(); i++)
301 dctbl1.huffval[i] = data(i);
304 void setup([[maybe_unused]]
bool fullDecode_,
305 [[maybe_unused]]
bool fixDNGBug16_) {
334 val =
static_cast<unsigned>(
dctbl1.bigTable[code]);
335 if ((
val & 0xff) != 0xff) {
337 return static_cast<int>(
val) >> 8;
346 rv =
static_cast<int>(
val) >> 4;
350 while (code >
dctbl1.maxcode[l]) {
352 code = (code << 1) | temp;
357 ThrowRDE(
"Corrupt JPEG data: bad Huffman code:%d\n", l);
372 int diff = ((bits.
getBits(len - shl) << 1) + 1) << shl >> 1;
373 if ((diff & (1 << (len - 1))) == 0)
374 diff -= (1 << len) - !shl;
386 if (v0 == 68 && v1 == 64)
394 std::vector<uint16_t>
curve((1 <<
bitsPS & 0x7fff) + 1);
397 for (
size_t i = 0; i <
curve.size(); i++)
405 if (v0 == 68 && (v1 == 32 || v1 == 64) && step > 0) {
406 if ((csize - 1) * step !=
curve.size() - 1)
407 ThrowRDE(
"Bad curve segment count (%u)", csize);
409 for (
size_t i = 0; i < csize; i++)
411 for (
size_t i = 0; i <
curve.size() - 1; i++) {
415 const uint32_t b_pos = a_pos + step;
421 const uint32_t a_scale = step - b_scale;
423 (a_scale *
curve[a_pos] + b_scale *
curve[b_pos]) / step);
428 }
else if (v0 != 70) {
429 if (csize == 0 || csize > 0x4001)
430 ThrowRDE(
"Don't know how to compute curve! csize = %u", csize);
432 curve.resize(csize + 1UL);
435 for (
uint32_t i = 0; i < csize; i++) {
447template <
typename Huffman>
454 ht.setup(
true,
false);
469 ht.setup(
true,
false);
478 ThrowRDE(
"Unexpected component count / data type");
480 if (!
mRaw->dim.hasPositiveArea() ||
mRaw->dim.x % 2 != 0 ||
481 mRaw->dim.x > 8288 ||
mRaw->dim.y > 5520)
482 ThrowRDE(
"Unexpected image dimensions found: (%d; %d)",
mRaw->dim.x,
498 if (v0 == 73 || v1 == 88)
514 if (
split >=
static_cast<unsigned>(
mRaw->dim.y))
518template <
typename Huffman>
530 for (
int row = start_y; row < end_y; row++) {
531 std::array<int, 2> pred =
pUp[row & 1];
532 for (
int col = 0; col < out.
width(); col++) {
533 pred[col & 1] += ht.decodeDifference(bits);
535 pUp[row & 1][col & 1] = pred[col & 1];
536 rawdata->setWithLookUp(
clampBits(pred[col & 1], 15),
537 reinterpret_cast<std::byte*
>(&out(row, col)),
544 bool uncorrectedRawValues) {
assert(dim.area() >=area)
int RAWSPEED_READONLY size() const
int RAWSPEED_READONLY width() const
uint32_t peekBits(int nbits)
uint32_t getBitsNoFill(int nbits)
void skipBitsNoFill(int nbits)
uint32_t getBits(int nbits)
uint32_t RAWSPEED_READONLY peekBitsNoFill(int nbits)
void fill(int nbits=Cache::MaxGetBits)
uint32_t setNCodesPerLength(Buffer data)
void setCodeValues(Array1DRef< const typename Traits::CodeValueTy > data)
std::array< std::array< int, 2 >, 2 > pUp
static const std::array< std::array< std::array< uint8_t, 16 >, 2 >, 6 > nikon_tree
static Huffman createPrefixCodeDecoder(uint32_t huffSelect)
std::vector< uint16_t > curve
static std::vector< uint16_t > createCurve(ByteStream &metadata, uint32_t bitsPS, uint32_t v0, uint32_t v1, uint32_t *split)
NikonDecompressor(RawImage raw, ByteStream metadata, uint32_t bitsPS)
void decompress(Array1DRef< const uint8_t > input, bool uncorrectedRawValues)
void setCodeValues(Array1DRef< const uint8_t > data)
void createPrefixCodeDecoder()
uint32_t setNCodesPerLength(Buffer data)
int decodeDifference(BitStreamerMSB &bits)
void setup(bool fullDecode_, bool fixDNGBug16_)
static T createPrefixCodeDecoder(rawspeed::ByteStream &bs)
static const rawspeed::CameraMetaData metadata
const std::array< uint32_t, 32 > bitMask
PrefixCodeLUTDecoder< CodeTag, PrefixCodeLookupDecoder< CodeTag > > PrefixCodeDecoder
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
void writeLog(DEBUG_PRIO priority, const char *format,...)
constexpr RAWSPEED_READNONE T extractHighBits(T value, unsigned nBits, unsigned effectiveBitwidth=bitwidth< T >())
constexpr auto RAWSPEED_READNONE clampBits(T value, unsigned int nBits)
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
std::array< uint32_t, 256 > huffval
std::array< uint32_t, 256 > numbits
std::vector< int > bigTable
std::array< int, 18 > maxcode
std::array< uint32_t, 17 > bits
std::array< uint16_t, 17 > mincode
std::array< int16_t, 17 > valptr