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 |