static unsafe uint calc_rice_params(RiceContext rc, int pmin, int pmax, int* data, uint n, uint pred_order, int bps) { uint* udata = stackalloc uint[(int)n]; ulong* sums = stackalloc ulong[(pmax + 1) * Flake.MAX_PARTITIONS]; int* parm = stackalloc int[(pmax + 1) * Flake.MAX_PARTITIONS]; //uint* bits = stackalloc uint[Flake.MAX_PARTITION_ORDER]; //assert(pmin >= 0 && pmin <= Flake.MAX_PARTITION_ORDER); //assert(pmax >= 0 && pmax <= Flake.MAX_PARTITION_ORDER); //assert(pmin <= pmax); for (uint i = 0; i < n; i++) udata[i] = (uint) ((data[i] << 1) ^ (data[i] >> 31)); // sums for highest level if ((n >> pmax) == 18) calc_sums18(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); else if ((n >> pmax) == 16) calc_sums16(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); else calc_sums(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); // sums for lower levels calc_lower_sums(pmin, pmax, sums); uint opt_bits = AudioSamples.UINT32_MAX; int opt_porder = pmin; int opt_method = 0; for (int i = pmin; i <= pmax; i++) { int method = bps > 16 ? 1 : 0; uint bits = calc_optimal_rice_params(i, parm + i * Flake.MAX_PARTITIONS, sums + i * Flake.MAX_PARTITIONS, n, pred_order, ref method); if (bits <= opt_bits) { opt_bits = bits; opt_porder = i; opt_method = method; } } rc.porder = opt_porder; rc.coding_method = opt_method; fixed (int* rparms = rc.rparams) AudioSamples.MemCpy(rparms, parm + opt_porder * Flake.MAX_PARTITIONS, (1 << opt_porder)); return opt_bits; }
static unsafe uint calc_rice_params(RiceContext rc, int pmin, int pmax, int* data, uint n, uint pred_order, int bps) { uint* udata = stackalloc uint[(int)n]; ulong* sums = stackalloc ulong[(pmax + 1) * Flake.MAX_PARTITIONS]; //assert(pmin >= 0 && pmin <= Flake.MAX_PARTITION_ORDER); //assert(pmax >= 0 && pmax <= Flake.MAX_PARTITION_ORDER); //assert(pmin <= pmax); for (uint i = 0; i < n; i++) udata[i] = (uint)((data[i] << 1) ^ (data[i] >> 31)); // sums for highest level if ((n >> pmax) == 18) calc_sums18(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); else if ((n >> pmax) == 16) calc_sums16(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); else calc_sums(pmin, pmax, udata, n, pred_order, sums + pmax * Flake.MAX_PARTITIONS); return calc_rice_params_sums(rc, pmin, pmax, sums, n, pred_order, bps); }
public FlacSubframe() { rc = new RiceContext(); coefs = new int[lpc.MAX_LPC_ORDER]; }
static unsafe uint calc_rice_params_sums(RiceContext rc, int pmin, int pmax, ulong* sums, uint n, uint pred_order, int bps) { int* parm = stackalloc int[(pmax + 1) * Flake.MAX_PARTITIONS]; //uint* bits = stackalloc uint[Flake.MAX_PARTITION_ORDER]; //assert(pmin >= 0 && pmin <= Flake.MAX_PARTITION_ORDER); //assert(pmax >= 0 && pmax <= Flake.MAX_PARTITION_ORDER); //assert(pmin <= pmax); // sums for lower levels calc_lower_sums(pmin, pmax, sums); uint opt_bits = AudioSamples.UINT32_MAX; int opt_porder = pmin; int opt_method = 0; for (int i = pmin; i <= pmax; i++) { int method = bps > 16 ? 1 : 0; uint bits = calc_optimal_rice_params(i, parm + i * Flake.MAX_PARTITIONS, sums + i * Flake.MAX_PARTITIONS, n, pred_order, ref method); if (bits <= opt_bits) { opt_bits = bits; opt_porder = i; opt_method = method; } } rc.porder = opt_porder; rc.coding_method = opt_method; fixed (int* rparms = rc.rparams) AudioSamples.MemCpy(rparms, parm + opt_porder * Flake.MAX_PARTITIONS, (1 << opt_porder)); return opt_bits; }