// 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.
Status BeginExtensions(uint64_t* JXL_RESTRICT extensions) override {
JXL_QUIET_RETURN_IF_ERROR(VisitorBase::BeginExtensions(extensions)); if (*extensions == 0) {
JXL_ENSURE(extension_bits_ == 0); returntrue;
} // TODO(janwas): extend API to pass in array of extension_bits, one per // extension. We currently ascribe all bits to the first extension, but // this is only an encoder limitation. NOTE: extension_bits_ can be zero // if an extension does not require any additional fields.
ok_ &= U64Coder::Write(extension_bits_, writer_); // For each nonzero bit except the lowest/first (already written): for (uint64_t remaining_extensions = *extensions & (*extensions - 1);
remaining_extensions != 0;
remaining_extensions &= remaining_extensions - 1) {
ok_ &= U64Coder::Write(0, writer_);
} returntrue;
} // EndExtensions = default.
// Returns false if the value is too large to encode.
Status BitsCoder::Write(const size_t bits, const uint32_t value,
BitWriter* JXL_RESTRICT writer) { if (value >= (1ULL << bits)) { return JXL_FAILURE("Value %d too large to encode in %" PRIu64 " bits",
value, static_cast<uint64_t>(bits));
}
writer->Write(bits, value); returntrue;
}
// Returns false if the value is too large to encode.
Status U32Coder::Write(const U32Enc enc, const uint32_t value,
BitWriter* JXL_RESTRICT writer) {
uint32_t selector;
size_t total_bits;
JXL_RETURN_IF_ERROR(ChooseSelector(enc, value, &selector, &total_bits));
writer->Write(2, selector);
const U32Distr d = enc.GetDistr(selector); if (!d.IsDirect()) { // Nothing more to write for direct encoding const uint32_t offset = d.Offset();
JXL_ENSURE(value >= offset);
writer->Write(total_bits - 2, value - offset);
}
returntrue;
}
// Returns false if the value is too large to encode.
Status U64Coder::Write(uint64_t value, BitWriter* JXL_RESTRICT writer) { if (value == 0) { // Selector: use 0 bits, value 0
writer->Write(2, 0);
} elseif (value <= 16) { // Selector: use 4 bits, value 1..16
writer->Write(2, 1);
writer->Write(4, value - 1);
} elseif (value <= 272) { // Selector: use 8 bits, value 17..272
writer->Write(2, 2);
writer->Write(8, value - 17);
} else { // Selector: varint, first a 12-bit group, after that per 8-bit group.
writer->Write(2, 3);
writer->Write(12, value & 4095);
value >>= 12; int shift = 12; while (value > 0 && shift < 60) { // Indicate varint not done
writer->Write(1, 1);
writer->Write(8, value & 255);
value >>= 8;
shift += 8;
} if (value > 0) { // This only could happen if shift == N - 4.
writer->Write(1, 1);
writer->Write(4, value & 15); // Implicitly closed sequence, no extra stop bit is required.
} else { // Indicate end of varint
writer->Write(1, 0);
}
}
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.