libswfdec/jpeg/Makefile.am | 1 libswfdec/jpeg/jpeg.c | 44 +++++++++---- libswfdec/jpeg/jpeg.h | 118 ++++++++++++++++++++++++++++++++++++- libswfdec/jpeg/jpeg_huffman.c | 20 ++---- libswfdec/jpeg/jpeg_internal.h | 111 ---------------------------------- libswfdec/jpeg/jpeg_rgb_decoder.c | 1 libswfdec/jpeg/jpeg_rgb_internal.h | 36 ----------- 7 files changed, 154 insertions(+), 177 deletions(-) New commits: diff-tree 936eabe443ef788a6444a1077ae571b7731b5e67 (from 32f9933e12a49588a285dd4aa2bf94b93193d8d9) Author: David Schleef <ds@ginger.bigkitten.com> Date: Sat Apr 28 15:48:14 2007 -0700 Differences between cog-jpeg and swfdec-jpeg diff --git a/libswfdec/jpeg/jpeg.c b/libswfdec/jpeg/jpeg.c index cf8d0ed..b7398d7 100644 --- a/libswfdec/jpeg/jpeg.c +++ b/libswfdec/jpeg/jpeg.c @@ -4,9 +4,8 @@ #endif #include <liboil/liboil.h> -#include <cog/cog-stdint.h> -#include <cog/cogdebug.h> -#include <cog/cogutils.h> +#include <liboil/liboil-stdint.h> +#include <cogcompat.h> #include <stdlib.h> #include <stdio.h> diff --git a/libswfdec/jpeg/jpeg.h b/libswfdec/jpeg/jpeg.h index dcaf5fb..9caad4c 100644 --- a/libswfdec/jpeg/jpeg.h +++ b/libswfdec/jpeg/jpeg.h @@ -2,7 +2,7 @@ #ifndef _JPEG_DECODER_H_ #define _JPEG_DECODER_H_ -#include <cog/jpeg/jpeg_bits.h> +#include <jpeg/jpeg_bits.h> #include <stdint.h> diff --git a/libswfdec/jpeg/jpeg_huffman.c b/libswfdec/jpeg/jpeg_huffman.c index 1fc4583..d5b7f61 100644 --- a/libswfdec/jpeg/jpeg_huffman.c +++ b/libswfdec/jpeg/jpeg_huffman.c @@ -3,7 +3,7 @@ #include "config.h" #endif -#include <cog/cogdebug.h> +#include <cogcompat.h> #include <liboil/liboil.h> #include <string.h> diff-tree 32f9933e12a49588a285dd4aa2bf94b93193d8d9 (from 1ed8a178896c2d7320fc86a8516f8aab5e4f8321) Author: David Schleef <ds@ginger.bigkitten.com> Date: Sat Apr 28 15:39:10 2007 -0700 Removed in Cog diff --git a/libswfdec/jpeg/jpeg_internal.h b/libswfdec/jpeg/jpeg_internal.h deleted file mode 100644 index 35f694e..0000000 --- a/libswfdec/jpeg/jpeg_internal.h +++ /dev/null @@ -1,111 +0,0 @@ - -#ifndef _JPEG_INTERNAL_H_ -#define _JPEG_INTERNAL_H_ - -#include "jpeg.h" -#include "jpeg_huffman.h" -#include "jpeg_bits.h" - -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - - -#define JPEG_MAX_COMPONENTS 256 - -typedef struct _JpegScan JpegScan; -typedef struct _JpegQuantTable JpegQuantTable; - -struct _JpegQuantTable { - int pq; - int16_t quantizer[64]; -}; - -struct _JpegDecoder { - int width; - int height; - int depth; - int n_components; - JpegBits bits; - int error; - int strict; - char *error_message; - - int sof_type; - - int width_blocks; - int height_blocks; - - int restart_interval; - - unsigned char *data; - unsigned int data_len; - - struct{ - int id; - int h_sample; - int v_sample; - int quant_table; - - int h_subsample; - int v_subsample; - unsigned char *image; - int rowstride; - } components[JPEG_MAX_COMPONENTS]; - - JpegQuantTable quant_tables[4]; - HuffmanTable dc_huff_table[4]; - HuffmanTable ac_huff_table[4]; - - int scan_list_length; - struct{ - int component_index; - int dc_table; - int ac_table; - int quant_table; - int x; - int y; - int offset; - }scan_list[10]; - int scan_h_subsample; - int scan_v_subsample; - - /* scan state */ - int x,y; - int dc[4]; -}; - -struct _JpegScan { - int length; - - int n_components; - struct { - int index; - int dc_table; - int ac_table; - }block_list[10]; -}; - - -/* jpeg.c */ - -int jpeg_decoder_sof_baseline_dct(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_define_quant_table(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_define_huffman_table(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_sos(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_soi(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_eoi(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_application0(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_application_misc(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_comment(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_restart_interval(JpegDecoder *dec, JpegBits *bits); -int jpeg_decoder_restart(JpegDecoder *dec, JpegBits *bits); -void jpeg_decoder_decode_entropy_segment(JpegDecoder *dec); - - -#endif - - diff --git a/libswfdec/jpeg/jpeg_rgb_internal.h b/libswfdec/jpeg/jpeg_rgb_internal.h deleted file mode 100644 index db8b80e..0000000 --- a/libswfdec/jpeg/jpeg_rgb_internal.h +++ /dev/null @@ -1,36 +0,0 @@ - -#ifndef _JPEG_INTERNAL_H_ -#define _JPEG_INTERNAL_H_ - -#include "jpeg.h" -#include "jpeg_rgb_decoder.h" -#include "bits.h" - - -#define JPEG_DEBUG(n, format...) do{ \ - if((n)<=JPEG_DEBUG_LEVEL)jpeg_debug((n),format); \ -}while(0) -#define JPEG_DEBUG_LEVEL 4 - - -struct jpeg_rgb_decoder_struct { - JpegDecoder *dec; - - unsigned char *image; - int height, width; - - struct{ - unsigned char *image; - int rowstride; - int h_subsample; - int v_subsample; - int alloc; - }component[3]; -}; - -/* jpeg_rgb_decoder.c */ - - -#endif - - diff-tree 1ed8a178896c2d7320fc86a8516f8aab5e4f8321 (from 158cee244eb9faa5c818d41b3e06a20bfbd0cbce) Author: David Schleef <ds@ginger.bigkitten.com> Date: Sat Apr 28 15:38:45 2007 -0700 Copy files from Cog diff --git a/libswfdec/jpeg/Makefile.am b/libswfdec/jpeg/Makefile.am index 85a13df..d6475cc 100644 --- a/libswfdec/jpeg/Makefile.am +++ b/libswfdec/jpeg/Makefile.am @@ -14,7 +14,6 @@ noinst_HEADERS = \ jpeg.h \ jpeg_bits.h \ jpeg_huffman.h \ - jpeg_internal.h \ jpeg_rgb_decoder.h libjpeg_la_CFLAGS = $(GLOBAL_CFLAGS) $(GLIB_CFLAGS) $(LIBOIL_CFLAGS) -I$(srcdir)/.. diff --git a/libswfdec/jpeg/jpeg.c b/libswfdec/jpeg/jpeg.c index 4d2fd43..cf8d0ed 100644 --- a/libswfdec/jpeg/jpeg.c +++ b/libswfdec/jpeg/jpeg.c @@ -4,16 +4,15 @@ #endif #include <liboil/liboil.h> -#include <liboil/liboil-stdint.h> - -#include <cogcompat.h> +#include <cog/cog-stdint.h> +#include <cog/cogdebug.h> +#include <cog/cogutils.h> #include <stdlib.h> #include <stdio.h> #include <string.h> - -#include "jpeg_internal.h" +#include "jpeg.h" extern uint8_t jpeg_standard_tables[]; @@ -37,7 +36,7 @@ static void jpeg_decoder_verify_header ( static void jpeg_decoder_init_decoder (JpegDecoder *dec); -static void +void jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...) { va_list varargs; @@ -224,7 +223,7 @@ generate_code_table (int *huffsize) } int -huffman_table_init_jpeg (HuffmanTable *table, JpegBits * bits) +huffman_table_init_jpeg (JpegDecoder *decoder, HuffmanTable *table, JpegBits * bits) { int n_symbols; int huffsize[16]; @@ -262,8 +261,7 @@ huffman_table_init_jpeg (HuffmanTable *t * number of bits we think it is. This is only triggered * for bad huffsize[] arrays. */ if (symbol >= (1U << (i + 1))) { - /* FIXME jpeg_decoder_error() */ - COG_ERROR ("bad huffsize[] array"); + jpeg_decoder_error (decoder, "bad huffsize[] array"); return -1; } @@ -461,7 +459,7 @@ jpeg_decoder_decode_entropy_segment (Jpe ac_table_index = dec->scan_list[i].ac_table; quant_index = dec->scan_list[i].quant_table; - ret = huffman_table_decode_macroblock (block, + ret = huffman_table_decode_macroblock (dec, block, &dec->dc_huff_table[dc_table_index], &dec->ac_huff_table[ac_table_index], bits2); if (ret < 0) { @@ -529,7 +527,7 @@ jpeg_decoder_free (JpegDecoder * dec) { int i; - for (i = 0; i < JPEG_MAX_COMPONENTS; i++) { + for (i = 0; i < JPEG_LIMIT_COMPONENTS; i++) { if (dec->components[i].image) free (dec->components[i].image); } @@ -629,6 +627,9 @@ jpeg_decoder_decode (JpegDecoder *dec) return FALSE; } } + if (dec->error) { + return FALSE; + } jpeg_decoder_start_of_frame(dec, marker); @@ -663,6 +664,9 @@ jpeg_decoder_decode (JpegDecoder *dec) jpeg_decoder_skip (dec); } else if (marker == JPEG_MARKER_SOS) { jpeg_decoder_start_of_scan (dec); + if (dec->error) { + return FALSE; + } jpeg_decoder_decode_entropy_segment (dec); } else if (JPEG_MARKER_IS_RESET(marker)) { jpeg_decoder_decode_entropy_segment (dec); @@ -683,6 +687,9 @@ jpeg_decoder_decode (JpegDecoder *dec) return FALSE; } } + if (dec->error) { + return FALSE; + } return TRUE; } @@ -723,10 +730,13 @@ jpeg_decoder_define_huffman_tables (Jpeg if (tc) { hufftab = &dec->ac_huff_table[th]; - length -= huffman_table_init_jpeg (hufftab, bits); + length -= huffman_table_init_jpeg (dec, hufftab, bits); } else { hufftab = &dec->dc_huff_table[th]; - length -= huffman_table_init_jpeg (hufftab, bits); + length -= huffman_table_init_jpeg (dec, hufftab, bits); + } + if (dec->error) { + return; } } if (length < 0) { @@ -914,6 +924,10 @@ jpeg_decoder_start_of_scan (JpegDecoder dec->scan_list[n].offset y * 8 * dec->components[index].rowstride + x * 8; n++; + if (n > JPEG_LIMIT_SCAN_LIST_LENGTH) { + jpeg_decoder_error(dec, "scan list too long"); + return; + } } } @@ -925,6 +939,7 @@ jpeg_decoder_start_of_scan (JpegDecoder } dec->scan_list_length = n; + spectral_start = jpeg_bits_get_u8 (bits); spectral_end = jpeg_bits_get_u8 (bits); COG_DEBUG ("spectral range [%d,%d]", spectral_start, spectral_end); @@ -1103,10 +1118,10 @@ jpeg_load_standard_huffman_tables (JpegD bits->idx = 0; bits->end = jpeg_standard_tables + jpeg_standard_tables_size; - huffman_table_init_jpeg (&dec->dc_huff_table[0], bits); - huffman_table_init_jpeg (&dec->ac_huff_table[0], bits); - huffman_table_init_jpeg (&dec->dc_huff_table[1], bits); - huffman_table_init_jpeg (&dec->ac_huff_table[1], bits); + huffman_table_init_jpeg (dec, &dec->dc_huff_table[0], bits); + huffman_table_init_jpeg (dec, &dec->ac_huff_table[0], bits); + huffman_table_init_jpeg (dec, &dec->dc_huff_table[1], bits); + huffman_table_init_jpeg (dec, &dec->ac_huff_table[1], bits); } diff --git a/libswfdec/jpeg/jpeg.h b/libswfdec/jpeg/jpeg.h index 49eaf6a..dcaf5fb 100644 --- a/libswfdec/jpeg/jpeg.h +++ b/libswfdec/jpeg/jpeg.h @@ -2,8 +2,97 @@ #ifndef _JPEG_DECODER_H_ #define _JPEG_DECODER_H_ +#include <cog/jpeg/jpeg_bits.h> + #include <stdint.h> +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +#define JPEG_LIMIT_COMPONENTS 256 +#define JPEG_LIMIT_SCAN_LIST_LENGTH 10 + + +typedef struct _JpegDecoder JpegDecoder; +typedef struct _JpegQuantTable JpegQuantTable; +typedef struct _HuffmanEntry HuffmanEntry; +typedef struct _HuffmanTable HuffmanTable; + +struct _HuffmanEntry { + unsigned int symbol; + unsigned int mask; + int n_bits; + unsigned char value; +}; + +struct _HuffmanTable { + int len; + HuffmanEntry entries[256]; +}; + +struct _JpegQuantTable { + int pq; + int16_t quantizer[64]; +}; + +struct _JpegDecoder { + int width; + int height; + int depth; + int n_components; + JpegBits bits; + int error; + int strict; + char *error_message; + + int sof_type; + + int width_blocks; + int height_blocks; + + int restart_interval; + + unsigned char *data; + unsigned int data_len; + + struct{ + int id; + int h_sample; + int v_sample; + int quant_table; + + int h_subsample; + int v_subsample; + unsigned char *image; + int rowstride; + } components[JPEG_LIMIT_COMPONENTS]; + + JpegQuantTable quant_tables[4]; + HuffmanTable dc_huff_table[4]; + HuffmanTable ac_huff_table[4]; + + int scan_list_length; + struct{ + int component_index; + int dc_table; + int ac_table; + int quant_table; + int x; + int y; + int offset; + }scan_list[JPEG_LIMIT_SCAN_LIST_LENGTH]; + int scan_h_subsample; + int scan_v_subsample; + + /* scan state */ + int x,y; + int dc[4]; +}; + #define JPEG_MARKER_STUFFED 0x00 #define JPEG_MARKER_TEM 0x01 #define JPEG_MARKER_RES 0x02 @@ -53,8 +142,6 @@ #define JPEG_MARKER_IS_RESET(x) ((x)>=0xd0 && (x)<=0xd7) -typedef struct _JpegDecoder JpegDecoder; - JpegDecoder *jpeg_decoder_new(void); void jpeg_decoder_free(JpegDecoder *dec); @@ -72,5 +159,32 @@ unsigned char *jpeg_decoder_get_argb_ima int jpeg_decode_argb (uint8_t *data, int length, uint32_t **image, int *width, int *height); +void jpeg_decoder_error(JpegDecoder *dec, char *fmt, ...); + +int jpeg_decoder_sof_baseline_dct(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_define_quant_table(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_define_huffman_table(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_sos(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_soi(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_eoi(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_application0(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_application_misc(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_comment(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_restart_interval(JpegDecoder *dec, JpegBits *bits); +int jpeg_decoder_restart(JpegDecoder *dec, JpegBits *bits); +void jpeg_decoder_decode_entropy_segment(JpegDecoder *dec); + + +void huffman_table_init(HuffmanTable *table); + +void huffman_table_dump(HuffmanTable *table); +void huffman_table_add(HuffmanTable *table, uint32_t code, int n_bits, + int value); +unsigned int huffman_table_decode_jpeg(JpegDecoder *dec, HuffmanTable *tab, JpegBits *bits); +int huffman_table_decode_macroblock(JpegDecoder *dec, short *block, HuffmanTable *dc_tab, + HuffmanTable *ac_tab, JpegBits *bits); +int huffman_table_decode(JpegDecoder *dec, HuffmanTable *dc_tab, HuffmanTable *ac_tab, JpegBits *bits); + + #endif diff --git a/libswfdec/jpeg/jpeg_huffman.c b/libswfdec/jpeg/jpeg_huffman.c index 354916d..1fc4583 100644 --- a/libswfdec/jpeg/jpeg_huffman.c +++ b/libswfdec/jpeg/jpeg_huffman.c @@ -3,14 +3,12 @@ #include "config.h" #endif -#include <swfdec_debug.h> +#include <cog/cogdebug.h> #include <liboil/liboil.h> #include <string.h> -#include "cogcompat.h" - -#include "jpeg_huffman.h" +#include "jpeg.h" /* misc helper function definitions */ @@ -56,7 +54,7 @@ huffman_table_add (HuffmanTable * table, } unsigned int -huffman_table_decode_jpeg (HuffmanTable * tab, JpegBits * bits) +huffman_table_decode_jpeg (JpegDecoder *dec, HuffmanTable * tab, JpegBits * bits) { unsigned int code; int i; @@ -79,7 +77,7 @@ huffman_table_decode_jpeg (HuffmanTable } int -huffman_table_decode_macroblock (short *block, HuffmanTable * dc_tab, +huffman_table_decode_macroblock (JpegDecoder *dec, short *block, HuffmanTable * dc_tab, HuffmanTable * ac_tab, JpegBits * bits) { int r, s, x, rs; @@ -88,7 +86,7 @@ huffman_table_decode_macroblock (short * memset (block, 0, sizeof (short) * 64); - s = huffman_table_decode_jpeg (dc_tab, bits); + s = huffman_table_decode_jpeg (dec, dc_tab, bits); if (s < 0) return -1; x = getbits (bits, s); @@ -99,7 +97,7 @@ huffman_table_decode_macroblock (short * block[0] = x; for (k = 1; k < 64; k++) { - rs = huffman_table_decode_jpeg (ac_tab, bits); + rs = huffman_table_decode_jpeg (dec, ac_tab, bits); if (rs < 0) { COG_DEBUG ("huffman error"); return -1; @@ -121,7 +119,7 @@ huffman_table_decode_macroblock (short * } else { k += r; if (k >= 64) { - COG_ERROR ("macroblock overrun"); + jpeg_decoder_error (dec, "macroblock overrun"); return -1; } x = getbits (bits, s); @@ -137,14 +135,14 @@ huffman_table_decode_macroblock (short * } int -huffman_table_decode (HuffmanTable * dc_tab, HuffmanTable * ac_tab, +huffman_table_decode (JpegDecoder *dec, HuffmanTable * dc_tab, HuffmanTable * ac_tab, JpegBits * bits) { int16_t zz[64]; int ret; while (bits->ptr < bits->end) { - ret = huffman_table_decode_macroblock (zz, dc_tab, ac_tab, bits); + ret = huffman_table_decode_macroblock (dec, zz, dc_tab, ac_tab, bits); if (ret < 0) return -1; } diff --git a/libswfdec/jpeg/jpeg_rgb_decoder.c b/libswfdec/jpeg/jpeg_rgb_decoder.c index e1dba8a..6fc49c8 100644 --- a/libswfdec/jpeg/jpeg_rgb_decoder.c +++ b/libswfdec/jpeg/jpeg_rgb_decoder.c @@ -3,7 +3,6 @@ #include <string.h> #include <stdlib.h> -#include "jpeg_internal.h" #include "jpeg.h" #include <liboil/liboil.h>