tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

passes_state.cc (3253B)


      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 <jxl/memory_manager.h>
      9 
     10 #include "lib/jxl/base/status.h"
     11 #include "lib/jxl/chroma_from_luma.h"
     12 #include "lib/jxl/coeff_order.h"
     13 #include "lib/jxl/frame_dimensions.h"
     14 
     15 namespace jxl {
     16 
     17 Status InitializePassesSharedState(const FrameHeader& frame_header,
     18                                   PassesSharedState* JXL_RESTRICT shared,
     19                                   bool encoder) {
     20  JXL_ENSURE(frame_header.nonserialized_metadata != nullptr);
     21  shared->metadata = frame_header.nonserialized_metadata;
     22  shared->frame_dim = frame_header.ToFrameDimensions();
     23  shared->image_features.patches.SetShared(&shared->reference_frames);
     24 
     25  const FrameDimensions& frame_dim = shared->frame_dim;
     26  JxlMemoryManager* memory_manager = shared->memory_manager;
     27 
     28  JXL_ASSIGN_OR_RETURN(
     29      shared->ac_strategy,
     30      AcStrategyImage::Create(memory_manager, frame_dim.xsize_blocks,
     31                              frame_dim.ysize_blocks));
     32  JXL_ASSIGN_OR_RETURN(shared->raw_quant_field,
     33                       ImageI::Create(memory_manager, frame_dim.xsize_blocks,
     34                                      frame_dim.ysize_blocks));
     35  JXL_ASSIGN_OR_RETURN(shared->epf_sharpness,
     36                       ImageB::Create(memory_manager, frame_dim.xsize_blocks,
     37                                      frame_dim.ysize_blocks));
     38  JXL_ASSIGN_OR_RETURN(
     39      shared->cmap, ColorCorrelationMap::Create(memory_manager, frame_dim.xsize,
     40                                                frame_dim.ysize));
     41 
     42  // In the decoder, we allocate coeff orders afterwards, when we know how many
     43  // we will actually need.
     44  shared->coeff_order_size = kCoeffOrderMaxSize;
     45  if (encoder &&
     46      shared->coeff_orders.size() <
     47          frame_header.passes.num_passes * kCoeffOrderMaxSize &&
     48      frame_header.encoding == FrameEncoding::kVarDCT) {
     49    shared->coeff_orders.resize(frame_header.passes.num_passes *
     50                                kCoeffOrderMaxSize);
     51  }
     52 
     53  JXL_ASSIGN_OR_RETURN(shared->quant_dc,
     54                       ImageB::Create(memory_manager, frame_dim.xsize_blocks,
     55                                      frame_dim.ysize_blocks));
     56 
     57  bool use_dc_frame = ((frame_header.flags & FrameHeader::kUseDcFrame) != 0u);
     58  if (!encoder && use_dc_frame) {
     59    if (frame_header.dc_level == 4) {
     60      return JXL_FAILURE("Invalid DC level for kUseDcFrame: %u",
     61                         frame_header.dc_level);
     62    }
     63    shared->dc_storage = Image3F();
     64    shared->dc = &shared->dc_frames[frame_header.dc_level];
     65    if (shared->dc->xsize() == 0) {
     66      return JXL_FAILURE(
     67          "kUseDcFrame specified for dc_level %u, but no frame was decoded "
     68          "with level %u",
     69          frame_header.dc_level, frame_header.dc_level + 1);
     70    }
     71    ZeroFillImage(&shared->quant_dc);
     72  } else {
     73    JXL_ASSIGN_OR_RETURN(shared->dc_storage,
     74                         Image3F::Create(memory_manager, frame_dim.xsize_blocks,
     75                                         frame_dim.ysize_blocks));
     76    shared->dc = &shared->dc_storage;
     77  }
     78 
     79  return true;
     80 }
     81 
     82 }  // namespace jxl