Commit ad9feac9 authored by Michael Niedermayer's avatar Michael Niedermayer

Avoid huge array for rgb ljpeg on the stack.

Code tested with an ljpeg i had laying around.

Originally committed as revision 20433 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent e47ca4f7
...@@ -616,13 +616,13 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_ ...@@ -616,13 +616,13 @@ static int decode_block_refinement(MJpegDecodeContext *s, DCTELEM *block, uint8_
static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){ static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
int i, mb_x, mb_y; int i, mb_x, mb_y;
uint16_t buffer[32768][4]; uint16_t (*buffer)[4];
int left[3], top[3], topleft[3]; int left[3], top[3], topleft[3];
const int linesize= s->linesize[0]; const int linesize= s->linesize[0];
const int mask= (1<<s->bits)-1; const int mask= (1<<s->bits)-1;
if((unsigned)s->mb_width > 32768) //dynamic alloc av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
return -1; buffer= s->ljpeg_buffer;
for(i=0; i<3; i++){ for(i=0; i<3; i++){
buffer[0][i]= 1 << (s->bits + point_transform - 1); buffer[0][i]= 1 << (s->bits + point_transform - 1);
...@@ -1504,6 +1504,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx) ...@@ -1504,6 +1504,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
av_free(s->buffer); av_free(s->buffer);
av_free(s->qscale_table); av_free(s->qscale_table);
av_freep(&s->ljpeg_buffer);
s->ljpeg_buffer_size=0;
for(i=0;i<2;i++) { for(i=0;i<2;i++) {
for(j=0;j<4;j++) for(j=0;j<4;j++)
......
...@@ -102,6 +102,9 @@ typedef struct MJpegDecodeContext { ...@@ -102,6 +102,9 @@ typedef struct MJpegDecodeContext {
int cur_scan; /* current scan, used by JPEG-LS */ int cur_scan; /* current scan, used by JPEG-LS */
int flipped; /* true if picture is flipped */ int flipped; /* true if picture is flipped */
uint16_t (*ljpeg_buffer)[4];
unsigned int ljpeg_buffer_size;
} MJpegDecodeContext; } MJpegDecodeContext;
int ff_mjpeg_decode_init(AVCodecContext *avctx); int ff_mjpeg_decode_init(AVCodecContext *avctx);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment