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