static av_always_inline void decode_line(FFV1Context *s, int w, int_fast16_t *sample[2], int plane_index, int bits){

    PlaneContext * const p= &s->plane[plane_index];

    RangeCoder * const c= &s->c;

    int x;

    int run_count=0;

    int run_mode=0;

    int run_index= s->run_index;



    for(x=0; x<w; x++){

        int diff, context, sign;



        context= get_context(s, sample[1] + x, sample[0] + x, sample[1] + x);

        if(context < 0){

            context= -context;

            sign=1;

        }else

            sign=0;






        if(s->ac){

            diff= get_symbol_inline(c, p->state[context], 1);

        }else{

            if(context == 0 && run_mode==0) run_mode=1;



            if(run_mode){

                if(run_count==0 && run_mode==1){

                    if(get_bits1(&s->gb)){

                        run_count = 1<<ff_log2_run[run_index];

                        if(x + run_count <= w) run_index++;

                    }else{

                        if(ff_log2_run[run_index]) run_count = get_bits(&s->gb, ff_log2_run[run_index]);

                        else run_count=0;

                        if(run_index) run_index--;

                        run_mode=2;

                    }

                }

                run_count--;

                if(run_count < 0){

                    run_mode=0;

                    run_count=0;

                    diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);

                    if(diff>=0) diff++;

                }else

                    diff=0;

            }else

                diff= get_vlc_symbol(&s->gb, &p->vlc_state[context], bits);



//            printf("count:%d index:%d, mode:%d, x:%d y:%d pos:%d\n", run_count, run_index, run_mode, x, y, get_bits_count(&s->gb));

        }



        if(sign) diff= -diff;



        sample[1][x]= (predict(sample[1] + x, sample[0] + x) + diff) & ((1<<bits)-1);

    }

    s->run_index= run_index;

}