예제 #1
0
		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;
		}
예제 #2
0
        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);
        }
예제 #3
0
 public FlacSubframe()
 {
     rc    = new RiceContext();
     coefs = new int[lpc.MAX_LPC_ORDER];
 }
예제 #4
0
        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;
        }
예제 #5
0
 public FlacSubframe()
 {
     rc = new RiceContext();
     coefs = new int[lpc.MAX_LPC_ORDER];
 }