static int decode_header(SnowContext *s){
    int plane_index;
    uint8_t kstate[32];
    memset(kstate, MID_STATE, sizeof(kstate));
    s->keyframe= get_rac(&s->c, kstate);
    if(s->keyframe || s->always_reset){
        reset_contexts(s);
        s->spatial_decomposition_type=
        s->qlog=
        s->qbias=
        s->mv_scale=
        s->block_max_depth= 0;
    }
    if(s->keyframe){
        s->version= get_symbol(&s->c, s->header_state, 0);
        if(s->version>0){
            av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);
            return -1;
        }
        s->always_reset= get_rac(&s->c, s->header_state);
        s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);
        s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);
        s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
        s->colorspace_type= get_symbol(&s->c, s->header_state, 0);
        s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);
        s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);
        s->spatial_scalability= get_rac(&s->c, s->header_state);
        s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1;
        decode_qlogs(s);
    }
    if(!s->keyframe){
        if(get_rac(&s->c, s->header_state)){
            for(plane_index=0; plane_index<2; plane_index++){
                int htaps, i, sum=0;
                Plane *p= &s->plane[plane_index];
                p->diag_mc= get_rac(&s->c, s->header_state);
                htaps= get_symbol(&s->c, s->header_state, 0)*2 + 2;
                if((unsigned)htaps > HTAPS_MAX || htaps==0)
                    return -1;
                p->htaps= htaps;
                for(i= htaps/2; i; i--){
                    p->hcoeff[i]= get_symbol(&s->c, s->header_state, 0) * (1-2*(i&1));
                    sum += p->hcoeff[i];
                }
                p->hcoeff[0]= 32-sum;
            }
            s->plane[2].diag_mc= s->plane[1].diag_mc;
            s->plane[2].htaps  = s->plane[1].htaps;
            memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff));
        }
        if(get_rac(&s->c, s->header_state)){
            s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);
            decode_qlogs(s);
        }
    }
    s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1);
    if(s->spatial_decomposition_type > 1){
        av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);
        return -1;
    }
    s->qlog           += get_symbol(&s->c, s->header_state, 1);
    s->mv_scale       += get_symbol(&s->c, s->header_state, 1);
    s->qbias          += get_symbol(&s->c, s->header_state, 1);
    s->block_max_depth+= get_symbol(&s->c, s->header_state, 1);
    if(s->block_max_depth > 1 || s->block_max_depth < 0){
        av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);
        s->block_max_depth= 0;
        return -1;
    }
    return 0;
}
['static int decode_header(SnowContext *s){\n    int plane_index;\n    uint8_t kstate[32];\n    memset(kstate, MID_STATE, sizeof(kstate));\n    s->keyframe= get_rac(&s->c, kstate);\n    if(s->keyframe || s->always_reset){\n        reset_contexts(s);\n        s->spatial_decomposition_type=\n        s->qlog=\n        s->qbias=\n        s->mv_scale=\n        s->block_max_depth= 0;\n    }\n    if(s->keyframe){\n        s->version= get_symbol(&s->c, s->header_state, 0);\n        if(s->version>0){\n            av_log(s->avctx, AV_LOG_ERROR, "version %d not supported", s->version);\n            return -1;\n        }\n        s->always_reset= get_rac(&s->c, s->header_state);\n        s->temporal_decomposition_type= get_symbol(&s->c, s->header_state, 0);\n        s->temporal_decomposition_count= get_symbol(&s->c, s->header_state, 0);\n        s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);\n        s->colorspace_type= get_symbol(&s->c, s->header_state, 0);\n        s->chroma_h_shift= get_symbol(&s->c, s->header_state, 0);\n        s->chroma_v_shift= get_symbol(&s->c, s->header_state, 0);\n        s->spatial_scalability= get_rac(&s->c, s->header_state);\n        s->max_ref_frames= get_symbol(&s->c, s->header_state, 0)+1;\n        decode_qlogs(s);\n    }\n    if(!s->keyframe){\n        if(get_rac(&s->c, s->header_state)){\n            for(plane_index=0; plane_index<2; plane_index++){\n                int htaps, i, sum=0;\n                Plane *p= &s->plane[plane_index];\n                p->diag_mc= get_rac(&s->c, s->header_state);\n                htaps= get_symbol(&s->c, s->header_state, 0)*2 + 2;\n                if((unsigned)htaps > HTAPS_MAX || htaps==0)\n                    return -1;\n                p->htaps= htaps;\n                for(i= htaps/2; i; i--){\n                    p->hcoeff[i]= get_symbol(&s->c, s->header_state, 0) * (1-2*(i&1));\n                    sum += p->hcoeff[i];\n                }\n                p->hcoeff[0]= 32-sum;\n            }\n            s->plane[2].diag_mc= s->plane[1].diag_mc;\n            s->plane[2].htaps  = s->plane[1].htaps;\n            memcpy(s->plane[2].hcoeff, s->plane[1].hcoeff, sizeof(s->plane[1].hcoeff));\n        }\n        if(get_rac(&s->c, s->header_state)){\n            s->spatial_decomposition_count= get_symbol(&s->c, s->header_state, 0);\n            decode_qlogs(s);\n        }\n    }\n    s->spatial_decomposition_type+= get_symbol(&s->c, s->header_state, 1);\n    if(s->spatial_decomposition_type > 1){\n        av_log(s->avctx, AV_LOG_ERROR, "spatial_decomposition_type %d not supported", s->spatial_decomposition_type);\n        return -1;\n    }\n    s->qlog           += get_symbol(&s->c, s->header_state, 1);\n    s->mv_scale       += get_symbol(&s->c, s->header_state, 1);\n    s->qbias          += get_symbol(&s->c, s->header_state, 1);\n    s->block_max_depth+= get_symbol(&s->c, s->header_state, 1);\n    if(s->block_max_depth > 1 || s->block_max_depth < 0){\n        av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large", s->block_max_depth);\n        s->block_max_depth= 0;\n        return -1;\n    }\n    return 0;\n}', 'static inline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed){\n    if(get_rac(c, state+0))\n        return 0;\n    else{\n        int i, e, a;\n        e= 0;\n        while(get_rac(c, state+1 + FFMIN(e,9))){\n            e++;\n        }\n        a= 1;\n        for(i=e-1; i>=0; i--){\n            a += a + get_rac(c, state+22 + FFMIN(i,9));\n        }\n        if(is_signed && get_rac(c, state+11 + FFMIN(e,10)))\n            return -a;\n        else\n            return a;\n    }\n}']