25 #include <core/exception.h>
26 #include <fvutils/color/conversions.h>
27 #include <fvutils/compression/jpeg_decompressor.h>
28 #include <sys/types.h>
39 namespace firevision {
45 struct jpeg_source_mgr pub;
50 typedef my_source_mgr *my_src_ptr;
54 struct jpeg_error_mgr pub;
56 jmp_buf setjmp_buffer;
59 typedef struct my_error_mgr *my_error_ptr;
66 my_error_exit(j_common_ptr cinfo)
69 my_error_ptr myerr = (my_error_ptr)cinfo->err;
72 longjmp(myerr->setjmp_buffer, 1);
76 init_source(j_decompress_ptr cinfo)
81 fill_input_buffer(j_decompress_ptr cinfo)
87 skip_input_data(j_decompress_ptr cinfo,
long num_bytes)
89 my_src_ptr src = (my_src_ptr)cinfo->src;
95 while (num_bytes > (
long)src->pub.bytes_in_buffer) {
96 num_bytes -= (long)src->pub.bytes_in_buffer;
97 (
void)fill_input_buffer(cinfo);
102 src->pub.next_input_byte += (size_t)num_bytes;
103 src->pub.bytes_in_buffer -= (size_t)num_bytes;
108 term_source(j_decompress_ptr cinfo)
114 my_mem_src(j_decompress_ptr cinfo, JOCTET *buffer,
size_t bytes)
118 if (cinfo->src == NULL) {
119 cinfo->src = (
struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)((j_common_ptr)cinfo,
121 sizeof(my_source_mgr));
122 src = (my_src_ptr)cinfo->src;
128 src = (my_src_ptr)cinfo->src;
129 src->pub.init_source = init_source;
130 src->pub.fill_input_buffer = fill_input_buffer;
131 src->pub.skip_input_data = skip_input_data;
132 src->pub.resync_to_restart = jpeg_resync_to_restart;
133 src->pub.term_source = term_source;
134 src->pub.bytes_in_buffer = bytes;
135 src->pub.next_input_byte = buffer;
154 JSAMPROW row_pointer[1];
155 unsigned long location = 0;
156 unsigned char *buffer;
160 struct jpeg_decompress_struct cinfo;
162 struct my_error_mgr jerr;
163 cinfo.err = jpeg_std_error(&jerr.pub);
164 jerr.pub.error_exit = my_error_exit;
166 if (setjmp(jerr.setjmp_buffer)) {
167 char buffer[JMSG_LENGTH_MAX];
168 (*cinfo.err->format_message)((jpeg_common_struct *)&cinfo, buffer);
173 jpeg_destroy_decompress(&cinfo);
177 jpeg_create_decompress(&cinfo);
183 jpeg_read_header(&cinfo, TRUE);
191 jpeg_start_decompress(&cinfo);
193 buffer = (
unsigned char *)malloc((
size_t)cinfo.output_width * (size_t)cinfo.output_height
194 * (
size_t)cinfo.num_components);
197 (
unsigned char *)malloc((
size_t)cinfo.output_width * (size_t)cinfo.num_components);
201 while (cinfo.output_scanline < cinfo.image_height) {
202 jpeg_read_scanlines(&cinfo, row_pointer, 1);
203 for (
unsigned int i = 0; i < cinfo.image_width * cinfo.num_components; i++)
204 buffer[location++] = row_pointer[0][i];
208 jpeg_finish_decompress(&cinfo);
211 jpeg_destroy_decompress(&cinfo);
213 free(row_pointer[0]);
Base class for exceptions in Fawkes.
unsigned char * _compressed_buffer
Buffer containing the compressed image.
unsigned char * _decompressed_buffer
Buffer containing the decompressed image after decompression.
unsigned int _compressed_buffer_size
Size in bytes of _compressed_buffer.
virtual void decompress()
Decompress image.
JpegImageDecompressor()
Constructor.