static int VBR_quantize_granule(lame_internal_flags * gfc, gr_info * cod_info, FLOAT8 * xr34, int gr, int ch) { int status; /* encode scalefacs */ if (gfc->is_mpeg1) status = scale_bitcount(&cod_info->scalefac, cod_info); else status = scale_bitcount_lsf(gfc, &cod_info->scalefac, cod_info); if (status != 0) { return -1; } /* quantize xr34 */ cod_info->part2_3_length = count_bits(gfc, cod_info->l3_enc, xr34, cod_info); if (cod_info->part2_3_length >= LARGE_BITS) return -2; cod_info->part2_3_length += cod_info->part2_length; if (gfc->use_best_huffman == 1) { best_huffman_divide(gfc, cod_info); } return 0; }
/* Find the optimal way to store the scalefactors. Only call this routine after final scalefactors have been chosen and the channel/granule will not be re-encoded. */ void best_scalefac_store( const lame_internal_flags *gfc, const int gr, const int ch, int l3_enc[2][2][576], III_side_info_t * const l3_side, III_scalefac_t scalefac[2][2] ) { /* use scalefac_scale if we can */ gr_info *gi = &l3_side->gr[gr].ch[ch].tt; int sfb,i,j,j2,l,start,end; /* remove scalefacs from bands with ix=0. This idea comes * from the AAC ISO docs. added mt 3/00 */ /* check if l3_enc=0 */ for ( sfb = 0; sfb < gi->sfb_lmax; sfb++ ) { if (scalefac[gr][ch].l[sfb]>0) { start = gfc->scalefac_band.l[ sfb ]; end = gfc->scalefac_band.l[ sfb+1 ]; for ( l = start; l < end; l++ ) if (l3_enc[gr][ch][l]!=0) break; if (l==end) scalefac[gr][ch].l[sfb]=0; } } for ( j=0, sfb = gi->sfb_smin; sfb < SBPSY_s; sfb++ ) { start = gfc->scalefac_band.s[ sfb ]; end = gfc->scalefac_band.s[ sfb+1 ]; for ( i = 0; i < 3; i++ ) { if (scalefac[gr][ch].s[sfb][i]>0) { j2 = j; for ( l = start; l < end; l++ ) if (l3_enc[gr][ch][j2++ /*3*l+i*/]!=0) break; if (l==end) scalefac[gr][ch].s[sfb][i]=0; } j += end-start; } } gi->part2_3_length -= gi->part2_length; if (!gi->scalefac_scale && !gi->preflag) { int b, s = 0; for (sfb = 0; sfb < gi->sfb_lmax; sfb++) { s |= scalefac[gr][ch].l[sfb]; } for (sfb = gi->sfb_smin; sfb < SBPSY_s; sfb++) { for (b = 0; b < 3; b++) { s |= scalefac[gr][ch].s[sfb][b]; } } if (!(s & 1) && s != 0) { for (sfb = 0; sfb < gi->sfb_lmax; sfb++) { scalefac[gr][ch].l[sfb] /= 2; } for (sfb = gi->sfb_smin; sfb < SBPSY_s; sfb++) { for (b = 0; b < 3; b++) { scalefac[gr][ch].s[sfb][b] /= 2; } } gi->scalefac_scale = 1; gi->part2_length = 99999999; if (gfc->mode_gr == 2) { scale_bitcount(&scalefac[gr][ch], gi); } else { scale_bitcount_lsf(gfc,&scalefac[gr][ch], gi); } } } for ( i = 0; i < 4; i++ ) l3_side->scfsi[ch][i] = 0; if (gfc->mode_gr==2 && gr == 1 && l3_side->gr[0].ch[ch].tt.block_type != SHORT_TYPE && l3_side->gr[1].ch[ch].tt.block_type != SHORT_TYPE) { scfsi_calc(ch, l3_side, scalefac); } gi->part2_3_length += gi->part2_length; }