📄 vbrquantize.c
字号:
return checkScalefactor(cod_info, vbrsfmin);}/****************************************************************** * * long block scalefacs * ******************************************************************/static intlong_block_constrain(const algo_t * that, int vbrsf[SFBMAX], const int vbrsfmin[SFBMAX], int vbrmax){ gr_info *cod_info = that->cod_info; lame_internal_flags *gfc = that->gfc; const int *max_rangep; int const maxminsfb = that->mingain_l; int sfb; int maxover0, maxover1, maxover0p, maxover1p, mover, delta = 0; int v, v0, v1, v0p, v1p, vm0p = 1, vm1p = 1; int psymax = cod_info->psymax; max_rangep = gfc->mode_gr == 2 ? max_range_long : max_range_long_lsf_pretab; maxover0 = 0; maxover1 = 0; maxover0p = 0; /* pretab */ maxover1p = 0; /* pretab */ for (sfb = 0; sfb < psymax; ++sfb) { assert( vbrsf[sfb] >= vbrsfmin[sfb] ); v = vbrmax - vbrsf[sfb]; if (delta < v) { delta = v; } v0 = v - 2 * max_range_long[sfb]; v1 = v - 4 * max_range_long[sfb]; v0p = v - 2 * (max_rangep[sfb] + pretab[sfb]); v1p = v - 4 * (max_rangep[sfb] + pretab[sfb]); if (maxover0 < v0) { maxover0 = v0; } if (maxover1 < v1) { maxover1 = v1; } if (maxover0p < v0p) { maxover0p = v0p; } if (maxover1p < v1p) { maxover1p = v1p; } } if (vm0p == 1) { int gain = vbrmax - maxover0p; if (gain < maxminsfb) { gain = maxminsfb; } for (sfb = 0; sfb < psymax; ++sfb) { int a = (gain - vbrsfmin[sfb]) - 2 * pretab[sfb]; if (a <= 0) { vm0p = 0; vm1p = 0; break; } } } if (vm1p == 1) { int gain = vbrmax - maxover1p; if (gain < maxminsfb) { gain = maxminsfb; } for (sfb = 0; sfb < psymax; ++sfb) { int b = (gain - vbrsfmin[sfb]) - 4 * pretab[sfb]; if (b <= 0) { vm1p = 0; break; } } } if (vm0p == 0) { maxover0p = maxover0; } if (vm1p == 0) { maxover1p = maxover1; } if (gfc->noise_shaping != 2) { maxover1 = maxover0; maxover1p = maxover0p; } mover = Min(maxover0, maxover0p); mover = Min(mover, maxover1); mover = Min(mover, maxover1p); if (delta > mover) { delta = mover; } vbrmax -= delta; if (vbrmax < maxminsfb) { vbrmax = maxminsfb; } maxover0 -= mover; maxover0p -= mover; maxover1 -= mover; maxover1p -= mover; if (maxover0 == 0) { cod_info->scalefac_scale = 0; cod_info->preflag = 0; max_rangep = max_range_long; } else if (maxover0p == 0) { cod_info->scalefac_scale = 0; cod_info->preflag = 1; } else if (maxover1 == 0) { cod_info->scalefac_scale = 1; cod_info->preflag = 0; max_rangep = max_range_long; } else if (maxover1p == 0) { cod_info->scalefac_scale = 1; cod_info->preflag = 1; } else { assert(0); /* this should not happen */ } cod_info->global_gain = vbrmax; if (cod_info->global_gain < 0) { cod_info->global_gain = 0; } else if (cod_info->global_gain > 255) { cod_info->global_gain = 255; } for (sfb = 0; sfb < SFBMAX; ++sfb) { vbrsf[sfb] -= vbrmax; } set_scalefacs(cod_info, vbrsfmin, vbrsf, max_rangep); assert(checkScalefactor(cod_info, vbrsfmin)); return checkScalefactor(cod_info, vbrsfmin);}static intbitcount(const algo_t * that){ if (that->gfc->mode_gr == 2) { return scale_bitcount(that->cod_info); } else { return scale_bitcount_lsf(that->gfc, that->cod_info); }}static intquantizeAndCountBits(const algo_t * that){ that->quantize(that); that->cod_info->part2_3_length = noquant_count_bits(that->gfc, that->cod_info, 0); return that->cod_info->part2_3_length;}static inttryScalefacColor(const algo_t * that, int vbrsf[SFBMAX], const int vbrsf2[SFBMAX], const int vbrsfmin[SFBMAX], int I, int M, int target){ FLOAT xrpow_max = that->cod_info->xrpow_max; int i, nbits; int gain, vbrmax = 0; for (i = 0; i < SFBMAX; ++i) { gain = target + (vbrsf2[i] - target) * I / M; if (gain < vbrsfmin[i]) { gain = vbrsfmin[i]; } if (gain > 255) { gain = 255; } if (vbrmax < gain) { vbrmax = gain; } vbrsf[i] = gain; } if (!that->alloc(that, vbrsf, vbrsfmin, vbrmax)) { return LARGE_BITS; } bitcount(that); nbits = quantizeAndCountBits(that); that->cod_info->xrpow_max = xrpow_max; return nbits;}static voidsearchScalefacColorMax(const algo_t * that, int sfwork[SFBMAX], const int sfcalc[SFBMAX], const int vbrsfmin[SFBMAX], int bits){ int const psymax = that->cod_info->psymax; int nbits, last, i, ok = -1, l = 0, r, vbrmin = 255, vbrmax = 0, M, target; for (i = 0; i < psymax; ++i) { if (vbrmin > sfcalc[i]) { vbrmin = sfcalc[i]; } if (vbrmax < sfcalc[i]) { vbrmax = sfcalc[i]; } } M = vbrmax - vbrmin; if (M == 0) { return; } target = vbrmax; for (l = 0, r = M, last = i = M / 2; l <= r; i = (l + r) / 2) { nbits = tryScalefacColor(that, sfwork, sfcalc, vbrsfmin, i, M, target); if (nbits < bits) { ok = i; l = i + 1; } else { r = i - 1; } last = i; } if (last != ok) { if (ok == -1) { ok = 0; } nbits = tryScalefacColor(that, sfwork, sfcalc, vbrsfmin, ok, M, target); }}#if 0static voidsearchScalefacColorMin(const algo_t * that, int sfwork[SFBMAX], const int sfcalc[SFBMAX], const int vbrsfmin[SFBMAX], int bits){ int const psymax = that->cod_info->psymax; int nbits, last, i, ok = -1, l = 0, r, vbrmin = 255, vbrmax = 0, M, target; for (i = 0; i < psymax; ++i) { if (vbrmin > sfcalc[i]) { vbrmin = sfcalc[i]; } if (vbrmax < sfcalc[i]) { vbrmax = sfcalc[i]; } } M = vbrmax - vbrmin; if (M == 0) { return; } target = vbrmin; for (l = 0, r = M, last = i = M / 2; l <= r; i = (l + r) / 2) { nbits = tryScalefacColor(that, sfwork, sfcalc, vbrsfmin, i, M, target); if (nbits > bits) { ok = i; r = i - 1; } else { l = i + 1; } last = i; } if (last != ok) { if (ok == -1) { ok = 0; } nbits = tryScalefacColor(that, sfwork, sfcalc, vbrsfmin, ok, M, target); }}#endifstatic inttryGlobalStepsize(const algo_t * that, const int sfwork[SFBMAX], const int vbrsfmin[SFBMAX], int delta){ FLOAT xrpow_max = that->cod_info->xrpow_max; int sftemp[SFBMAX], i, nbits; int gain, vbrmax = 0; for (i = 0; i < SFBMAX; ++i) { gain = sfwork[i] + delta; if (gain < vbrsfmin[i]) { gain = vbrsfmin[i]; } if (gain > 255) { gain = 255; } if (vbrmax < gain) { vbrmax = gain; } sftemp[i] = gain; } if (!that->alloc(that, sftemp, vbrsfmin, vbrmax)) { return LARGE_BITS; } bitcount(that); nbits = quantizeAndCountBits(that); that->cod_info->xrpow_max = xrpow_max; return nbits;}static voidsearchGlobalStepsizeMax(const algo_t * that, const int sfwork[SFBMAX], const int vbrsfmin[SFBMAX], int target){ gr_info *cod_info = that->cod_info; const int gain = cod_info->global_gain; int curr = gain; int gain_ok = 1024; int nbits = LARGE_BITS; int l = gain, r = 512; assert(gain >= 0); while (l <= r) { curr = (l + r) >> 1; nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); if (cod_info->part2_length >= LARGE_BITS || nbits >= LARGE_BITS) { l = curr + 1; continue; } if (nbits + cod_info->part2_length < target) { r = curr - 1; gain_ok = curr; } else { l = curr + 1; if (gain_ok == 1024) { gain_ok = curr; } } } if (gain_ok != curr) { curr = gain_ok; nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); }}#if 0static voidsearchGlobalStepsizeMin(const algo_t * that, const int sfwork[SFBMAX], const int vbrsfmin[SFBMAX], int target){ gr_info *cod_info = that->cod_info; const int gain = cod_info->global_gain; int curr = gain; int gain_ok = 1024; int nbits = LARGE_BITS; int l = 0, r = gain; assert(gain >= 0); while (l <= r) { curr = (l + r) >> 1; nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); if (cod_info->part2_length >= LARGE_BITS || nbits >= LARGE_BITS) { l = curr + 1; continue; } if (nbits + cod_info->part2_length < target) { l = curr + 1; if (gain_ok == 1024) { gain_ok = curr; } } else { r = curr - 1; gain_ok = curr; } } if (gain_ok != curr) { curr = gain_ok; nbits = tryGlobalStepsize(that, sfwork, vbrsfmin, curr - gain); }}#endif/************************************************************************ * * VBR_noise_shaping() * * may result in a need of too many bits, then do it CBR like * * Robert Hegemann 2000-10-25 * ***********************************************************************/intVBR_noise_shaping(lame_internal_flags * gfc, const FLOAT xr34orig[576], const FLOAT l3_xmin[576], int maxbits, int gr, int ch){ int sfwork[SFBMAX]; int sfcalc[SFBMAX]; int vbrsfmin[SFBMAX]; algo_t that; int vbrmax; gr_info *cod_info = &gfc->l3_side.tt[gr][ch]; that.xr34orig = xr34orig; if (gfc->quantization) { that.find = find_scalefac_x34; that.quantize = quantize_x34; } else { that.find = find_scalefac_ISO; that.quantize = quantize_ISO; } if (cod_info->block_type == SHORT_TYPE) { that.alloc = short_block_constrain; } else { that.alloc = long_block_constrain; } that.gfc = gfc; that.cod_info = &gfc->l3_side.tt[gr][ch]; memset(cod_info->l3_enc, 0, 576 * sizeof(int)); vbrmax = block_sf(&that, l3_xmin, sfcalc, vbrsfmin); memcpy(sfwork, sfcalc, SFBMAX * sizeof(int)); that.alloc(&that, sfwork, vbrsfmin, vbrmax); if (0 != bitcount(&that)) { /* this should not happen due to the way the scalefactors are selected */ cod_info->part2_3_length = LARGE_BITS; return -1; } quantizeAndCountBits(&that); if (cod_info->part2_3_length > maxbits - cod_info->part2_length) { searchScalefacColorMax(&that, sfwork, sfcalc, vbrsfmin, maxbits); } if (cod_info->part2_3_length > maxbits - cod_info->part2_length) { searchGlobalStepsizeMax(&that, sfwork, vbrsfmin, maxbits); } if (gfc->use_best_huffman == 2) { best_huffman_divide(gfc, cod_info); } assert(cod_info->global_gain < 256u); if (cod_info->part2_3_length + cod_info->part2_length >= LARGE_BITS) { cod_info->part2_3_length = LARGE_BITS; return -2; /* Houston, we have a problem */ } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -