CUETools.Codecs.FLAKE.FlakeWriter.calc_rice_params C# (CSharp) Method

calc_rice_params() static private method

static private calc_rice_params ( RiceContext rc, int pmin, int pmax, int data, uint n, uint pred_order, int bps ) : uint
rc RiceContext
pmin int
pmax int
data int
n uint
pred_order uint
bps int
return uint
		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;
		}