summaryrefslogtreecommitdiff
path: root/media/libjxl/src/lib/jxl/passes_state.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/libjxl/src/lib/jxl/passes_state.cc')
-rw-r--r--media/libjxl/src/lib/jxl/passes_state.cc70
1 files changed, 70 insertions, 0 deletions
diff --git a/media/libjxl/src/lib/jxl/passes_state.cc b/media/libjxl/src/lib/jxl/passes_state.cc
new file mode 100644
index 0000000000..2f287ec9b6
--- /dev/null
+++ b/media/libjxl/src/lib/jxl/passes_state.cc
@@ -0,0 +1,70 @@
+// 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.
+
+#include "lib/jxl/passes_state.h"
+
+#include "lib/jxl/chroma_from_luma.h"
+#include "lib/jxl/coeff_order.h"
+#include "lib/jxl/common.h"
+
+namespace jxl {
+
+Status InitializePassesSharedState(const FrameHeader& frame_header,
+ PassesSharedState* JXL_RESTRICT shared,
+ bool encoder) {
+ JXL_ASSERT(frame_header.nonserialized_metadata != nullptr);
+ shared->frame_header = frame_header;
+ shared->metadata = frame_header.nonserialized_metadata;
+ shared->frame_dim = frame_header.ToFrameDimensions();
+ shared->image_features.patches.SetPassesSharedState(shared);
+
+ const FrameDimensions& frame_dim = shared->frame_dim;
+
+ shared->ac_strategy =
+ AcStrategyImage(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
+ shared->raw_quant_field =
+ ImageI(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
+ shared->epf_sharpness =
+ ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
+ shared->cmap = ColorCorrelationMap(frame_dim.xsize, frame_dim.ysize);
+
+ // In the decoder, we allocate coeff orders afterwards, when we know how many
+ // we will actually need.
+ shared->coeff_order_size = kCoeffOrderMaxSize;
+ if (encoder &&
+ shared->coeff_orders.size() <
+ frame_header.passes.num_passes * kCoeffOrderMaxSize &&
+ frame_header.encoding == FrameEncoding::kVarDCT) {
+ shared->coeff_orders.resize(frame_header.passes.num_passes *
+ kCoeffOrderMaxSize);
+ }
+
+ shared->quant_dc = ImageB(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
+
+ bool use_dc_frame = !!(frame_header.flags & FrameHeader::kUseDcFrame);
+ if (!encoder && use_dc_frame) {
+ if (frame_header.dc_level == 4) {
+ return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u",
+ frame_header.dc_level);
+ }
+ shared->dc_storage = Image3F();
+ shared->dc = &shared->dc_frames[frame_header.dc_level];
+ if (shared->dc->xsize() == 0) {
+ return JXL_FAILURE(
+ "kUseDcFrame specified for dc_level %u, but no frame was decoded "
+ "with level %u",
+ frame_header.dc_level, frame_header.dc_level + 1);
+ }
+ ZeroFillImage(&shared->quant_dc);
+ } else {
+ shared->dc_storage =
+ Image3F(frame_dim.xsize_blocks, frame_dim.ysize_blocks);
+ shared->dc = &shared->dc_storage;
+ }
+
+ return true;
+}
+
+} // namespace jxl