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 unsafe bool ProcessResidual(FlacBitReader reader, FlacFrameHeader header, FlacSubFrameData data, int order) { data.Content.UpdateSize(PartitionOrder); int porder = PartitionOrder; FlacEntropyCoding codingMethod = CodingMethod; int psize = header.BlockSize >> porder; int resCnt = psize - order; int ricelength = 4 + (int)codingMethod; //4bit = RICE I | 5bit = RICE II //residual int j = order; int *r = data.ResidualBuffer + j; int partitioncount = 1 << porder; for (int p = 0; p < partitioncount; p++) { if (p == 1) { resCnt = psize; } int n = Math.Min(resCnt, header.BlockSize - j); int k = Content.Parameters[p] = (int)reader.ReadBits(ricelength); if (k == (1 << ricelength) - 1) { k = (int)reader.ReadBits(5); for (int i = n; i > 0; i--) { *(r) = reader.ReadBitsSigned((int)k); } } else { ReadFlacRiceBlock(reader, n, (int)k, r); r += n; } j += n; } return(true); }
public FlacPartitionedRice(int partitionOrder, FlacEntropyCoding codingMethod, FlacPartitionedRiceContent content) { PartitionOrder = partitionOrder; CodingMethod = codingMethod; Content = content; }