int oc_enc_quantize_c(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64], const ogg_uint16_t _dequant[64],const void *_enquant){ const oc_iquant *enquant; int nonzero; int zzi; int val; int d; int s; enquant=(const oc_iquant *)_enquant; nonzero=0; for(zzi=0;zzi<64;zzi++){ val=_dct[zzi]; d=_dequant[zzi]; val=val<<1; if(abs(val)>=d){ s=OC_SIGNMASK(val); /*The bias added here rounds ties away from zero, since token optimization can only decrease the magnitude of the quantized value.*/ val+=d+s^s; /*Note the arithmetic right shift is not guaranteed by ANSI C. Hopefully no one still uses ones-complement architectures.*/ val=((enquant[zzi].m*(ogg_int32_t)val>>16)+val>>enquant[zzi].l)-s; _qdct[zzi]=(ogg_int16_t)val; nonzero=zzi; } else _qdct[zzi]=0;
/*Search for the quantizer that matches the target most closely. We don't assume a linear ordering, but when there are ties we pick the quantizer closest to the old one.*/ static int oc_enc_find_qi_for_target(oc_enc_ctx *_enc,int _qti,int _qi_old, int _qi_min,ogg_int64_t _log_qtarget){ ogg_int64_t best_qdiff; int best_qi; int qi; best_qi=_qi_min; best_qdiff=_enc->log_qavg[_qti][best_qi]-_log_qtarget; best_qdiff=best_qdiff+OC_SIGNMASK(best_qdiff)^OC_SIGNMASK(best_qdiff); for(qi=_qi_min+1;qi<64;qi++){ ogg_int64_t qdiff; qdiff=_enc->log_qavg[_qti][qi]-_log_qtarget; qdiff=qdiff+OC_SIGNMASK(qdiff)^OC_SIGNMASK(qdiff); if(qdiff<best_qdiff|| qdiff==best_qdiff&&abs(qi-_qi_old)<abs(best_qi-_qi_old)){ best_qi=qi; best_qdiff=qdiff; } } return best_qi; }