static void adaptive_quantization(MpegEncContext *s, double q){

    int i;

    const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);

    const float dark_masking= s->avctx->dark_masking / (128.0*128.0);

    const float temp_cplx_masking= s->avctx->temporal_cplx_masking;

    const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;

    const float p_masking = s->avctx->p_masking;

    float bits_sum= 0.0;

    float cplx_sum= 0.0;

    float cplx_tab[s->mb_num];

    float bits_tab[s->mb_num];

    const int qmin= 2; //s->avctx->mb_qmin;

    const int qmax= 31; //s->avctx->mb_qmax;

    Picture * const pic= &s->current_picture;

    

    for(i=0; i<s->mb_num; i++){

        float temp_cplx= sqrt(pic->mc_mb_var[i]);

        float spat_cplx= sqrt(pic->mb_var[i]);

        const int lumi= pic->mb_mean[i];

        float bits, cplx, factor;

        

        if(spat_cplx < q/3) spat_cplx= q/3; //FIXME finetune

        if(temp_cplx < q/3) temp_cplx= q/3; //FIXME finetune

        

        if((s->mb_type[i]&MB_TYPE_INTRA)){//FIXME hq mode 

            cplx= spat_cplx;

            factor= 1.0 + p_masking;

        }else{

            cplx= temp_cplx;

            factor= pow(temp_cplx, - temp_cplx_masking);

        }

        factor*=pow(spat_cplx, - spatial_cplx_masking);



        if(lumi>127)

            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);

        else

            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);

        

        if(factor<0.00001) factor= 0.00001;

        

        bits= cplx*factor;

        cplx_sum+= cplx;

        bits_sum+= bits;

        cplx_tab[i]= cplx;

        bits_tab[i]= bits;

    }



    /* handle qmin/qmax cliping */

    if(s->flags&CODEC_FLAG_NORMALIZE_AQP){

        for(i=0; i<s->mb_num; i++){

            float newq= q*cplx_tab[i]/bits_tab[i];

            newq*= bits_sum/cplx_sum;



            if     (newq > qmax){

                bits_sum -= bits_tab[i];

                cplx_sum -= cplx_tab[i]*q/qmax;

            }

            else if(newq < qmin){

                bits_sum -= bits_tab[i];

                cplx_sum -= cplx_tab[i]*q/qmin;

            }

        }

    }

   

    for(i=0; i<s->mb_num; i++){

        float newq= q*cplx_tab[i]/bits_tab[i];

        int intq;



        if(s->flags&CODEC_FLAG_NORMALIZE_AQP){

            newq*= bits_sum/cplx_sum;

        }



        if(i && ABS(pic->qscale_table[i-1] - newq)<0.75)

            intq= pic->qscale_table[i-1];

        else

            intq= (int)(newq + 0.5);



        if     (intq > qmax) intq= qmax;

        else if(intq < qmin) intq= qmin;

//if(i%s->mb_width==0) printf("\n");

//printf("%2d%3d ", intq, ff_sqrt(s->mc_mb_var[i]));

        pic->qscale_table[i]= intq;

    }

}

