internal static void quant_energy_finalise(CeltMode m, int start, int end, int[][] oldEBands, int[][] error, int[] fine_quant, int[] fine_priority, int bits_left, EntropyCoder enc, int C) { int i, prio, c; /* Use up the remaining bits */ for (prio = 0; prio < 2; prio++) { for (i = start; i < end && bits_left >= C; i++) { if (fine_quant[i] >= CeltConstants.MAX_FINE_BITS || fine_priority[i] != prio) { continue; } c = 0; do { int q2; int offset; q2 = error[c][i] < 0 ? 0 : 1; enc.enc_bits((uint)q2, 1); offset = Inlines.SHR16((Inlines.SHL16((q2), CeltConstants.DB_SHIFT) - ((short)(0.5 + (.5f) * (((int)1) << (CeltConstants.DB_SHIFT)))) /*Inlines.QCONST16(.5f, CeltConstants.DB_SHIFT)*/), fine_quant[i] + 1); oldEBands[c][i] += offset; bits_left--; } while (++c < C); } } }
internal static void quant_fine_energy(CeltMode m, int start, int end, int[][] oldEBands, int[][] error, int[] fine_quant, EntropyCoder enc, int C) { int i, c; /* Encode finer resolution */ for (i = start; i < end; i++) { int frac = (1 << fine_quant[i]); if (fine_quant[i] <= 0) { continue; } c = 0; do { int q2; int offset; /* Has to be without rounding */ q2 = (error[c][i] + ((short)(0.5 + (.5f) * (((int)1) << (CeltConstants.DB_SHIFT)))) /*Inlines.QCONST16(.5f, CeltConstants.DB_SHIFT)*/) >> (CeltConstants.DB_SHIFT - fine_quant[i]); if (q2 > frac - 1) { q2 = frac - 1; } if (q2 < 0) { q2 = 0; } enc.enc_bits((uint)q2, (uint)fine_quant[i]); offset = Inlines.SUB16( (Inlines.SHR32( Inlines.SHL32(q2, CeltConstants.DB_SHIFT) + ((short)(0.5 + (.5f) * (((int)1) << (CeltConstants.DB_SHIFT)))) /*Inlines.QCONST16(.5f, CeltConstants.DB_SHIFT)*/, fine_quant[i])), ((short)(0.5 + (.5f) * (((int)1) << (CeltConstants.DB_SHIFT)))) /*Inlines.QCONST16(.5f, CeltConstants.DB_SHIFT)*/); oldEBands[c][i] += offset; error[c][i] -= offset; } while (++c < C); } }