libjxl

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

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 }