fields_fuzzer.cc (3116B)
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 <stdint.h> 7 8 #include <cstddef> 9 10 #include "lib/jxl/base/span.h" 11 #include "lib/jxl/color_encoding_internal.h" 12 #include "lib/jxl/dec_ans.h" 13 #include "lib/jxl/dec_bit_reader.h" 14 #include "lib/jxl/fields.h" 15 #include "lib/jxl/frame_header.h" 16 #include "lib/jxl/headers.h" 17 #include "lib/jxl/image_metadata.h" 18 #include "lib/jxl/jpeg/jpeg_data.h" 19 #include "lib/jxl/loop_filter.h" 20 #include "lib/jxl/modular/encoding/context_predict.h" 21 #include "lib/jxl/modular/encoding/encoding.h" 22 #include "lib/jxl/modular/transform/transform.h" 23 #include "lib/jxl/quantizer.h" 24 25 namespace jpegxl { 26 namespace tools { 27 28 using ::jxl::BitReader; 29 using ::jxl::Bytes; 30 using ::jxl::CodecMetadata; 31 using ::jxl::CustomTransformData; 32 using ::jxl::ImageMetadata; 33 using ::jxl::SizeHeader; 34 35 int TestOneInput(const uint8_t* data, size_t size) { 36 // Global parameters used by some headers. 37 CodecMetadata codec_metadata; 38 39 // First byte controls which header to parse. 40 if (size == 0) return 0; 41 BitReader reader(Bytes(data + 1, size - 1)); 42 #define FUZZER_CASE_HEADER(number, classname, ...) \ 43 case number: { \ 44 ::jxl::classname header{__VA_ARGS__}; \ 45 (void)jxl::Bundle::Read(&reader, &header); \ 46 break; \ 47 } 48 switch (data[0]) { 49 case 0: { 50 SizeHeader size_header; 51 (void)jxl::ReadSizeHeader(&reader, &size_header); 52 break; 53 } 54 55 case 1: { 56 ImageMetadata metadata; 57 (void)jxl::ReadImageMetadata(&reader, &metadata); 58 break; 59 } 60 61 FUZZER_CASE_HEADER(2, FrameHeader, &codec_metadata) 62 FUZZER_CASE_HEADER(3, jpeg::JPEGData) 63 FUZZER_CASE_HEADER(4, AnimationFrame, &codec_metadata) 64 FUZZER_CASE_HEADER(5, AnimationHeader) 65 FUZZER_CASE_HEADER(6, BitDepth) 66 FUZZER_CASE_HEADER(7, BlendingInfo) 67 FUZZER_CASE_HEADER(8, ColorEncoding) 68 FUZZER_CASE_HEADER(9, CustomTransferFunction) 69 FUZZER_CASE_HEADER(10, Customxy) 70 FUZZER_CASE_HEADER(11, ExtraChannelInfo) 71 FUZZER_CASE_HEADER(12, GroupHeader) 72 FUZZER_CASE_HEADER(13, weighted::Header) 73 FUZZER_CASE_HEADER(14, LoopFilter) 74 FUZZER_CASE_HEADER(15, LZ77Params) 75 FUZZER_CASE_HEADER(16, OpsinInverseMatrix) 76 FUZZER_CASE_HEADER(17, Passes) 77 FUZZER_CASE_HEADER(18, PreviewHeader) 78 FUZZER_CASE_HEADER(19, QuantizerParams) 79 FUZZER_CASE_HEADER(20, SqueezeParams) 80 FUZZER_CASE_HEADER(21, ToneMapping) 81 FUZZER_CASE_HEADER(22, Transform) 82 FUZZER_CASE_HEADER(23, YCbCrChromaSubsampling) 83 84 default: { 85 CustomTransformData transform_data; 86 transform_data.nonserialized_xyb_encoded = true; 87 (void)jxl::Bundle::Read(&reader, &transform_data); 88 break; 89 } 90 } 91 (void)reader.Close(); 92 93 return 0; 94 } 95 96 } // namespace tools 97 } // namespace jpegxl 98 99 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { 100 return jpegxl::tools::TestOneInput(data, size); 101 }