Home | History | Annotate | Download | only in source
      1 #include "dng_jpeg_memory_source.h"
      2 
      3 #if qDNGUseLibJPEG
      4 
      5 #include "dng_safe_arithmetic.h"
      6 
      7 namespace {
      8 
      9 void InitSource(j_decompress_ptr cinfo) {
     10   // No initialization necessary.
     11 }
     12 
     13 boolean FillInputBuffer(j_decompress_ptr cinfo) {
     14   // We already filled the buffer with all of the data when the source was
     15   // initialized, so we can't get any more data.
     16   ERREXIT(cinfo, JERR_INPUT_EOF);
     17   return FALSE;
     18 }
     19 
     20 void SkipInputData(j_decompress_ptr cinfo, long num_bytes) {
     21   if (num_bytes > 0) {
     22     // Convert num_bytes to a size_t.
     23     // We've established that num_bytes is positive, to it's safe to cast it
     24     // to an unsigned long.
     25     size_t num_bytes_as_size_t = 0;
     26     try {
     27       ConvertUnsigned(static_cast<unsigned long>(num_bytes),
     28                       &num_bytes_as_size_t);
     29     } catch (const dng_exception &e) {
     30       ERREXIT(cinfo, JERR_INPUT_EOF);
     31       return;
     32     }
     33 
     34     jpeg_source_mgr *source_manager =
     35         reinterpret_cast<jpeg_source_mgr *>(cinfo->src);
     36 
     37     // Advance the current position by the given number of bytes.
     38     if (num_bytes_as_size_t <= source_manager->bytes_in_buffer) {
     39       source_manager->bytes_in_buffer -= num_bytes_as_size_t;
     40       source_manager->next_input_byte += num_bytes_as_size_t;
     41     } else {
     42       // Tried to read beyond the end of the buffer.
     43       ERREXIT(cinfo, JERR_INPUT_EOF);
     44       return;
     45     }
     46   }
     47 }
     48 
     49 boolean ResyncToRestart(j_decompress_ptr cinfo, int desired) {
     50   // Can't resync.
     51   return FALSE;
     52 }
     53 
     54 void TermSource(j_decompress_ptr cinfo) {
     55   // No termination necessary.
     56 }
     57 
     58 }  // namespace
     59 
     60 jpeg_source_mgr CreateJpegMemorySource(const uint8 *buffer, size_t size) {
     61   jpeg_source_mgr source;
     62 
     63   source.next_input_byte = reinterpret_cast<const JOCTET *>(buffer);
     64   source.bytes_in_buffer = size;
     65 
     66   // Initialize function pointers.
     67   source.init_source = InitSource;
     68   source.fill_input_buffer = FillInputBuffer;
     69   source.skip_input_data = SkipInputData;
     70   source.resync_to_restart = ResyncToRestart;
     71   source.term_source = TermSource;
     72 
     73   return source;
     74 }
     75 
     76 #endif  // qDNGUseLibJPEG
     77