Skip to content
Snippets Groups Projects
Commit ad9feac9 authored by Michael Niedermayer's avatar Michael Niedermayer
Browse files

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
No related branches found
No related tags found
No related merge requests found
...@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment