1 #include "dng_jpeg_memory_source.h"
2
3 #if qDNGUseLibJPEG
4
5 #include "dng_safe_arithmetic.h"
6
7 namespace {
8
InitSource(j_decompress_ptr cinfo)9 void InitSource(j_decompress_ptr cinfo) {
10 // No initialization necessary.
11 }
12
FillInputBuffer(j_decompress_ptr cinfo)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
SkipInputData(j_decompress_ptr cinfo,long num_bytes)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
ResyncToRestart(j_decompress_ptr cinfo,int desired)49 boolean ResyncToRestart(j_decompress_ptr cinfo, int desired) {
50 // Can't resync.
51 return FALSE;
52 }
53
TermSource(j_decompress_ptr cinfo)54 void TermSource(j_decompress_ptr cinfo) {
55 // No termination necessary.
56 }
57
58 } // namespace
59
CreateJpegMemorySource(const uint8 * buffer,size_t size)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