Mercurial > libavcodec.hg
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 } |