comparison mjpegdec.c @ 10487:3e404d2520a7 libavcodec

Avoid huge array for rgb ljpeg on the stack. Code tested with an ljpeg i had laying around.
author michael
date Mon, 02 Nov 2009 14:12:25 +0000
parents 710e226783f0
children 8d8fcc20dd30
comparison
equal deleted inserted replaced
10486:b2524430a456 10487:3e404d2520a7
614 #undef REFINE_BIT 614 #undef REFINE_BIT
615 #undef ZERO_RUN 615 #undef ZERO_RUN
616 616
617 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){ 617 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
618 int i, mb_x, mb_y; 618 int i, mb_x, mb_y;
619 uint16_t buffer[32768][4]; 619 uint16_t (*buffer)[4];
620 int left[3], top[3], topleft[3]; 620 int left[3], top[3], topleft[3];
621 const int linesize= s->linesize[0]; 621 const int linesize= s->linesize[0];
622 const int mask= (1<<s->bits)-1; 622 const int mask= (1<<s->bits)-1;
623 623
624 if((unsigned)s->mb_width > 32768) //dynamic alloc 624 av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size, (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
625 return -1; 625 buffer= s->ljpeg_buffer;
626 626
627 for(i=0; i<3; i++){ 627 for(i=0; i<3; i++){
628 buffer[0][i]= 1 << (s->bits + point_transform - 1); 628 buffer[0][i]= 1 << (s->bits + point_transform - 1);
629 } 629 }
630 for(mb_y = 0; mb_y < s->mb_height; mb_y++) { 630 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1502 if (s->picture.data[0]) 1502 if (s->picture.data[0])
1503 avctx->release_buffer(avctx, &s->picture); 1503 avctx->release_buffer(avctx, &s->picture);
1504 1504
1505 av_free(s->buffer); 1505 av_free(s->buffer);
1506 av_free(s->qscale_table); 1506 av_free(s->qscale_table);
1507 av_freep(&s->ljpeg_buffer);
1508 s->ljpeg_buffer_size=0;
1507 1509
1508 for(i=0;i<2;i++) { 1510 for(i=0;i<2;i++) {
1509 for(j=0;j<4;j++) 1511 for(j=0;j<4;j++)
1510 free_vlc(&s->vlcs[i][j]); 1512 free_vlc(&s->vlcs[i][j]);
1511 } 1513 }