libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

passes_state.cc (2819B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 #include "lib/jxl/passes_state.h"
      7 
      8 #include "lib/jxl/base/status.h"
      9 #include "lib/jxl/chroma_from_luma.h"
     10 #include "lib/jxl/coeff_order.h"
     11 #include "lib/jxl/frame_dimensions.h"
     12 
     13 namespace jxl {
     14 
     15 Status InitializePassesSharedState(const FrameHeader& frame_header,
     16                                    PassesSharedState* JXL_RESTRICT shared,
     17                                    bool encoder) {
     18   JXL_ASSERT(frame_header.nonserialized_metadata != nullptr);
     19   shared->metadata = frame_header.nonserialized_metadata;
     20   shared->frame_dim = frame_header.ToFrameDimensions();
     21   shared->image_features.patches.SetPassesSharedState(shared);
     22 
     23   const FrameDimensions& frame_dim = shared->frame_dim;
     24 
     25   JXL_ASSIGN_OR_RETURN(
     26       shared->ac_strategy,
     27       AcStrategyImage::Create(frame_dim.xsize_blocks, frame_dim.ysize_blocks));
     28   JXL_ASSIGN_OR_RETURN(
     29       shared->raw_quant_field,
     30       ImageI::Create(frame_dim.xsize_blocks, frame_dim.ysize_blocks));
     31   JXL_ASSIGN_OR_RETURN(
     32       shared->epf_sharpness,
     33       ImageB::Create(frame_dim.xsize_blocks, frame_dim.ysize_blocks));
     34   JXL_ASSIGN_OR_RETURN(shared->cmap, ColorCorrelationMap::Create(
     35                                          frame_dim.xsize, frame_dim.ysize));
     36 
     37   // In the decoder, we allocate coeff orders afterwards, when we know how many
     38   // we will actually need.
     39   shared->coeff_order_size = kCoeffOrderMaxSize;
     40   if (encoder &&
     41       shared->coeff_orders.size() <
     42           frame_header.passes.num_passes * kCoeffOrderMaxSize &&
     43       frame_header.encoding == FrameEncoding::kVarDCT) {
     44     shared->coeff_orders.resize(frame_header.passes.num_passes *
     45                                 kCoeffOrderMaxSize);
     46   }
     47 
     48   JXL_ASSIGN_OR_RETURN(
     49       shared->quant_dc,
     50       ImageB::Create(frame_dim.xsize_blocks, frame_dim.ysize_blocks));
     51 
     52   bool use_dc_frame = ((frame_header.flags & FrameHeader::kUseDcFrame) != 0u);
     53   if (!encoder && use_dc_frame) {
     54     if (frame_header.dc_level == 4) {
     55       return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u",
     56                          frame_header.dc_level);
     57     }
     58     shared->dc_storage = Image3F();
     59     shared->dc = &shared->dc_frames[frame_header.dc_level];
     60     if (shared->dc->xsize() == 0) {
     61       return JXL_FAILURE(
     62           "kUseDcFrame specified for dc_level %u, but no frame was decoded "
     63           "with level %u",
     64           frame_header.dc_level, frame_header.dc_level + 1);
     65     }
     66     ZeroFillImage(&shared->quant_dc);
     67   } else {
     68     JXL_ASSIGN_OR_RETURN(
     69         shared->dc_storage,
     70         Image3F::Create(frame_dim.xsize_blocks, frame_dim.ysize_blocks));
     71     shared->dc = &shared->dc_storage;
     72   }
     73 
     74   return true;
     75 }
     76 
     77 }  // namespace jxl