summaryrefslogtreecommitdiff
path: root/apps/recorder/jpeg_load.c
diff options
context:
space:
mode:
authorAndrew Mahone <andrew.mahone@gmail.com>2009-05-11 00:16:48 +0000
committerAndrew Mahone <andrew.mahone@gmail.com>2009-05-11 00:16:48 +0000
commitb5c356be85564eed8a85768385d2ba3ad6219cc5 (patch)
tree598f97825c186ef204a45a677bb8853810bf3519 /apps/recorder/jpeg_load.c
parent5c404a02fb8e80b5e6b0935716c69f4200d9eeaa (diff)
downloadrockbox-b5c356be85564eed8a85768385d2ba3ad6219cc5.tar.gz
rockbox-b5c356be85564eed8a85768385d2ba3ad6219cc5.zip
Fix a bug reading JPEG when the output data is smaller than sizeof(struct jpeg), and add more optional debugging output in the decoder.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20906 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/recorder/jpeg_load.c')
-rw-r--r--apps/recorder/jpeg_load.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/apps/recorder/jpeg_load.c b/apps/recorder/jpeg_load.c
index 22e017d9e8..62bc1e332d 100644
--- a/apps/recorder/jpeg_load.c
+++ b/apps/recorder/jpeg_load.c
@@ -62,7 +62,7 @@ struct jpeg
62#else 62#else
63 int fd; 63 int fd;
64 int buf_left; 64 int buf_left;
65 unsigned char *buf_index; 65 int buf_index;
66#endif 66#endif
67 unsigned long int bitbuf; 67 unsigned long int bitbuf;
68 int bitbuf_bits; 68 int bitbuf_bits;
@@ -864,7 +864,7 @@ INLINE void putc(struct jpeg* p_jpeg)
864INLINE void fill_buf(struct jpeg* p_jpeg) 864INLINE void fill_buf(struct jpeg* p_jpeg)
865{ 865{
866 p_jpeg->buf_left = read(p_jpeg->fd, p_jpeg->buf, JPEG_READ_BUF_SIZE); 866 p_jpeg->buf_left = read(p_jpeg->fd, p_jpeg->buf, JPEG_READ_BUF_SIZE);
867 p_jpeg->buf_index = p_jpeg->buf; 867 p_jpeg->buf_index = 0;
868} 868}
869 869
870static unsigned char *getc(struct jpeg* p_jpeg) 870static unsigned char *getc(struct jpeg* p_jpeg)
@@ -874,7 +874,7 @@ static unsigned char *getc(struct jpeg* p_jpeg)
874 if (p_jpeg->buf_left < 1) 874 if (p_jpeg->buf_left < 1)
875 return NULL; 875 return NULL;
876 p_jpeg->buf_left--; 876 p_jpeg->buf_left--;
877 return p_jpeg->buf_index++; 877 return (p_jpeg->buf_index++) + p_jpeg->buf;
878} 878}
879 879
880INLINE bool skip_bytes_seek(struct jpeg* p_jpeg) 880INLINE bool skip_bytes_seek(struct jpeg* p_jpeg)
@@ -1571,7 +1571,7 @@ static void fill_bit_buffer(struct jpeg* p_jpeg)
1571 p_jpeg->bitbuf = (p_jpeg->bitbuf << 8) | byte; 1571 p_jpeg->bitbuf = (p_jpeg->bitbuf << 8) | byte;
1572 p_jpeg->bitbuf_bits += 16; 1572 p_jpeg->bitbuf_bits += 16;
1573#ifdef JPEG_BS_DEBUG 1573#ifdef JPEG_BS_DEBUG
1574 DEBUGF("read in: %X\n", p_jpeg->bitbuf & 0xFFFF); 1574 DEBUGF("read in: %04X\n", p_jpeg->bitbuf & 0xFFFF);
1575#endif 1575#endif
1576} 1576}
1577 1577
@@ -1872,7 +1872,8 @@ static struct img_part *store_row_jpeg(void *jpeg_args)
1872 int idct_rows = 1 << p_jpeg->v_scale[!!ci]; 1872 int idct_rows = 1 << p_jpeg->v_scale[!!ci];
1873 unsigned char *b_out = out + (ci ? ci : store_offs[blkn]); 1873 unsigned char *b_out = out + (ci ? ci : store_offs[blkn]);
1874 if (idct_tbl[p_jpeg->v_scale[!!ci]].v_idct) 1874 if (idct_tbl[p_jpeg->v_scale[!!ci]].v_idct)
1875 idct_tbl[p_jpeg->v_scale[!!ci]].v_idct(block, idct_cols); 1875 idct_tbl[p_jpeg->v_scale[!!ci]].v_idct(block,
1876 idct_cols);
1876 idct_tbl[p_jpeg->h_scale[!!ci]].h_idct(block, b_out, 1877 idct_tbl[p_jpeg->h_scale[!!ci]].h_idct(block, b_out,
1877 idct_rows, b_width); 1878 idct_rows, b_width);
1878 } 1879 }
@@ -1932,6 +1933,8 @@ int read_jpeg_file(const char* filename,
1932 int fd, ret; 1933 int fd, ret;
1933 fd = open(filename, O_RDONLY); 1934 fd = open(filename, O_RDONLY);
1934 1935
1936 JDEBUGF("read_jpeg_file: filename: %s buffer len: %d cformat: %p\n",
1937 filename, maxsize, cformat);
1935 /* Exit if file opening failed */ 1938 /* Exit if file opening failed */
1936 if (fd < 0) { 1939 if (fd < 0) {
1937 DEBUGF("read_jpeg_file: can't open '%s', rc: %d\n", filename, fd); 1940 DEBUGF("read_jpeg_file: can't open '%s', rc: %d\n", filename, fd);
@@ -2008,6 +2011,10 @@ int read_jpeg_fd(int fd,
2008 p_jpeg->fd = fd; 2011 p_jpeg->fd = fd;
2009#endif 2012#endif
2010 status = process_markers(p_jpeg); 2013 status = process_markers(p_jpeg);
2014#ifndef JPEG_FROM_MEM
2015 JDEBUGF("position in file: %d buffer fill: %d\n",
2016 (int)lseek(p_jpeg->fd, 0, SEEK_CUR), p_jpeg->buf_left);
2017#endif
2011 if (status < 0) 2018 if (status < 0)
2012 return status; 2019 return status;
2013 if ((status & (DQT | SOF0)) != (DQT | SOF0)) 2020 if ((status & (DQT | SOF0)) != (DQT | SOF0))
@@ -2036,6 +2043,8 @@ int read_jpeg_fd(int fd,
2036 } 2043 }
2037 p_jpeg->h_scale[0] = calc_scale(p_jpeg->x_size, bm->width); 2044 p_jpeg->h_scale[0] = calc_scale(p_jpeg->x_size, bm->width);
2038 p_jpeg->v_scale[0] = calc_scale(p_jpeg->y_size, bm->height); 2045 p_jpeg->v_scale[0] = calc_scale(p_jpeg->y_size, bm->height);
2046 JDEBUGF("luma IDCT size: %dx%d\n", 1 << p_jpeg->h_scale[0],
2047 1 << p_jpeg->v_scale[0]);
2039 if ((p_jpeg->x_size << p_jpeg->h_scale[0]) >> 3 == bm->width && 2048 if ((p_jpeg->x_size << p_jpeg->h_scale[0]) >> 3 == bm->width &&
2040 (p_jpeg->y_size << p_jpeg->v_scale[0]) >> 3 == bm->height) 2049 (p_jpeg->y_size << p_jpeg->v_scale[0]) >> 3 == bm->height)
2041 resize = false; 2050 resize = false;
@@ -2044,7 +2053,13 @@ int read_jpeg_fd(int fd,
2044 p_jpeg->frameheader[0].horizontal_sampling - 1; 2053 p_jpeg->frameheader[0].horizontal_sampling - 1;
2045 p_jpeg->v_scale[1] = p_jpeg->v_scale[0] + 2054 p_jpeg->v_scale[1] = p_jpeg->v_scale[0] +
2046 p_jpeg->frameheader[0].vertical_sampling - 1; 2055 p_jpeg->frameheader[0].vertical_sampling - 1;
2056 JDEBUGF("chroma IDCT size: %dx%d\n", 1 << p_jpeg->h_scale[1],
2057 1 << p_jpeg->v_scale[1]);
2047#endif 2058#endif
2059 JDEBUGF("scaling from %dx%d -> %dx%d\n",
2060 (p_jpeg->x_size << p_jpeg->h_scale[0]) >> 3,
2061 (p_jpeg->y_size << p_jpeg->v_scale[0]) >> 3,
2062 bm->width, bm->height);
2048 fix_quant_tables(p_jpeg); 2063 fix_quant_tables(p_jpeg);
2049 int decode_w = (1 << p_jpeg->h_scale[0]) - 1; 2064 int decode_w = (1 << p_jpeg->h_scale[0]) - 1;
2050 int decode_h = (1 << p_jpeg->v_scale[0]) - 1; 2065 int decode_h = (1 << p_jpeg->v_scale[0]) - 1;
@@ -2052,11 +2067,13 @@ int read_jpeg_fd(int fd,
2052 src_dim.height = (p_jpeg->y_size << p_jpeg->v_scale[0]) >> 3; 2067 src_dim.height = (p_jpeg->y_size << p_jpeg->v_scale[0]) >> 3;
2053 p_jpeg->zero_need[0] = (decode_h << 3) + decode_w; 2068 p_jpeg->zero_need[0] = (decode_h << 3) + decode_w;
2054 p_jpeg->k_need[0] = zig[p_jpeg->zero_need[0]]; 2069 p_jpeg->k_need[0] = zig[p_jpeg->zero_need[0]];
2070 JDEBUGF("need luma components to %d\n", p_jpeg->k_need[0]);
2055#ifdef HAVE_LCD_COLOR 2071#ifdef HAVE_LCD_COLOR
2056 decode_w = (1 << MIN(p_jpeg->h_scale[1],3)) - 1; 2072 decode_w = (1 << MIN(p_jpeg->h_scale[1],3)) - 1;
2057 decode_h = (1 << MIN(p_jpeg->v_scale[1],3)) - 1; 2073 decode_h = (1 << MIN(p_jpeg->v_scale[1],3)) - 1;
2058 p_jpeg->zero_need[1] = (decode_h << 3) + decode_w; 2074 p_jpeg->zero_need[1] = (decode_h << 3) + decode_w;
2059 p_jpeg->k_need[1] = zig[p_jpeg->zero_need[1]]; 2075 p_jpeg->k_need[1] = zig[p_jpeg->zero_need[1]];
2076 JDEBUGF("need chroma components to %d\n", p_jpeg->k_need[1]);
2060#endif 2077#endif
2061 if (cformat) 2078 if (cformat)
2062 bm_size = cformat->get_size(bm); 2079 bm_size = cformat->get_size(bm);
@@ -2087,6 +2104,7 @@ int read_jpeg_fd(int fd,
2087 p_jpeg->frameheader[0].vertical_sampling - 2; 2104 p_jpeg->frameheader[0].vertical_sampling - 2;
2088#endif 2105#endif
2089 decode_buf_size *= JPEG_PIX_SZ; 2106 decode_buf_size *= JPEG_PIX_SZ;
2107 JDEBUGF("decode buffer size: %d\n", decode_buf_size);
2090 p_jpeg->img_buf = (jpeg_pix_t *)buf_start; 2108 p_jpeg->img_buf = (jpeg_pix_t *)buf_start;
2091 if (buf_end - buf_start < decode_buf_size) 2109 if (buf_end - buf_start < decode_buf_size)
2092 return -1; 2110 return -1;