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