libjxl

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

source_manager.cc (3179B)


      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/jpegli/decode.h"
      7 #include "lib/jpegli/error.h"
      8 #include "lib/jpegli/memory_manager.h"
      9 
     10 namespace jpegli {
     11 
     12 void init_mem_source(j_decompress_ptr cinfo) {}
     13 void init_stdio_source(j_decompress_ptr cinfo) {}
     14 
     15 void skip_input_data(j_decompress_ptr cinfo, long num_bytes) {
     16   if (num_bytes <= 0) return;
     17   while (num_bytes > static_cast<long>(cinfo->src->bytes_in_buffer)) {
     18     num_bytes -= cinfo->src->bytes_in_buffer;
     19     (*cinfo->src->fill_input_buffer)(cinfo);
     20   }
     21   cinfo->src->next_input_byte += num_bytes;
     22   cinfo->src->bytes_in_buffer -= num_bytes;
     23 }
     24 
     25 void term_source(j_decompress_ptr cinfo) {}
     26 
     27 boolean EmitFakeEoiMarker(j_decompress_ptr cinfo) {
     28   static constexpr uint8_t kFakeEoiMarker[2] = {0xff, 0xd9};
     29   cinfo->src->next_input_byte = kFakeEoiMarker;
     30   cinfo->src->bytes_in_buffer = 2;
     31   return TRUE;
     32 }
     33 
     34 constexpr size_t kStdioBufferSize = 64 << 10;
     35 
     36 struct StdioSourceManager {
     37   jpeg_source_mgr pub;
     38   FILE* f;
     39   uint8_t* buffer;
     40 
     41   static boolean fill_input_buffer(j_decompress_ptr cinfo) {
     42     auto* src = reinterpret_cast<StdioSourceManager*>(cinfo->src);
     43     size_t num_bytes_read = fread(src->buffer, 1, kStdioBufferSize, src->f);
     44     if (num_bytes_read == 0) {
     45       return EmitFakeEoiMarker(cinfo);
     46     }
     47     src->pub.next_input_byte = src->buffer;
     48     src->pub.bytes_in_buffer = num_bytes_read;
     49     return TRUE;
     50   }
     51 };
     52 
     53 }  // namespace jpegli
     54 
     55 void jpegli_mem_src(j_decompress_ptr cinfo, const unsigned char* inbuffer,
     56                     unsigned long insize) {
     57   if (cinfo->src && cinfo->src->init_source != jpegli::init_mem_source) {
     58     JPEGLI_ERROR("jpegli_mem_src: a different source manager was already set");
     59   }
     60   if (!cinfo->src) {
     61     cinfo->src = jpegli::Allocate<jpeg_source_mgr>(cinfo, 1);
     62   }
     63   cinfo->src->next_input_byte = inbuffer;
     64   cinfo->src->bytes_in_buffer = insize;
     65   cinfo->src->init_source = jpegli::init_mem_source;
     66   cinfo->src->fill_input_buffer = jpegli::EmitFakeEoiMarker;
     67   cinfo->src->skip_input_data = jpegli::skip_input_data;
     68   cinfo->src->resync_to_restart = jpegli_resync_to_restart;
     69   cinfo->src->term_source = jpegli::term_source;
     70 }
     71 
     72 void jpegli_stdio_src(j_decompress_ptr cinfo, FILE* infile) {
     73   if (cinfo->src && cinfo->src->init_source != jpegli::init_stdio_source) {
     74     JPEGLI_ERROR("jpeg_stdio_src: a different source manager was already set");
     75   }
     76   if (!cinfo->src) {
     77     cinfo->src = reinterpret_cast<jpeg_source_mgr*>(
     78         jpegli::Allocate<jpegli::StdioSourceManager>(cinfo, 1));
     79   }
     80   auto* src = reinterpret_cast<jpegli::StdioSourceManager*>(cinfo->src);
     81   src->f = infile;
     82   src->buffer = jpegli::Allocate<uint8_t>(cinfo, jpegli::kStdioBufferSize);
     83   src->pub.next_input_byte = src->buffer;
     84   src->pub.bytes_in_buffer = 0;
     85   src->pub.init_source = jpegli::init_stdio_source;
     86   src->pub.fill_input_buffer = jpegli::StdioSourceManager::fill_input_buffer;
     87   src->pub.skip_input_data = jpegli::skip_input_data;
     88   src->pub.resync_to_restart = jpegli_resync_to_restart;
     89   src->pub.term_source = jpegli::term_source;
     90 }