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