START_TIMER
static inline void decode_subband(SnowContext *s, SubBand *b, DWTELEM *src, DWTELEM *parent, int stride, int orientation){    const int level= b->level;    const int w= b->width;    const int h= b->height;    int x,y;    const int qlog= clip(s->qlog + b->qlog, 0, 128);    int qmul= qexp[qlog&7]<<(qlog>>3);    int qadd= (s->qbias*qmul)>>QBIAS_SHIFT;        if(b->buf == s->spatial_dwt_buffer || s->qlog == LOSSLESS_QLOG){        qadd= 0;        qmul= 1<<QEXPSHIFT;    }    START_TIMER    if(1){        int run;        int index=0;        int prev_index=-1;        int prev2_index=0;        int parent_index= 0;        int prev_parent_index= 0;                for(y=0; y<b->height; y++)            memset(&src[y*stride], 0, b->width*sizeof(DWTELEM));        run= get_symbol2(&s->c, b->state[1], 3);        for(y=0; y<h; y++){            int v=0;            int lt=0, t=0, rt=0;            if(y && b->x[prev_index] == 0){                rt= b->coeff[prev_index];            }            for(x=0; x<w; x++){                int p=0;                const int l= v;                                lt= t; t= rt;                if(y){                    if(b->x[prev_index] <= x)                        prev_index++;                    if(b->x[prev_index] == x + 1)                        rt= b->coeff[prev_index];                    else                        rt=0;                }                if(parent){                    if(x>>1 > b->parent->x[parent_index]){                        parent_index++;                    }                    if(x>>1 == b->parent->x[parent_index]){                        p= b->parent->coeff[parent_index];                    }                }                if(/*ll|*/l|lt|t|rt|p){                    int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));                    v=get_cabac(&s->c, &b->state[0][context]);                }else{                    if(!run){                        run= get_symbol2(&s->c, b->state[1], 3);                        v=1;                    }else{                        run--;                        v=0;                        if(y && parent){                            int max_run;                            max_run= FFMIN(run, b->x[prev_index] - x - 2);                            max_run= FFMIN(max_run, 2*b->parent->x[parent_index] - x - 1);                            x+= max_run;                            run-= max_run;                        }                    }                }                if(v){                    int context= av_log2(/*ABS(ll) + */3*ABS(l) + ABS(lt) + 2*ABS(t) + ABS(rt) + ABS(p));                    v= get_symbol2(&s->c, b->state[context + 2], context-4) + 1;                    if(get_cabac(&s->c, &b->state[0][16 + 1 + 3 + quant3b[l&0xFF] + 3*quant3b[t&0xFF]])){                        src[x + y*stride]=-(( v*qmul + qadd)>>(QEXPSHIFT));                        v= -v;                    }else{                        src[x + y*stride]= (( v*qmul + qadd)>>(QEXPSHIFT));                    }                    b->x[index]=x; //FIXME interleave x/coeff                    b->coeff[index++]= v;                }            }            b->x[index++]= w+1; //end marker            prev_index= prev2_index;            prev2_index= index;                        if(parent){                while(b->parent->x[parent_index] != b->parent->width+1)                    parent_index++;                parent_index++;                if(y&1){                    prev_parent_index= parent_index;                }else{                    parent_index= prev_parent_index;                }            }        }        b->x[index++]= w+1; //end marker        if(w > 200 /*level+1 == s->spatial_decomposition_count*/){            STOP_TIMER("decode_subband")        }                return;    }}