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