47const std::array<std::array<std::array<uint8_t, 16>, 2>, 1>
49 {{{0, 2, 3, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
50 {3, 4, 2, 5, 1, 6, 0, 7, 8, 9, 10, 11, 12}}},
58 ThrowRDE(
"Unexpected component count / data type");
60 if (!
mRaw->dim.x || !
mRaw->dim.y ||
mRaw->dim.x % 2 != 0 ||
61 mRaw->dim.x > 8384 ||
mRaw->dim.y > 6208) {
62 ThrowRDE(
"Unexpected image dimensions found: (%d; %d)", mRaw->dim.x,
87 ThrowRDE(
"Depth of huffman table is too great (%u).", depth);
91 std::array<uint32_t, 16> v0;
92 std::array<uint32_t, 16> v1;
95 for (
uint32_t i = 0; i < depth; i++) {
98 if (v1[i] == 0 || v1[i] > 12)
99 ThrowRDE(
"Data corrupt: v1[%u]=%u, expected [1..12]", depth, v1[i]);
102 std::vector<uint8_t> nCodesPerLength;
103 nCodesPerLength.resize(17);
105 std::array<uint32_t, 16> v2;
107 for (
uint32_t c = 0; c < depth; c++) {
109 nCodesPerLength.at(v1[c])++;
112 assert(nCodesPerLength.size() == 17);
113 assert(nCodesPerLength[0] == 0);
117 std::vector<uint8_t> codeValues;
118 codeValues.reserve(nCodes);
121 for (
uint32_t i = 0; i < depth; i++) {
124 for (
uint32_t j = 0; j < depth; j++) {
125 if (v2[j] <= sm_val) {
132 v2[sm_num] = 0xffffffff;
135 assert(codeValues.size() == nCodes);
151 ht.setup(
true,
false);
164 for (
int row = 0; row < out.
height(); row++) {
165 std::array<int, 2> pred = {{}};
167 pred = {out(row - 2, 0), out(row - 2, 1)};
169 for (
int col = 0; col < out.
width(); col++) {
170 pred[col & 1] +=
ht.decodeDifference(bs);
171 int value = pred[col & 1];
173 ThrowRDE(
"decoded value out of bounds at %d:%d", col, row);
assert(dim.area() >=area)
int RAWSPEED_READONLY height() const
int RAWSPEED_READONLY width() const
Array1DRef< const uint8_t > getAsArray1DRef() const
void skipBytes(size_type nbytes)
Buffer peekRemainingBuffer() const
uint32_t setNCodesPerLength(Buffer data)
void setCodeValues(Array1DRef< const typename Traits::CodeValueTy > data)
static const std::array< std::array< std::array< uint8_t, 16 >, 2 >, 1 > pentax_tree
void decompress(ByteStream data) const
static PrefixCodeDecoder SetupPrefixCodeDecoder(Optional< ByteStream > metaData)
static HuffmanCode< BaselineCodeTag > SetupPrefixCodeDecoder_Modern(ByteStream stream)
const PrefixCodeDecoder ht
PentaxDecompressor(RawImage img, Optional< ByteStream > metaData)
static HuffmanCode< BaselineCodeTag > SetupPrefixCodeDecoder_Legacy()
PrefixCodeLUTDecoder< CodeTag, PrefixCodeLookupDecoder< CodeTag > > PrefixCodeDecoder
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
constexpr bool RAWSPEED_READNONE isIntN(T value, unsigned int nBits)
constexpr RAWSPEED_READNONE T extractHighBits(T value, unsigned nBits, unsigned effectiveBitwidth=bitwidth< T >())