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