// Copyright (c) the JPEG XL Project Authors. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file.
// These templates are not found via ADL. using hwy::HWY_NAMESPACE::Abs; using hwy::HWY_NAMESPACE::Add; using hwy::HWY_NAMESPACE::And; using hwy::HWY_NAMESPACE::AndNot; using hwy::HWY_NAMESPACE::Compress; using hwy::HWY_NAMESPACE::CountTrue; using hwy::HWY_NAMESPACE::Eq; using hwy::HWY_NAMESPACE::GetLane; using hwy::HWY_NAMESPACE::MaskFromVec; using hwy::HWY_NAMESPACE::Max; using hwy::HWY_NAMESPACE::Not; using hwy::HWY_NAMESPACE::Or; using hwy::HWY_NAMESPACE::ShiftRight; using hwy::HWY_NAMESPACE::Shl; using hwy::HWY_NAMESPACE::Sub;
constauto zero = Zero(di); // Add FFFF for every zero coefficient, negate to get #zeros. auto neg_sum_zero = zero;
{ // First row has DC, so mask const size_t y = 0;
HWY_ALIGN const T dc_mask_lanes[8] = {-1};
for (size_t x = 0; x < 8; x += Lanes(di)) { constauto dc_mask = Load(di, dc_mask_lanes + x);
// DC counts as zero so we don't include it in nzeros. constauto coef = AndNot(dc_mask, Load(di, &block[y * 8 + x]));
neg_sum_zero = Add(neg_sum_zero, VecFromMask(di, Eq(coef, zero)));
}
} // Remaining rows: no mask for (size_t y = 1; y < 8; y++) { for (size_t x = 0; x < 8; x += Lanes(di)) { constauto coef = Load(di, &block[y * 8 + x]);
neg_sum_zero = Add(neg_sum_zero, VecFromMask(di, Eq(coef, zero)));
}
}
// We want 64 - sum_zero, add because neg_sum_zero is already negated. return kDCTBlockSize + GetLane(SumOfLanes(di, neg_sum_zero));
}
template <typename T, bool zig_zag_order> void ComputeTokensForBlock(const T* block, int last_dc, int dc_ctx, int ac_ctx,
Token** tokens_ptr) {
Token* next_token = *tokens_ptr;
coeff_t temp2;
coeff_t temp;
temp = block[0] - last_dc; if (temp == 0) {
*next_token++ = Token(dc_ctx, 0, 0);
} else {
temp2 = temp; if (temp < 0) {
temp = -temp;
temp2--;
} int dc_nbits = jxl::FloorLog2Nonzero<uint32_t>(temp) + 1; int dc_mask = (1 << dc_nbits) - 1;
*next_token++ = Token(dc_ctx, dc_nbits, temp2 & dc_mask);
} int num_nonzeros = NumNonZero8x8ExceptDC(block); for (int k = 1; k < 64; ++k) { if (num_nonzeros == 0) {
*next_token++ = Token(ac_ctx, 0, 0); break;
} int r = 0; if (zig_zag_order) { while ((temp = block[k]) == 0) {
r++;
k++;
}
} else { while ((temp = block[kJPEGNaturalOrder[k]]) == 0) {
r++;
k++;
}
}
--num_nonzeros; if (temp < 0) {
temp = -temp;
temp2 = ~temp;
} else {
temp2 = temp;
} while (r > 15) {
*next_token++ = Token(ac_ctx, 0xf0, 0);
r -= 16;
} int ac_nbits = jxl::FloorLog2Nonzero<uint32_t>(temp) + 1; int ac_mask = (1 << ac_nbits) - 1; int symbol = (r << 4u) + ac_nbits;
*next_token++ = Token(ac_ctx, symbol, temp2 & ac_mask);
}
*tokens_ptr = next_token;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.