Mercurial > libavcodec.hg
comparison ffv1.c @ 11965:3dbbf18d4905 libavcodec
ffv1: remove VLAs
author | mru |
---|---|
date | Sat, 26 Jun 2010 15:53:25 +0000 |
parents | 1acf2841dc5f |
children |
comparison
equal
deleted
inserted
replaced
11964:f092b80c0da2 | 11965:3dbbf18d4905 |
---|---|
235 PlaneContext plane[MAX_PLANES]; | 235 PlaneContext plane[MAX_PLANES]; |
236 int16_t quant_table[5][256]; | 236 int16_t quant_table[5][256]; |
237 uint8_t state_transition[256]; | 237 uint8_t state_transition[256]; |
238 int run_index; | 238 int run_index; |
239 int colorspace; | 239 int colorspace; |
240 int_fast16_t *sample_buffer; | |
240 | 241 |
241 DSPContext dsp; | 242 DSPContext dsp; |
242 }FFV1Context; | 243 }FFV1Context; |
243 | 244 |
244 static av_always_inline int fold(int diff, int bits){ | 245 static av_always_inline int fold(int diff, int bits){ |
507 } | 508 } |
508 | 509 |
509 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | 510 static void encode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ |
510 int x,y,i; | 511 int x,y,i; |
511 const int ring_size= s->avctx->context_model ? 3 : 2; | 512 const int ring_size= s->avctx->context_model ? 3 : 2; |
512 int_fast16_t sample_buffer[ring_size][w+6], *sample[ring_size]; | 513 int_fast16_t *sample[3]; |
513 s->run_index=0; | 514 s->run_index=0; |
514 | 515 |
515 memset(sample_buffer, 0, sizeof(sample_buffer)); | 516 memset(s->sample_buffer, 0, ring_size*(w+6)*sizeof(*s->sample_buffer)); |
516 | 517 |
517 for(y=0; y<h; y++){ | 518 for(y=0; y<h; y++){ |
518 for(i=0; i<ring_size; i++) | 519 for(i=0; i<ring_size; i++) |
519 sample[i]= sample_buffer[(h+i-y)%ring_size]+3; | 520 sample[i]= s->sample_buffer + (w+6)*((h+i-y)%ring_size) + 3; |
520 | 521 |
521 sample[0][-1]= sample[1][0 ]; | 522 sample[0][-1]= sample[1][0 ]; |
522 sample[1][ w]= sample[1][w-1]; | 523 sample[1][ w]= sample[1][w-1]; |
523 //{START_TIMER | 524 //{START_TIMER |
524 if(s->avctx->bits_per_raw_sample<=8){ | 525 if(s->avctx->bits_per_raw_sample<=8){ |
537 } | 538 } |
538 | 539 |
539 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | 540 static void encode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ |
540 int x, y, p, i; | 541 int x, y, p, i; |
541 const int ring_size= s->avctx->context_model ? 3 : 2; | 542 const int ring_size= s->avctx->context_model ? 3 : 2; |
542 int_fast16_t sample_buffer[3][ring_size][w+6], *sample[3][ring_size]; | 543 int_fast16_t *sample[3][3]; |
543 s->run_index=0; | 544 s->run_index=0; |
544 | 545 |
545 memset(sample_buffer, 0, sizeof(sample_buffer)); | 546 memset(s->sample_buffer, 0, ring_size*3*(w+6)*sizeof(*s->sample_buffer)); |
546 | 547 |
547 for(y=0; y<h; y++){ | 548 for(y=0; y<h; y++){ |
548 for(i=0; i<ring_size; i++) | 549 for(i=0; i<ring_size; i++) |
549 for(p=0; p<3; p++) | 550 for(p=0; p<3; p++) |
550 sample[p][i]= sample_buffer[p][(h+i-y)%ring_size]+3; | 551 sample[p][i]= s->sample_buffer + p*ring_size*(w+6) + ((h+i-y)%ring_size)*(w+6) + 3; |
551 | 552 |
552 for(x=0; x<w; x++){ | 553 for(x=0; x<w; x++){ |
553 int v= src[x + stride*y]; | 554 int v= src[x + stride*y]; |
554 int b= v&0xFF; | 555 int b= v&0xFF; |
555 int g= (v>>8)&0xFF; | 556 int g= (v>>8)&0xFF; |
628 | 629 |
629 s->width = avctx->width; | 630 s->width = avctx->width; |
630 s->height= avctx->height; | 631 s->height= avctx->height; |
631 | 632 |
632 assert(s->width && s->height); | 633 assert(s->width && s->height); |
634 | |
635 s->sample_buffer = av_malloc(6 * (s->width+6) * sizeof(*s->sample_buffer)); | |
636 if (!s->sample_buffer) | |
637 return AVERROR(ENOMEM); | |
633 | 638 |
634 return 0; | 639 return 0; |
635 } | 640 } |
636 | 641 |
637 #if CONFIG_FFV1_ENCODER | 642 #if CONFIG_FFV1_ENCODER |
820 PlaneContext *p= &s->plane[i]; | 825 PlaneContext *p= &s->plane[i]; |
821 | 826 |
822 av_freep(&p->state); | 827 av_freep(&p->state); |
823 av_freep(&p->vlc_state); | 828 av_freep(&p->vlc_state); |
824 } | 829 } |
830 | |
831 av_freep(&s->sample_buffer); | |
825 | 832 |
826 return 0; | 833 return 0; |
827 } | 834 } |
828 | 835 |
829 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ | 836 static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){ |
883 s->run_index= run_index; | 890 s->run_index= run_index; |
884 } | 891 } |
885 | 892 |
886 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ | 893 static void decode_plane(FFV1Context *s, uint8_t *src, int w, int h, int stride, int plane_index){ |
887 int x, y; | 894 int x, y; |
888 int_fast16_t sample_buffer[2][w+6]; | |
889 int_fast16_t *sample[2]; | 895 int_fast16_t *sample[2]; |
890 sample[0]=sample_buffer[0]+3; | 896 sample[0]=s->sample_buffer +3; |
891 sample[1]=sample_buffer[1]+3; | 897 sample[1]=s->sample_buffer+w+6+3; |
892 | 898 |
893 s->run_index=0; | 899 s->run_index=0; |
894 | 900 |
895 memset(sample_buffer, 0, sizeof(sample_buffer)); | 901 memset(s->sample_buffer, 0, 2*(w+6)*sizeof(*s->sample_buffer)); |
896 | 902 |
897 for(y=0; y<h; y++){ | 903 for(y=0; y<h; y++){ |
898 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer | 904 int_fast16_t *temp= sample[0]; //FIXME try a normal buffer |
899 | 905 |
900 sample[0]= sample[1]; | 906 sample[0]= sample[1]; |
919 } | 925 } |
920 } | 926 } |
921 | 927 |
922 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ | 928 static void decode_rgb_frame(FFV1Context *s, uint32_t *src, int w, int h, int stride){ |
923 int x, y, p; | 929 int x, y, p; |
924 int_fast16_t sample_buffer[3][2][w+6]; | |
925 int_fast16_t *sample[3][2]; | 930 int_fast16_t *sample[3][2]; |
926 for(x=0; x<3; x++){ | 931 for(x=0; x<3; x++){ |
927 sample[x][0] = sample_buffer[x][0]+3; | 932 sample[x][0] = s->sample_buffer + x*2 *(w+6) + 3; |
928 sample[x][1] = sample_buffer[x][1]+3; | 933 sample[x][1] = s->sample_buffer + (x*2+1)*(w+6) + 3; |
929 } | 934 } |
930 | 935 |
931 s->run_index=0; | 936 s->run_index=0; |
932 | 937 |
933 memset(sample_buffer, 0, sizeof(sample_buffer)); | 938 memset(s->sample_buffer, 0, 6*(w+6)*sizeof(*s->sample_buffer)); |
934 | 939 |
935 for(y=0; y<h; y++){ | 940 for(y=0; y<h; y++){ |
936 for(p=0; p<3; p++){ | 941 for(p=0; p<3; p++){ |
937 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer | 942 int_fast16_t *temp= sample[p][0]; //FIXME try a normal buffer |
938 | 943 |