static void adaptive_quantization(MpegEncContext *s, double q){

    int i;

    const float lumi_masking= s->avctx->lumi_masking / (128.0*128.0);

    const float dark_masking= s->avctx->dark_masking / (128.0*128.0);

    const float temp_cplx_masking= s->avctx->temporal_cplx_masking;

    const float spatial_cplx_masking = s->avctx->spatial_cplx_masking;

    const float p_masking = s->avctx->p_masking;

    float bits_sum= 0.0;

    float cplx_sum= 0.0;

    float cplx_tab[s->mb_num];

    float bits_tab[s->mb_num];

    const int qmin= 2; 

    const int qmax= 31; 

    Picture * const pic= &s->current_picture;

    

    for(i=0; i<s->mb_num; i++){

        float temp_cplx= sqrt(pic->mc_mb_var[i]);

        float spat_cplx= sqrt(pic->mb_var[i]);

        const int lumi= pic->mb_mean[i];

        float bits, cplx, factor;

        

        if(spat_cplx < q/3) spat_cplx= q/3; 

        if(temp_cplx < q/3) temp_cplx= q/3; 

        

        if((s->mb_type[i]&MB_TYPE_INTRA)){

            cplx= spat_cplx;

            factor= 1.0 + p_masking;

        }else{

            cplx= temp_cplx;

            factor= pow(temp_cplx, - temp_cplx_masking);

        }

        factor*=pow(spat_cplx, - spatial_cplx_masking);



        if(lumi>127)

            factor*= (1.0 - (lumi-128)*(lumi-128)*lumi_masking);

        else

            factor*= (1.0 - (lumi-128)*(lumi-128)*dark_masking);

        

        if(factor<0.00001) factor= 0.00001;

        

        bits= cplx*factor;

        cplx_sum+= cplx;

        bits_sum+= bits;

        cplx_tab[i]= cplx;

        bits_tab[i]= bits;

    }



    

    if(s->flags&CODEC_FLAG_NORMALIZE_AQP){

        for(i=0; i<s->mb_num; i++){

            float newq= q*cplx_tab[i]/bits_tab[i];

            newq*= bits_sum/cplx_sum;



            if     (newq > qmax){

                bits_sum -= bits_tab[i];

                cplx_sum -= cplx_tab[i]*q/qmax;

            }

            else if(newq < qmin){

                bits_sum -= bits_tab[i];

                cplx_sum -= cplx_tab[i]*q/qmin;

            }

        }

    }

   

    for(i=0; i<s->mb_num; i++){

        float newq= q*cplx_tab[i]/bits_tab[i];

        int intq;



        if(s->flags&CODEC_FLAG_NORMALIZE_AQP){

            newq*= bits_sum/cplx_sum;

        }



        if(i && ABS(pic->qscale_table[i-1] - newq)<0.75)

            intq= pic->qscale_table[i-1];

        else

            intq= (int)(newq + 0.5);



        if     (intq > qmax) intq= qmax;

        else if(intq < qmin) intq= qmin;





        pic->qscale_table[i]= intq;

    }

}

static void FUNC_0(MpegEncContext *VAR_0, double VAR_1){

    int VAR_2;

    const float VAR_3= VAR_0->avctx->VAR_3 / (128.0*128.0);

    const float VAR_4= VAR_0->avctx->VAR_4 / (128.0*128.0);

    const float VAR_5= VAR_0->avctx->temporal_cplx_masking;

    const float VAR_6 = VAR_0->avctx->VAR_6;

    const float VAR_7 = VAR_0->avctx->VAR_7;

    float VAR_8= 0.0;

    float VAR_9= 0.0;

    float VAR_10[VAR_0->mb_num];

    float VAR_11[VAR_0->mb_num];

    const int VAR_12= 2; 

    const int VAR_13= 31; 

    Picture * const pic= &VAR_0->current_picture;

    

    for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){

        float temp_cplx= sqrt(pic->mc_mb_var[VAR_2]);

        float spat_cplx= sqrt(pic->mb_var[VAR_2]);

        const int lumi= pic->mb_mean[VAR_2];

        float bits, cplx, factor;

        

        if(spat_cplx < VAR_1/3) spat_cplx= VAR_1/3; 

        if(temp_cplx < VAR_1/3) temp_cplx= VAR_1/3; 

        

        if((VAR_0->mb_type[VAR_2]&MB_TYPE_INTRA)){

            cplx= spat_cplx;

            factor= 1.0 + VAR_7;

        }else{

            cplx= temp_cplx;

            factor= pow(temp_cplx, - VAR_5);

        }

        factor*=pow(spat_cplx, - VAR_6);



        if(lumi>127)

            factor*= (1.0 - (lumi-128)*(lumi-128)*VAR_3);

        else

            factor*= (1.0 - (lumi-128)*(lumi-128)*VAR_4);

        

        if(factor<0.00001) factor= 0.00001;

        

        bits= cplx*factor;

        VAR_9+= cplx;

        VAR_8+= bits;

        VAR_10[VAR_2]= cplx;

        VAR_11[VAR_2]= bits;

    }



    

    if(VAR_0->flags&CODEC_FLAG_NORMALIZE_AQP){

        for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){

            float newq= VAR_1*VAR_10[VAR_2]/VAR_11[VAR_2];

            newq*= VAR_8/VAR_9;



            if     (newq > VAR_13){

                VAR_8 -= VAR_11[VAR_2];

                VAR_9 -= VAR_10[VAR_2]*VAR_1/VAR_13;

            }

            else if(newq < VAR_12){

                VAR_8 -= VAR_11[VAR_2];

                VAR_9 -= VAR_10[VAR_2]*VAR_1/VAR_12;

            }

        }

    }

   

    for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){

        float newq= VAR_1*VAR_10[VAR_2]/VAR_11[VAR_2];

        int intq;



        if(VAR_0->flags&CODEC_FLAG_NORMALIZE_AQP){

            newq*= VAR_8/VAR_9;

        }



        if(VAR_2 && ABS(pic->qscale_table[VAR_2-1] - newq)<0.75)

            intq= pic->qscale_table[VAR_2-1];

        else

            intq= (int)(newq + 0.5);



        if     (intq > VAR_13) intq= VAR_13;

        else if(intq < VAR_12) intq= VAR_12;





        pic->qscale_table[VAR_2]= intq;

    }

}

