#include "dng_jpeg_memory_source.h" #if qDNGUseLibJPEG #include "dng_safe_arithmetic.h" namespace { void InitSource(j_decompress_ptr cinfo) { // No initialization necessary. } boolean FillInputBuffer(j_decompress_ptr cinfo) { // We already filled the buffer with all of the data when the source was // initialized, so we can't get any more data. ERREXIT(cinfo, JERR_INPUT_EOF); return FALSE; } void SkipInputData(j_decompress_ptr cinfo, long num_bytes) { if (num_bytes > 0) { // Convert num_bytes to a size_t. // We've established that num_bytes is positive, to it's safe to cast it // to an unsigned long. size_t num_bytes_as_size_t = 0; try { ConvertUnsigned(static_cast<unsigned long>(num_bytes), &num_bytes_as_size_t); } catch (const dng_exception &e) { ERREXIT(cinfo, JERR_INPUT_EOF); return; } jpeg_source_mgr *source_manager = reinterpret_cast<jpeg_source_mgr *>(cinfo->src); // Advance the current position by the given number of bytes. if (num_bytes_as_size_t <= source_manager->bytes_in_buffer) { source_manager->bytes_in_buffer -= num_bytes_as_size_t; source_manager->next_input_byte += num_bytes_as_size_t; } else { // Tried to read beyond the end of the buffer. ERREXIT(cinfo, JERR_INPUT_EOF); return; } } } boolean ResyncToRestart(j_decompress_ptr cinfo, int desired) { // Can't resync. return FALSE; } void TermSource(j_decompress_ptr cinfo) { // No termination necessary. } } // namespace jpeg_source_mgr CreateJpegMemorySource(const uint8 *buffer, size_t size) { jpeg_source_mgr source; source.next_input_byte = reinterpret_cast<const JOCTET *>(buffer); source.bytes_in_buffer = size; // Initialize function pointers. source.init_source = InitSource; source.fill_input_buffer = FillInputBuffer; source.skip_input_data = SkipInputData; source.resync_to_restart = ResyncToRestart; source.term_source = TermSource; return source; } #endif // qDNGUseLibJPEG