25 #include <fvutils/color/conversions.h> 26 #include <fvutils/compression/jpeg_decompressor.h> 27 #include <core/exception.h> 29 #include <sys/types.h> 47 struct jpeg_source_mgr pub;
52 typedef my_source_mgr * my_src_ptr;
56 struct jpeg_error_mgr pub;
58 jmp_buf setjmp_buffer;
61 typedef struct my_error_mgr * my_error_ptr;
68 my_error_exit (j_common_ptr cinfo)
71 my_error_ptr myerr = (my_error_ptr) cinfo->err;
74 longjmp(myerr->setjmp_buffer, 1);
78 init_source (j_decompress_ptr cinfo)
84 fill_input_buffer (j_decompress_ptr cinfo)
90 skip_input_data (j_decompress_ptr cinfo,
long num_bytes)
92 my_src_ptr src = (my_src_ptr) cinfo->src;
98 while (num_bytes > (
long) src->pub.bytes_in_buffer) {
99 num_bytes -= (long) src->pub.bytes_in_buffer;
100 (
void) fill_input_buffer(cinfo);
105 src->pub.next_input_byte += (size_t) num_bytes;
106 src->pub.bytes_in_buffer -= (size_t) num_bytes;
111 term_source (j_decompress_ptr cinfo)
117 my_mem_src (j_decompress_ptr cinfo, JOCTET * buffer,
size_t bytes)
121 if (cinfo->src == NULL) {
122 cinfo->src = (
struct jpeg_source_mgr *)
123 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
124 sizeof(my_source_mgr));
125 src = (my_src_ptr) cinfo->src;
131 src = (my_src_ptr) cinfo->src;
132 src->pub.init_source = init_source;
133 src->pub.fill_input_buffer = fill_input_buffer;
134 src->pub.skip_input_data = skip_input_data;
135 src->pub.resync_to_restart = jpeg_resync_to_restart;
136 src->pub.term_source = term_source;
137 src->pub.bytes_in_buffer = bytes;
138 src->pub.next_input_byte = buffer;
157 JSAMPROW row_pointer[1];
158 unsigned long location = 0;
159 unsigned char *buffer;
163 struct jpeg_decompress_struct cinfo;
165 struct my_error_mgr jerr;
166 cinfo.err = jpeg_std_error(&jerr.pub);
167 jerr.pub.error_exit = my_error_exit;
169 if (setjmp(jerr.setjmp_buffer)) {
170 char buffer[JMSG_LENGTH_MAX];
171 (*cinfo.err->format_message) ((jpeg_common_struct *)&cinfo, buffer);
176 jpeg_destroy_decompress(&cinfo);
180 jpeg_create_decompress(&cinfo);
183 my_mem_src(&cinfo, _compressed_buffer, _compressed_buffer_size);
186 jpeg_read_header(&cinfo, TRUE);
194 jpeg_start_decompress(&cinfo);
196 buffer = (
unsigned char*)malloc( cinfo.output_width * cinfo.output_height * cinfo.num_components );
198 row_pointer[0] = (
unsigned char *)malloc( cinfo.output_width * cinfo.num_components );
202 while( cinfo.output_scanline < cinfo.image_height )
204 jpeg_read_scanlines( &cinfo, row_pointer, 1 );
205 for(
unsigned int i=0; i < cinfo.image_width * cinfo.num_components; i++)
206 buffer[location++] = row_pointer[0][i];
210 jpeg_finish_decompress(&cinfo);
213 jpeg_destroy_decompress(&cinfo);
215 free(row_pointer[0]);
218 convert(RGB, YUV422_PLANAR, buffer, _decompressed_buffer, cinfo.output_width, cinfo.output_height);
virtual void decompress()
Decompress image.
JpegImageDecompressor()
Constructor.
Base class for exceptions in Fawkes.