First public contribution.
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
26 #include <liboil/liboil-stdint.h>
27 #include <liboil/liboil.h>
28 #include <liboil/liboildebug.h>
31 #include "jpeg_internal.h"
32 #include <liboil/globals.h>
34 #define MAX(a,b) ((a)>(b) ? (a) : (b))
37 extern uint8_t jpeg_standard_tables[];
38 extern int jpeg_standard_tables_size;
40 void jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...);
42 void jpeg_decoder_define_huffman_tables (JpegDecoder * dec);
43 void jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec);
44 void jpeg_decoder_define_quantization_tables (JpegDecoder *dec);
45 void jpeg_decoder_define_restart_interval (JpegDecoder *dec);
46 void jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker);
47 void jpeg_decoder_start_of_scan (JpegDecoder * dec);
50 /* misc helper function declarations */
52 static void dumpbits (JpegBits * bits);
53 static char *sprintbits (char *str, unsigned int bits, int n);
55 static void huffman_table_load_std_jpeg (JpegDecoder * dec);
57 static void jpeg_decoder_verify_header (JpegDecoder *dec);
58 static void jpeg_decoder_init_decoder (JpegDecoder *dec);
63 jpeg_decoder_verify_header (JpegDecoder *dec)
65 int max_quant_table = 0;
68 if (dec->sof_type != JPEG_MARKER_SOF_0) {
69 OIL_ERROR("only handle baseline DCT");
74 OIL_ERROR("height can't be 0");
78 switch (dec->sof_type) {
79 case JPEG_MARKER_SOF_0:
82 if (dec->depth != 8) {
83 OIL_ERROR("depth must be 8 (%d)", dec->depth);
87 case JPEG_MARKER_SOF_1:
90 if (dec->depth != 8 && dec->depth != 12) {
91 OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
95 case JPEG_MARKER_SOF_2:
98 if (dec->depth != 8 && dec->depth != 12) {
99 OIL_ERROR("depth must be 8 or 12 (%d)", dec->depth);
103 case JPEG_MARKER_SOF_3:
106 if (dec->depth < 2 || dec->depth > 16) {
107 OIL_ERROR("depth must be between 2 and 16 (%d)", dec->depth);
115 if (dec->n_components < 0 || dec->n_components > 255) {
116 OIL_ERROR("n_components must be in the range 0-255 (%d)",
120 if (dec->sof_type == JPEG_MARKER_SOF_2 && dec->n_components > 4) {
121 OIL_ERROR("n_components must be <= 4 for progressive DCT (%d)",
126 for (i = 0; i < dec->n_components; i++) {
127 if (dec->components[i].id < 0 || dec->components[i].id > 255) {
128 OIL_ERROR("component ID out of range");
132 if (dec->components[i].h_sample < 1 || dec->components[i].h_sample > 4 ||
133 dec->components[i].v_sample < 1 || dec->components[i].v_sample > 4) {
134 OIL_ERROR("sample factor(s) for component %d out of range %d %d",
135 i, dec->components[i].h_sample, dec->components[i].v_sample);
139 if (dec->components[i].quant_table < 0 ||
140 dec->components[i].quant_table > max_quant_table) {
141 OIL_ERROR("quant table for component %d out of range (%d)",
142 i, dec->components[i].quant_table);
150 jpeg_decoder_init_decoder (JpegDecoder *dec)
152 int max_h_sample = 0;
153 int max_v_sample = 0;
156 /* decoder limitations */
157 if (dec->n_components != 3) {
158 jpeg_decoder_error(dec, "wrong number of components %d", dec->n_components);
161 if (dec->sof_type != JPEG_MARKER_SOF_0) {
162 jpeg_decoder_error(dec, "only handle baseline DCT");
169 for (i=0; i < dec->n_components; i++) {
170 max_h_sample = MAX (max_h_sample, dec->components[i].h_sample);
171 max_v_sample = MAX (max_v_sample, dec->components[i].v_sample);
175 (dec->width + 8 * max_h_sample - 1) / (8 * max_h_sample);
177 (dec->height + 8 * max_v_sample - 1) / (8 * max_v_sample);
178 for (i = 0; i < dec->n_components; i++) {
182 dec->components[i].h_subsample = max_h_sample /
183 dec->components[i].h_sample;
184 dec->components[i].v_subsample = max_v_sample /
185 dec->components[i].v_sample;
187 rowstride = dec->width_blocks * 8 * max_h_sample /
188 dec->components[i].h_subsample;
189 image_size = rowstride *
190 (dec->height_blocks * 8 * max_v_sample /
191 dec->components[i].v_subsample);
192 dec->components[i].rowstride = rowstride;
193 dec->components[i].image = malloc (image_size);
199 generate_code_table (int *huffsize)
211 for (i = 0; i < 16; i++) {
212 for (j = 0; j < huffsize[i]; j++) {
213 OIL_DEBUG ("huffcode[%d] = %s", k,
214 sprintbits (str, code >> (15 - i), i + 1));
224 huffman_table_init_jpeg (HuffmanTable *table, JpegBits * bits)
232 huffman_table_init (table);
234 /* huffsize[i] is the number of symbols that have length
235 * (i+1) bits. Maximum bit length is 16 bits, so there are
238 for (i = 0; i < 16; i++) {
239 huffsize[i] = jpeg_bits_get_u8 (bits);
241 n_symbols += huffsize[i];
244 /* Build up the symbol table. The first symbol is all 0's, with
245 * the number of bits determined by the first non-zero entry in
246 * huffsize[]. Subsequent symbols with the same bit length are
247 * incremented by 1. Increasing the bit length shifts the
248 * symbol 1 bit to the left. */
251 for (i = 0; i < 16; i++) {
252 for (j = 0; j < huffsize[i]; j++) {
253 huffman_table_add (table, symbol, i + 1, jpeg_bits_get_u8 (bits));
258 /* This checks that our symbol is actually less than the
259 * number of bits we think it is. This is only triggered
260 * for bad huffsize[] arrays. */
261 if (symbol >= (1 << (i + 1))) {
262 /* FIXME jpeg_decoder_error() */
263 OIL_DEBUG ("bad huffsize[] array");
270 huffman_table_dump (table);
276 dumpbits (JpegBits * bits)
284 for (i = 0; i < 8; i++) {
285 sprintf (s, "%02x %02x %02x %02x %02x %02x %02x %02x ........",
286 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
287 for (j = 0; j < 8; j++) {
288 s[j + 24] = (isprint (p[j])) ? p[j] : '.';
297 jpeg_decoder_find_component_by_id (JpegDecoder * dec, int id)
301 for (i = 0; i < dec->n_components; i++) {
302 if (dec->components[i].id == id)
305 OIL_DEBUG ("undefined component id %d", id);
310 jpeg_decoder_application0 (JpegDecoder * dec, JpegBits * bits)
316 length = get_be_u16 (bits);
317 OIL_DEBUG ("length=%d", length);
319 if (memcmp (bits->ptr, "JFIF", 4) == 0 && bits->ptr[4] == 0) {
330 version = get_be_u16 (bits);
331 units = get_u8 (bits);
332 x_density = get_be_u16 (bits);
333 y_density = get_be_u16 (bits);
334 x_thumbnail = get_u8 (bits);
335 y_thumbnail = get_u8 (bits);
337 OIL_DEBUG ("version = %04x", version);
338 OIL_DEBUG ("units = %d", units);
339 OIL_DEBUG ("x_density = %d", x_density);
340 OIL_DEBUG ("y_density = %d", y_density);
341 OIL_DEBUG ("x_thumbnail = %d", x_thumbnail);
342 OIL_DEBUG ("y_thumbnail = %d", y_thumbnail);
346 if (memcmp (bits->ptr, "JFXX", 4) == 0 && bits->ptr[4] == 0) {
347 OIL_DEBUG ("JFIF extension (not handled)");
348 bits->ptr += length - 2;
355 jpeg_decoder_application_misc (JpegDecoder * dec, JpegBits * bits)
361 length = get_be_u16 (bits);
362 OIL_DEBUG ("length=%d", length);
364 OIL_DEBUG ("JPEG application tag X ignored");
367 bits->ptr += length - 2;
373 jpeg_decoder_comment (JpegDecoder * dec, JpegBits * bits)
377 OIL_DEBUG ("comment");
379 length = get_be_u16 (bits);
380 OIL_DEBUG ("length=%d", length);
384 bits->ptr += length - 2;
390 jpeg_decoder_restart_interval (JpegDecoder * dec, JpegBits * bits)
394 OIL_DEBUG ("comment");
396 length = get_be_u16 (bits);
397 OIL_DEBUG ("length=%d", length);
399 dec->restart_interval = get_be_u16 (bits);
400 OIL_DEBUG ("restart_interval=%d", dec->restart_interval);
406 jpeg_decoder_restart (JpegDecoder * dec, JpegBits * bits)
408 OIL_DEBUG ("restart");
414 jpeg_decoder_decode_entropy_segment (JpegDecoder * dec)
416 JpegBits * bits = &dec->bits;
417 JpegBits b2, *bits2 = &b2;
420 unsigned char *newptr;
432 if (bits->ptr[len] == 0xff && bits->ptr[len + 1] != 0x00) {
437 OIL_DEBUG ("entropy length = %d", len);
439 /* we allocate extra space, since the getbits() code can
440 * potentially read past the end of the buffer */
441 newptr = malloc (len + 2);
442 for (i = 0; i < len; i++) {
443 newptr[j] = bits->ptr[i];
445 if (bits->ptr[i] == 0xff)
452 bits2->end = newptr + j;
456 dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
460 n = dec->restart_interval;
461 if (n == 0) n = INT_MAX;
463 for (i = 0; i < dec->scan_list_length; i++) {
470 OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
472 dec->scan_list[i].component_index,
473 dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
475 component_index = dec->scan_list[i].component_index;
476 dc_table_index = dec->scan_list[i].dc_table;
477 ac_table_index = dec->scan_list[i].ac_table;
478 quant_index = dec->scan_list[i].quant_table;
480 ret = huffman_table_decode_macroblock (block,
481 &dec->dc_huff_table[dc_table_index],
482 &dec->ac_huff_table[ac_table_index], bits2);
484 OIL_DEBUG ("%d,%d: component=%d dc_table=%d ac_table=%d",
486 dec->scan_list[i].component_index,
487 dec->scan_list[i].dc_table, dec->scan_list[i].ac_table);
492 OIL_DEBUG ("using quant table %d", quant_index);
493 oil_mult8x8_s16 (block2, block, dec->quant_tables[quant_index].quantizer,
494 sizeof (short) * 8, sizeof(short) * 8, sizeof (short) * 8);
495 dec->dc[component_index] += block2[0];
496 block2[0] = dec->dc[component_index];
497 oil_unzigzag8x8_s16 (block, sizeof (short) * 8, block2,
499 oil_idct8x8_s16 (block2, sizeof (short) * 8, block, sizeof (short) * 8);
500 oil_trans8x8_s16 (block, sizeof (short) * 8, block2, sizeof (short) * 8);
502 ptr = dec->components[component_index].image +
503 x * dec->components[component_index].h_sample +
504 dec->scan_list[i].offset +
505 dec->components[component_index].rowstride * y *
506 dec->components[component_index].v_sample;
508 oil_clipconv8x8_u8_s16 (ptr,
509 dec->components[component_index].rowstride,
510 block, sizeof (short) * 8);
513 if (x * dec->scan_h_subsample >= dec->width) {
517 if (y * dec->scan_v_subsample >= dec->height) {
529 jpeg_decoder_new (void)
535 dec = malloc (sizeof(JpegDecoder));
536 memset (dec, 0, sizeof(JpegDecoder));
538 huffman_table_load_std_jpeg (dec);
544 jpeg_decoder_free (JpegDecoder * dec)
548 for (i = 0; i < JPEG_MAX_COMPONENTS; i++) {
549 if (dec->components[i].image)
550 free (dec->components[i].image);
560 jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...)
564 if (dec->error) return;
566 va_start (varargs, fmt);
568 vasprintf(&dec->error_message, fmt, varargs);
570 dec->error_message = malloc(100);
571 vsnprintf(dec->error_message, 100, fmt, varargs);
575 OIL_ERROR("decoder error: %s", dec->error_message);
581 jpeg_decoder_get_marker (JpegDecoder *dec, int *marker)
584 JpegBits *bits = &dec->bits;
586 if (jpeg_bits_available(bits) < 2) {
590 a = jpeg_bits_get_u8(bits);
592 jpeg_decoder_error(dec, "expected marker, not 0x%02x", a);
597 b = jpeg_bits_get_u8 (bits);
598 } while (b == 0xff && jpeg_bits_error(bits));
605 jpeg_decoder_skip (JpegDecoder *dec)
609 length = jpeg_bits_get_u16_be (&dec->bits);
610 jpeg_bits_skip (&dec->bits, length - 2);
614 jpeg_decoder_decode (JpegDecoder *dec)
623 /* Note: The spec is ambiguous as to whether fill bytes can preceed
624 * the first marker. We'll assume yes. */
625 if (!jpeg_decoder_get_marker (dec, &marker)) {
628 if (marker != JPEG_MARKER_SOI) {
629 jpeg_decoder_error(dec, "not a JPEG image");
633 /* Interpret markers up to the start of frame */
634 while (!dec->error) {
635 if (!jpeg_decoder_get_marker (dec, &marker)) {
639 if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
640 jpeg_decoder_define_huffman_tables (dec);
641 } else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
642 jpeg_decoder_define_arithmetic_conditioning (dec);
643 } else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
644 jpeg_decoder_define_quantization_tables (dec);
645 } else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
646 jpeg_decoder_define_restart_interval (dec);
647 } else if (JPEG_MARKER_IS_APP(marker)) {
648 /* FIXME decode app segment */
649 jpeg_decoder_skip (dec);
650 } else if (marker == JPEG_MARKER_COMMENT) {
651 jpeg_decoder_skip (dec);
652 } else if (JPEG_MARKER_IS_START_OF_FRAME(marker)) {
655 jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
660 jpeg_decoder_start_of_frame(dec, marker);
662 jpeg_decoder_verify_header (dec);
667 jpeg_decoder_init_decoder (dec);
672 /* In this section, we loop over parse units until we reach the end
674 while (!dec->error) {
675 if (!jpeg_decoder_get_marker (dec, &marker)) {
679 if (marker == JPEG_MARKER_DEFINE_HUFFMAN_TABLES) {
680 jpeg_decoder_define_huffman_tables (dec);
681 } else if (marker == JPEG_MARKER_DEFINE_ARITHMETIC_CONDITIONING) {
682 jpeg_decoder_define_arithmetic_conditioning (dec);
683 } else if (marker == JPEG_MARKER_DEFINE_QUANTIZATION_TABLES) {
684 jpeg_decoder_define_quantization_tables (dec);
685 } else if (marker == JPEG_MARKER_DEFINE_RESTART_INTERVAL) {
686 jpeg_decoder_define_restart_interval (dec);
687 } else if (JPEG_MARKER_IS_APP(marker)) {
688 jpeg_decoder_skip (dec);
689 } else if (marker == JPEG_MARKER_COMMENT) {
690 jpeg_decoder_skip (dec);
691 } else if (marker == JPEG_MARKER_SOS) {
692 jpeg_decoder_start_of_scan (dec);
693 jpeg_decoder_decode_entropy_segment (dec);
694 } else if (JPEG_MARKER_IS_RESET(marker)) {
695 jpeg_decoder_decode_entropy_segment (dec);
696 } else if (marker == JPEG_MARKER_EOI) {
699 jpeg_decoder_error(dec, "unexpected marker 0x%02x", marker);
710 jpeg_decoder_define_huffman_tables (JpegDecoder * dec)
712 JpegBits *bits = &dec->bits;
717 HuffmanTable *hufftab;
719 OIL_DEBUG ("define huffman tables");
721 length = jpeg_bits_get_u16_be (bits);
723 jpeg_decoder_error(dec, "length too short");
729 x = jpeg_bits_get_u8 (bits);
735 OIL_DEBUG ("huff table type %d (%s) index %d", tc, tc ? "ac" : "dc", th);
736 if (tc > 1 || th > 3) {
737 jpeg_decoder_error(dec, "huffman table type or index out of range");
742 hufftab = &dec->ac_huff_table[th];
743 length -= huffman_table_init_jpeg (hufftab, bits);
745 hufftab = &dec->dc_huff_table[th];
746 length -= huffman_table_init_jpeg (hufftab, bits);
750 jpeg_decoder_error(dec, "huffman table overran available bytes");
756 jpeg_decoder_define_quantization_tables (JpegDecoder *dec)
758 JpegBits *bits = &dec->bits;
759 JpegQuantTable *table;
765 OIL_INFO ("define quantization table");
767 length = jpeg_bits_get_u16_be (bits);
769 jpeg_decoder_error(dec, "length too short");
777 x = jpeg_bits_get_u8 (bits);
783 jpeg_decoder_error (dec, "bad pq value");
787 jpeg_decoder_error (dec, "bad tq value");
791 table = &dec->quant_tables[tq];
793 for (i = 0; i < 64; i++) {
794 table->quantizer[i] = jpeg_bits_get_u16_be (bits);
798 for (i = 0; i < 64; i++) {
799 table->quantizer[i] = jpeg_bits_get_u8 (bits);
805 jpeg_decoder_error(dec, "quantization table overran available bytes");
811 jpeg_decoder_define_restart_interval (JpegDecoder *dec)
813 JpegBits *bits = &dec->bits;
816 length = jpeg_bits_get_u16_be (bits);
818 jpeg_decoder_error(dec, "length supposed to be 4 (%d)", length);
822 /* FIXME this needs to be checked somewhere */
823 dec->restart_interval = jpeg_bits_get_u16_be (bits);
827 jpeg_decoder_define_arithmetic_conditioning (JpegDecoder *dec)
829 /* we don't handle arithmetic coding, so skip it */
830 jpeg_decoder_skip (dec);
834 jpeg_decoder_start_of_frame (JpegDecoder * dec, int marker)
836 JpegBits *bits = &dec->bits;
840 OIL_INFO ("start of frame");
842 dec->sof_type = marker;
844 length = jpeg_bits_get_u16_be (bits);
846 if (jpeg_bits_available(bits) < length) {
847 jpeg_decoder_error(dec, "not enough data for start_of_frame (%d < %d)",
848 length, jpeg_bits_available(bits));
852 dec->depth = jpeg_bits_get_u8 (bits);
853 dec->height = jpeg_bits_get_u16_be (bits);
854 dec->width = jpeg_bits_get_u16_be (bits);
855 dec->n_components = jpeg_bits_get_u8 (bits);
858 "frame_length=%d depth=%d height=%d width=%d n_components=%d", length,
859 dec->depth, dec->height, dec->width, dec->n_components);
861 if (dec->n_components * 3 + 8 != length) {
862 jpeg_decoder_error(dec, "inconsistent header");
866 for (i = 0; i < dec->n_components; i++) {
867 dec->components[i].id = get_u8 (bits);
868 dec->components[i].h_sample = getbits (bits, 4);
869 dec->components[i].v_sample = getbits (bits, 4);
870 dec->components[i].quant_table = get_u8 (bits);
873 "[%d] id=%d h_sample=%d v_sample=%d quant_table=%d", i,
874 dec->components[i].id, dec->components[i].h_sample,
875 dec->components[i].v_sample, dec->components[i].quant_table);
880 jpeg_decoder_start_of_scan (JpegDecoder * dec)
882 JpegBits *bits = &dec->bits;
893 OIL_DEBUG ("start of scan");
895 length = jpeg_bits_get_u16_be (bits);
896 OIL_DEBUG ("length=%d", length);
898 n_components = jpeg_bits_get_u8 (bits);
900 dec->scan_h_subsample = 0;
901 dec->scan_v_subsample = 0;
902 for (i = 0; i < n_components; i++) {
913 component_id = jpeg_bits_get_u8 (bits);
914 tmp = jpeg_bits_get_u8 (bits);
916 ac_table = tmp & 0xf;
917 index = jpeg_decoder_find_component_by_id (dec, component_id);
919 h_subsample = dec->components[index].h_sample;
920 v_subsample = dec->components[index].v_sample;
921 quant_index = dec->components[index].quant_table;
923 for (y = 0; y < v_subsample; y++) {
924 for (x = 0; x < h_subsample; x++) {
925 dec->scan_list[n].component_index = index;
926 dec->scan_list[n].dc_table = dc_table;
927 dec->scan_list[n].ac_table = ac_table;
928 dec->scan_list[n].quant_table = quant_index;
929 dec->scan_list[n].x = x;
930 dec->scan_list[n].y = y;
931 dec->scan_list[n].offset =
932 y * 8 * dec->components[index].rowstride + x * 8;
937 dec->scan_h_subsample = MAX (dec->scan_h_subsample, h_subsample);
938 dec->scan_v_subsample = MAX (dec->scan_v_subsample, v_subsample);
940 OIL_DEBUG ("component %d: index=%d dc_table=%d ac_table=%d n=%d",
941 component_id, index, dc_table, ac_table, n);
943 dec->scan_list_length = n;
945 spectral_start = jpeg_bits_get_u8 (bits);
946 spectral_end = jpeg_bits_get_u8 (bits);
947 OIL_DEBUG ("spectral range [%d,%d]", spectral_start, spectral_end);
948 tmp = jpeg_bits_get_u8 (bits);
949 approx_high = tmp >> 4;
950 approx_low = tmp & 0xf;
951 OIL_DEBUG ("approx range [%d,%d]", approx_low, approx_high);
955 dec->dc[0] = dec->dc[1] = dec->dc[2] = dec->dc[3] = 128 * 8;
970 jpeg_decoder_addbits (JpegDecoder * dec, unsigned char *data, unsigned int len)
974 offset = dec->bits.ptr - dec->data;
976 dec->data = realloc (dec->data, dec->data_len + len);
977 memcpy (dec->data + dec->data_len, data, len);
978 dec->data_len += len;
980 dec->bits.ptr = dec->data + offset;
981 dec->bits.end = dec->data + dec->data_len;
987 jpeg_decoder_get_image_size (JpegDecoder * dec, int *width, int *height)
992 *height = dec->height;
998 jpeg_decoder_get_component_ptr (JpegDecoder * dec, int id,
999 unsigned char **image, int *rowstride)
1003 i = jpeg_decoder_find_component_by_id (dec, id);
1005 *image = dec->components[i].image;
1007 *rowstride = dec->components[i].rowstride;
1013 jpeg_decoder_get_component_size (JpegDecoder * dec, int id,
1014 int *width, int *height)
1018 /* subsampling sizes are rounded up */
1020 i = jpeg_decoder_find_component_by_id (dec, id);
1022 *width = (dec->width - 1) / dec->components[i].h_subsample + 1;
1024 *height = (dec->height - 1) / dec->components[i].v_subsample + 1;
1030 jpeg_decoder_get_component_subsampling (JpegDecoder * dec, int id,
1031 int *h_subsample, int *v_subsample)
1035 i = jpeg_decoder_find_component_by_id (dec, id);
1037 *h_subsample = dec->components[i].h_subsample;
1039 *v_subsample = dec->components[i].v_subsample;
1046 jpeg_decoder_parse (JpegDecoder * dec)
1048 JpegBits *bits = &dec->bits;
1054 while (bits->ptr < bits->end) {
1063 OIL_DEBUG ("lost sync, skipped %d bytes", n);
1069 OIL_DEBUG ("tag %02x", tag);
1073 for (i = 0; i < n_jpeg_markers - 1; i++) {
1074 if (tag == jpeg_markers[i].tag) {
1078 OIL_DEBUG ("tag: %s", jpeg_markers[i].name);
1079 if (jpeg_markers[i].func) {
1080 jpeg_markers[i].func (dec, &b2);
1082 OIL_DEBUG ("unhandled or illegal JPEG marker (0x%02x)", tag);
1085 if (jpeg_markers[i].flags & JPEG_ENTROPY_SEGMENT) {
1086 jpeg_decoder_decode_entropy_segment (dec, &b2);
1097 /* misc helper functins */
1100 sprintbits (char *str, unsigned int bits, int n)
1103 int bit = 1 << (n - 1);
1105 for (i = 0; i < n; i++) {
1106 str[i] = (bits & bit) ? '1' : '0';
1115 huffman_table_load_std_jpeg (JpegDecoder * dec)
1117 JpegBits b, *bits = &b;
1119 bits->ptr = jpeg_standard_tables;
1121 bits->end = jpeg_standard_tables + jpeg_standard_tables_size;
1123 huffman_table_init_jpeg (&dec->dc_huff_table[0], bits);
1124 huffman_table_init_jpeg (&dec->ac_huff_table[0], bits);
1125 huffman_table_init_jpeg (&dec->dc_huff_table[1], bits);
1126 huffman_table_init_jpeg (&dec->ac_huff_table[1], bits);