private IEnumerator <int> ReadResidualData(FlacBitStreamReader bitReader, int blockSize, int predictorOrder) { const byte RiceCodingWith4BitParameter = 0; const byte RiceCodingWith5BitParameter = 1; uint residualRiceParamSizeType = bitReader.ReadBits(2); int residualRiceParamSize; if (residualRiceParamSizeType == RiceCodingWith4BitParameter) { residualRiceParamSize = 4; } else if (residualRiceParamSizeType == RiceCodingWith5BitParameter) { residualRiceParamSize = 5; } else { throw new FlacException("Reserved residual coding method"); } // rice and rice2 almost the same // read rice partitined method int partitionOrder = (int)bitReader.ReadBits(4); int partitionCount = 1 << partitionOrder; int sampleCount = blockSize >> partitionOrder; if (sampleCount < predictorOrder || sampleCount < 1 || (sampleCount << partitionOrder) != blockSize) { throw new FlacException("Invalid partition order"); } for (int i = 0; i < partitionCount; i++) { int skipSamples = i == 0 ? predictorOrder : 0; int riceParameter = (int)bitReader.ReadBits(residualRiceParamSize); if (riceParameter + 1 == 1 << residualRiceParamSize) { // escape mode int bitsPerSample = (int)bitReader.ReadBits(5); for (int j = skipSamples; j < sampleCount; j++) { yield return(bitReader.ReadSignedBits(bitsPerSample)); } } else { int maxRiceK = int.MaxValue >> riceParameter; for (int j = skipSamples; j < sampleCount; j++) { yield return(bitReader.ReadRice(riceParameter)); } } } }
private IEnumerable <int> ReadValuesVerbatim(FlacBitStreamReader bitReader, int blockSize, int bitsPerSample) { for (int i = 0; i < blockSize; i++) { int value = bitReader.ReadSignedBits(bitsPerSample); yield return(value); } }
private IEnumerator<int> ReadResidualData(FlacBitStreamReader bitReader, int blockSize, int predictorOrder) { const byte RiceCodingWith4BitParameter = 0; const byte RiceCodingWith5BitParameter = 1; uint residualRiceParamSizeType = bitReader.ReadBits(2); int residualRiceParamSize; if (residualRiceParamSizeType == RiceCodingWith4BitParameter) residualRiceParamSize = 4; else if (residualRiceParamSizeType == RiceCodingWith5BitParameter) residualRiceParamSize = 5; else throw new FlacException("Reserved residual coding method"); // rice and rice2 almost the same // read rice partitined method int partitionOrder = (int)bitReader.ReadBits(4); int partitionCount = 1 << partitionOrder; int sampleCount = blockSize >> partitionOrder; if (sampleCount < predictorOrder || sampleCount < 1 || (sampleCount << partitionOrder) != blockSize ) throw new FlacException("Invalid partition order"); for (int i = 0; i < partitionCount; i++) { int skipSamples = i == 0 ? predictorOrder : 0; int riceParameter = (int)bitReader.ReadBits(residualRiceParamSize); if (riceParameter + 1 == 1 << residualRiceParamSize) { // escape mode int bitsPerSample = (int)bitReader.ReadBits(5); for (int j = skipSamples; j < sampleCount; j++) { yield return bitReader.ReadSignedBits(bitsPerSample); } } else { int maxRiceK = int.MaxValue >> riceParameter; for (int j = skipSamples; j < sampleCount; j++) { yield return bitReader.ReadRice(riceParameter); } } } }
private IEnumerable<int> ReadValuesVerbatim(FlacBitStreamReader bitReader, int blockSize, int bitsPerSample) { for (int i = 0; i < blockSize; i++) { int value = bitReader.ReadSignedBits(bitsPerSample); yield return value; } }
private void PrepareConstantSubframe(int subframeBitsPerSample) { int sample = bitReader.ReadSignedBits(subframeBitsPerSample); dataSource = GetNValues(sample, BlockSize); }