public unsafe FlacSubFrameLPC(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps, int order) : base(header) { //warmup _warmup = new int[FlacConstant.MAX_LPC_ORDER]; for (int i = 0; i < order; i++) { _warmup[i] = data.residualBuffer[i] = reader.ReadBitsSigned(bps); } //header int u32 = (int)reader.ReadBits(FlacConstant.SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN); if (u32 == (1 << FlacConstant.SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { Debug.WriteLine("Invalid FlacLPC qlp coeff precision."); return; //return false; } _qlpCoeffPrecision = u32 + 1; int level = reader.ReadBitsSigned(FlacConstant.SUBFRAME_LPC_QLP_SHIFT_LEN); if (level < 0) throw new Exception("negative shift"); _lpcShiftNeeded = level; _qlpCoeffs = new int[FlacConstant.MAX_LPC_ORDER]; //qlp coeffs for (int i = 0; i < order; i++) { _qlpCoeffs[i] = reader.ReadBitsSigned(_qlpCoeffPrecision); } //QLPCoeffs = coeffs; Residual = new FlacResidual(reader, header, data, order); for (int i = 0; i < order; i++) { data.destBuffer[i] = data.residualBuffer[i]; } if (bps + _qlpCoeffPrecision + CSMath.ILog(order) <= 32) { if (bps <= 16 && _qlpCoeffPrecision <= 16) RestoreLPCSignal(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order); //Restore(data.residualBuffer + order, data.destBuffer, Header.BlockSize - order, order, order); else RestoreLPCSignal(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order); } else { RestoreLPCSignalWide(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order);//RestoreWide(data.residualBuffer + order, data.destBuffer, Header.BlockSize - order, order, order); } //Warmup = warmup; }
public unsafe FlacSubFrameFixed(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps, int order) : base(header) { for (int i = 0; i < order; i++) { data.residualBuffer[i] = data.destBuffer[i] = reader.ReadBitsSigned(bps); } Residual = new FlacResidual(reader, header, data, order); RestoreSignal(data, header.BlockSize - order, order); }
public unsafe FlacSubFrameLPC(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bitsPerSample, int order) : base(header) { var warmup = new int[order]; for (int i = 0; i < order; i++) { warmup[i] = data.ResidualBuffer[i] = reader.ReadBitsSigned(bitsPerSample); } int coefPrecision = (int)reader.ReadBits(4) + 1; if (coefPrecision == 0x0F) { Debug.WriteLine("Invalid linear predictor coefficients' precision. Must not be 0x0F."); return; } int shiftNeeded = reader.ReadBitsSigned(5); if (shiftNeeded < 0) throw new FlacException("\"Quantized linear predictor coefficient shift needed.\" was negative.", FlacLayer.SubFrame); var q = new int[order]; for (int i = 0; i < order; i++) { q[i] = reader.ReadBitsSigned(coefPrecision); } //decode the residual var residual = new FlacResidual(reader, header, data, order); for (int i = 0; i < order; i++) { data.DestinationBuffer[i] = data.ResidualBuffer[i]; } int* residualBuffer0 = data.ResidualBuffer + order; int* destinationBuffer0 = data.DestinationBuffer + order; int blockSizeToProcess = header.BlockSize - order; if (bitsPerSample + coefPrecision + Log2(order) <= 32) { RestoreLPCSignal32(residualBuffer0, destinationBuffer0, blockSizeToProcess, order, q, shiftNeeded); } else { RestoreLPCSignal64(residualBuffer0, destinationBuffer0, blockSizeToProcess, order, q, shiftNeeded); } #if FLAC_DEBUG QLPCoeffPrecision = coefPrecision; LPCShiftNeeded = shiftNeeded; Warmup = warmup; Residual = residual; QLPCoeffs = q; #endif }
public unsafe FlacSubFrameFixed(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bitsPerSample, int order) : base(header) { for (int i = 0; i < order; i++) //order = predictor order { data.ResidualBuffer[i] = data.DestinationBuffer[i] = reader.ReadBitsSigned(bitsPerSample); } var residual = new FlacResidual(reader, header, data, order); //necessary for decoding RestoreSignal(data, header.BlockSize - order, order); #if FLAC_DEBUG Residual = residual; #endif }
public unsafe FlacSubFrameLPC(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bitsPerSample, int order) : base(header) { var warmup = new int[order]; for (int i = 0; i < order; i++) { warmup[i] = data.ResidualBuffer[i] = reader.ReadBitsSigned(bitsPerSample); } int coefPrecision = (int)reader.ReadBits(4); if (coefPrecision == 0x0F) { throw new FlacException("Invalid \"quantized linear predictor coefficients' precision in bits\" was invalid. Must not be 0x0F.", FlacLayer.SubFrame); } coefPrecision += 1; int shiftNeeded = reader.ReadBitsSigned(5); if (shiftNeeded < 0) { throw new FlacException("'\"Quantized linear predictor coefficient shift needed in bits\" was negative.", FlacLayer.SubFrame); } var q = new int[order]; for (int i = 0; i < order; i++) { q[i] = reader.ReadBitsSigned(coefPrecision); } //decode the residual var residual = new FlacResidual(reader, header, data, order); for (int i = 0; i < order; i++) { data.DestinationBuffer[i] = data.ResidualBuffer[i]; } int *residualBuffer0 = data.ResidualBuffer + order; int *destinationBuffer0 = data.DestinationBuffer + order; int blockSizeToProcess = header.BlockSize - order; if (bitsPerSample + coefPrecision + Log2(order) <= 32) { RestoreLPCSignal32(residualBuffer0, destinationBuffer0, blockSizeToProcess, order, q, shiftNeeded); } else { RestoreLPCSignal64(residualBuffer0, destinationBuffer0, blockSizeToProcess, order, q, shiftNeeded); } #if FLAC_DEBUG QLPCoeffPrecision = coefPrecision; LPCShiftNeeded = shiftNeeded; Warmup = warmup; Residual = residual; QLPCoeffs = q; #endif }
public unsafe FlacSubFrameLPC(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps, int order) : base(header) { //warmup _warmup = new int[FlacConstant.MAX_LPC_ORDER]; for (int i = 0; i < order; i++) { _warmup[i] = data.residualBuffer[i] = reader.ReadBitsSigned(bps); } //header int u32 = (int)reader.ReadBits(FlacConstant.SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN); if (u32 == (1 << FlacConstant.SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { Debug.WriteLine("Invalid FlacLPC qlp coeff precision."); return; //return false; } _qlpCoeffPrecision = u32 + 1; int level = reader.ReadBitsSigned(FlacConstant.SUBFRAME_LPC_QLP_SHIFT_LEN); if (level < 0) { throw new Exception("negative shift"); } _lpcShiftNeeded = level; _qlpCoeffs = new int[FlacConstant.MAX_LPC_ORDER]; //qlp coeffs for (int i = 0; i < order; i++) { _qlpCoeffs[i] = reader.ReadBitsSigned(_qlpCoeffPrecision); } //QLPCoeffs = coeffs; Residual = new FlacResidual(reader, header, data, order); for (int i = 0; i < order; i++) { data.destBuffer[i] = data.residualBuffer[i]; } if (bps + _qlpCoeffPrecision + CSMath.ILog(order) <= 32) { if (bps <= 16 && _qlpCoeffPrecision <= 16) { RestoreLPCSignal(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order); //Restore(data.residualBuffer + order, data.destBuffer, Header.BlockSize - order, order, order); } else { RestoreLPCSignal(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order); } } else { RestoreLPCSignalWide(data.residualBuffer + order, data.destBuffer + order, header.BlockSize - order, order);//RestoreWide(data.residualBuffer + order, data.destBuffer, Header.BlockSize - order, order, order); } //Warmup = warmup; }