static void FUNC_0(MpegEncContext *VAR_0, double VAR_1){ int VAR_2; const float VAR_3= VAR_0->avctx->VAR_3 / (128.0*128.0); const float VAR_4= VAR_0->avctx->VAR_4 / (128.0*128.0); const float VAR_5= VAR_0->avctx->temporal_cplx_masking; const float VAR_6 = VAR_0->avctx->VAR_6; const float VAR_7 = VAR_0->avctx->VAR_7; float VAR_8= 0.0; float VAR_9= 0.0; float VAR_10[VAR_0->mb_num]; float VAR_11[VAR_0->mb_num]; const int VAR_12= 2; const int VAR_13= 31; Picture * const pic= &VAR_0->current_picture; for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){ float temp_cplx= sqrt(pic->mc_mb_var[VAR_2]); float spat_cplx= sqrt(pic->mb_var[VAR_2]); const int lumi= pic->mb_mean[VAR_2]; float bits, cplx, factor; if(spat_cplx < VAR_1/3) spat_cplx= VAR_1/3; if(temp_cplx < VAR_1/3) temp_cplx= VAR_1/3; if((VAR_0->mb_type[VAR_2]&MB_TYPE_INTRA)){ cplx= spat_cplx; factor= 1.0 + VAR_7; }else{ cplx= temp_cplx; factor= pow(temp_cplx, - VAR_5); } factor*=pow(spat_cplx, - VAR_6); if(lumi>127)
factor*= (1.0 - (lumi-128)*(lumi-128)*VAR_3); else
factor*= (1.0 - (lumi-128)*(lumi-128)*VAR_4); if(factor<0.00001) factor= 0.00001; bits= cplx*factor; VAR_9+= cplx; VAR_8+= bits; VAR_10[VAR_2]= cplx; VAR_11[VAR_2]= bits; } if(VAR_0->flags&CODEC_FLAG_NORMALIZE_AQP){ for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){ float newq= VAR_1*VAR_10[VAR_2]/VAR_11[VAR_2]; newq*= VAR_8/VAR_9; if     (newq > VAR_13){ VAR_8 -= VAR_11[VAR_2]; VAR_9 -= VAR_10[VAR_2]*VAR_1/VAR_13; } else if(newq < VAR_12){ VAR_8 -= VAR_11[VAR_2]; VAR_9 -= VAR_10[VAR_2]*VAR_1/VAR_12; } } } for(VAR_2=0; VAR_2<VAR_0->mb_num; VAR_2++){ float newq= VAR_1*VAR_10[VAR_2]/VAR_11[VAR_2]; int intq; if(VAR_0->flags&CODEC_FLAG_NORMALIZE_AQP){ newq*= VAR_8/VAR_9; } if(VAR_2 && ABS(pic->qscale_table[VAR_2-1] - newq)<0.75)
intq= pic->qscale_table[VAR_2-1]; else
intq= (int)(newq + 0.5); if     (intq > VAR_13) intq= VAR_13; else if(intq < VAR_12) intq= VAR_12; pic->qscale_table[VAR_2]= intq; } }