public FlacResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order) { FlacEntropyCoding codingMethod = (FlacEntropyCoding)reader.ReadBits(FlacConstant.ENTROPY_CODING_METHOD_TYPE_LEN); // 2 Bit int riceOrder = -1; if (codingMethod == FlacEntropyCoding.PartitionedRice || codingMethod == FlacEntropyCoding.PartitionedRice2) { riceOrder = (int)reader.ReadBits(FlacConstant.ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN); // 4 Bit FlacPartitionedRice rice = new FlacPartitionedRice(riceOrder, codingMethod, data.Content); if (rice.ProcessResidual(reader, header, data, order) == false) { throw new FlacException("Decoding Flac Residual failed.", FlacLayer.SubFrame); } CodingMethod = codingMethod; RiceOrder = riceOrder; Rice = rice; } else { throw new FlacException("Not supported RICE-Coding-Method. Stream unparseable!", FlacLayer.SubFrame); } }
public FlacResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order) { FlacEntropyCoding codingMethod = (FlacEntropyCoding)reader.ReadBits(FlacConstant.EntropyCodingMethodTypeLen); // 2 Bit if (codingMethod == FlacEntropyCoding.PartitionedRice || codingMethod == FlacEntropyCoding.PartitionedRice2) { int riceOrder = (int)reader.ReadBits(FlacConstant.EntropyCodingMethodPartitionedRiceOrderLen); FlacPartitionedRice rice = new FlacPartitionedRice(riceOrder, codingMethod, data.Content); if (rice.ProcessResidual(reader, header, data, order) == false) { throw new FlacException("Decoding Flac Residual failed.", FlacLayer.SubFrame); } #if DEBUG CodingMethod = codingMethod; RiceOrder = riceOrder; Rice = rice; #endif } else { throw new FlacException("Not supported RICE-Coding-Method. Stream unparseable!", FlacLayer.SubFrame); } }
public FlacSubFrameConstant(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps) : base(header) { Value = (int)reader.ReadBits(bps); unsafe { for (int i = 0; i < header.BlockSize; i++) { int* ptr = data.destBuffer; *ptr++ = Value; } } }
public FlacSubFrameConstant(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps) : base(header) { Value = (int)reader.ReadBits(bps); unsafe { for (int i = 0; i < header.BlockSize; i++) { int *ptr = data.destBuffer; * ptr++ = Value; } } }
public FlacSubFrameVerbatim(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps) : base(header) { unsafe { int *ptrDest = data.DestBuffer, ptrResidual = data.ResidualBuffer; for (int i = 0; i < header.BlockSize; i++) { int x = (int)reader.ReadBits(bps); * ptrDest++ = x; * ptrResidual++ = x; } } }
public FlacSubFrameVerbatim(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bps) : base(header) { unsafe { int* ptrDest = data.DestBuffer, ptrResidual = data.ResidualBuffer; for (int i = 0; i < header.BlockSize; i++) { int x = (int)reader.ReadBits(bps); *ptrDest++ = x; *ptrResidual++ = x; } } }
public FlacSubFrameConstant(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bitsPerSample) : base(header) { int value = (int)reader.ReadBits(bitsPerSample); #if FLAC_DEBUG Value = value; #endif unsafe { int* pDestinationBuffer = data.DestinationBuffer; for (int i = 0; i < header.BlockSize; i++) { *pDestinationBuffer++ = value; } } }
public FlacSubFrameConstant(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int bitsPerSample) : base(header) { int value = (int)reader.ReadBits(bitsPerSample); #if FLAC_DEBUG Value = value; #endif unsafe { int *pDestinationBuffer = data.DestinationBuffer; for (int i = 0; i < header.BlockSize; i++) { *pDestinationBuffer++ = value; } } }
public static unsafe void ProcessResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order, int partitionOrder, FlacResidualCodingMethod codingMethod) { data.Content.UpdateSize(partitionOrder); bool isRice2 = codingMethod == FlacResidualCodingMethod.PartitionedRice2; int riceParameterLength = isRice2 ? 5 : 4; int escapeCode = isRice2 ? 31 : 15; //11111 : 1111 int samplesPerPartition; int partitionCount = 1 << partitionOrder; //2^partitionOrder -> There will be 2^order partitions. -> "order" = partitionOrder in this case int* residualBuffer = data.ResidualBuffer + order; for (int p = 0; p < partitionCount; p++) { if (partitionOrder == 0) samplesPerPartition = header.BlockSize - order; else if (p > 0) samplesPerPartition = header.BlockSize >> partitionOrder; else samplesPerPartition = (header.BlockSize >> partitionOrder) - order; var riceParameter = reader.ReadBits(riceParameterLength); data.Content.Parameters[p] = (int)riceParameter; if (riceParameter >= escapeCode) { var raw = reader.ReadBits(5); //raw is always 5 bits (see ...(+5)) data.Content.RawBits[p] = (int)raw; for (int i = 0; i < samplesPerPartition; i++) { int sample = reader.ReadBitsSigned((int)raw); *(residualBuffer) = sample; residualBuffer++; } } else { ReadFlacRiceBlock(reader, samplesPerPartition, (int)riceParameter, residualBuffer); residualBuffer += samplesPerPartition; } } }
public FlacResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order) { FlacResidualCodingMethod codingMethod = (FlacResidualCodingMethod)reader.ReadBits(2); // 2 Bit if (codingMethod == FlacResidualCodingMethod.PartitionedRice || codingMethod == FlacResidualCodingMethod.PartitionedRice2) { int partitionOrder = (int)reader.ReadBits(4); //"Partition order." see https://xiph.org/flac/format.html#partitioned_rice and https://xiph.org/flac/format.html#partitioned_rice2 FlacPartitionedRice.ProcessResidual(reader, header, data, order, partitionOrder, codingMethod); #if FLAC_DEBUG CodingMethodMethod = codingMethod; PartitionOrder = partitionOrder; #endif } else { throw new FlacException("Not supported RICE-Coding-Method. Stream unparseable!", FlacLayer.SubFrame); } }
public static unsafe void ProcessResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order, int partitionOrder, FlacResidualCodingMethod codingMethod) { data.Content.UpdateSize(partitionOrder); bool isRice2 = codingMethod == FlacResidualCodingMethod.PartitionedRice2; int riceParameterLength = isRice2 ? 5 : 4; int escapeCode = isRice2 ? 31 : 15; //11111 : 1111 int samplesPerPartition; int partitionCount = 1 << partitionOrder; //2^partitionOrder -> There will be 2^order partitions. -> "order" = partitionOrder in this case int *residualBuffer = data.ResidualBuffer + order; for (int p = 0; p < partitionCount; p++) { if (partitionOrder == 0) { samplesPerPartition = header.BlockSize - order; } else if (p > 0) { samplesPerPartition = header.BlockSize >> partitionOrder; } else { samplesPerPartition = (header.BlockSize >> partitionOrder) - order; } var riceParameter = reader.ReadBits(riceParameterLength); data.Content.Parameters[p] = (int)riceParameter; if (riceParameter >= escapeCode) { var raw = reader.ReadBits(5); //raw is always 5 bits (see ...(+5)) data.Content.RawBits[p] = (int)raw; for (int i = 0; i < samplesPerPartition; i++) { int sample = reader.ReadBitsSigned((int)raw); *(residualBuffer) = sample; residualBuffer++; } } else { ReadFlacRiceBlock(reader, samplesPerPartition, (int)riceParameter, residualBuffer); residualBuffer += samplesPerPartition; } } }