/** * Also counts the number of bits to encode the scalefacs but for MPEG 2 Lower sampling * frequencies (24, 22.05 and 16 kHz.) * * <p>This is reverse-engineered from section 2.4.3.2 of the MPEG2 IS, "Audio Decoding Layer III" */ public boolean scale_bitcount_lsf(final LameInternalFlags gfc, final GrInfo cod_info) { int table_number, row_in_table, partition, nr_sfb, window; boolean over; int i, sfb, max_sfac[] = new int[4]; final int[] partition_table; final int[] scalefac = cod_info.scalefac; /* * Set partition table. Note that should try to use table one, but do * not yet... */ if (cod_info.preflag != 0) table_number = 2; else table_number = 0; for (i = 0; i < 4; i++) max_sfac[i] = 0; if (cod_info.block_type == Encoder.SHORT_TYPE) { row_in_table = 1; partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table]; for (sfb = 0, partition = 0; partition < 4; partition++) { nr_sfb = partition_table[partition] / 3; for (i = 0; i < nr_sfb; i++, sfb++) for (window = 0; window < 3; window++) if (scalefac[sfb * 3 + window] > max_sfac[partition]) max_sfac[partition] = scalefac[sfb * 3 + window]; } } else { row_in_table = 0; partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table]; for (sfb = 0, partition = 0; partition < 4; partition++) { nr_sfb = partition_table[partition]; for (i = 0; i < nr_sfb; i++, sfb++) if (scalefac[sfb] > max_sfac[partition]) max_sfac[partition] = scalefac[sfb]; } } for (over = false, partition = 0; partition < 4; partition++) { if (max_sfac[partition] > max_range_sfac_tab[table_number][partition]) over = true; } if (!over) { int slen1, slen2, slen3, slen4; cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table]; for (partition = 0; partition < 4; partition++) cod_info.slen[partition] = log2tab[max_sfac[partition]]; /* set scalefac_compress */ slen1 = cod_info.slen[0]; slen2 = cod_info.slen[1]; slen3 = cod_info.slen[2]; slen4 = cod_info.slen[3]; switch (table_number) { case 0: cod_info.scalefac_compress = (((slen1 * 5) + slen2) << 4) + (slen3 << 2) + slen4; break; case 1: cod_info.scalefac_compress = 400 + (((slen1 * 5) + slen2) << 2) + slen3; break; case 2: cod_info.scalefac_compress = 500 + (slen1 * 3) + slen2; break; default: System.err.printf("intensity stereo not implemented yet\n"); break; } } if (!over) { assert (cod_info.sfb_partition_table != null); cod_info.part2_length = 0; for (partition = 0; partition < 4; partition++) cod_info.part2_length += cod_info.slen[partition] * cod_info.sfb_partition_table[partition]; } return over; }