]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Avoid huge array for rgb ljpeg on the stack.
authormichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 2 Nov 2009 14:12:25 +0000 (14:12 +0000)
committermichael <michael@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 2 Nov 2009 14:12:25 +0000 (14:12 +0000)
Code tested with an ljpeg i had laying around.

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20433 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavcodec/mjpegdec.c
libavcodec/mjpegdec.h

index d1d933fa86911419ec7663be609a7cd1bdb041da..812d69bd06db068ddec93d96e6f76493773398b0 100644 (file)
@@ -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){
     int i, mb_x, mb_y;
-    uint16_t buffer[32768][4];
+    uint16_t (*buffer)[4];
     int left[3], top[3], topleft[3];
     const int linesize= s->linesize[0];
     const int mask= (1<<s->bits)-1;
 
-    if((unsigned)s->mb_width > 32768) //dynamic alloc
-        return -1;
+    av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
+    buffer= s->ljpeg_buffer;
 
     for(i=0; i<3; i++){
         buffer[0][i]= 1 << (s->bits + point_transform - 1);
@@ -1504,6 +1504,8 @@ av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
 
     av_free(s->buffer);
     av_free(s->qscale_table);
+    av_freep(&s->ljpeg_buffer);
+    s->ljpeg_buffer_size=0;
 
     for(i=0;i<2;i++) {
         for(j=0;j<4;j++)
index d7a33b8c4f7163d70d3cebd389d032a3076eae46..71773fb32e451dddd7937a4dded9a03405dc8a78 100644 (file)
@@ -102,6 +102,9 @@ typedef struct MJpegDecodeContext {
 
     int cur_scan; /* current scan, used by JPEG-LS */
     int flipped; /* true if picture is flipped */
+
+    uint16_t (*ljpeg_buffer)[4];
+    unsigned int ljpeg_buffer_size;
 } MJpegDecodeContext;
 
 int ff_mjpeg_decode_init(AVCodecContext *avctx);