private void WriteSubframe(FlacBitStreamWriter bitWriter, FlacMethodAndDataPair flacMethodAndDataPair) { bitWriter.WriteUnsigned(0, 1); int subframeType = flacMethodAndDataPair.Method.SubframeTypeCode; bitWriter.WriteUnsigned((uint)subframeType, 6); bitWriter.WriteUnsigned(0, 1); flacMethodAndDataPair.WriteData(bitWriter); }
internal void WriteResidual(FlacBitStreamWriter writer, IPredictor predictor, int predictorOrder, int[] samples) { int totalPartitions = 1 << Order; System.Diagnostics.Debug.Assert((samples.Length % totalPartitions) == 0 && (samples.Length / totalPartitions) > predictorOrder && RiceParameters.Length == totalPartitions); if (!IsExtended) { writer.WriteUnsigned(0, 2); } else { writer.WriteUnsigned(1, 2); } writer.WriteUnsigned((uint)Order, 4); int j = predictorOrder; int samplePerPartition = samples.Length / totalPartitions; int encodingParameterPrecision = IsExtended ? 5 : 4; IEnumerator <int> residualData = GetResidual(samples, predictorOrder, predictor); for (int i = 0; i < totalPartitions; i++) { if (RiceParameters[i] >= 0) { int riceParameter = RiceParameters[i]; writer.WriteUnsigned((uint)riceParameter, encodingParameterPrecision); while (j++ < samplePerPartition) { if (!residualData.MoveNext()) { throw new FlacException("Invalid amount of residual data"); } writer.WriteRice(residualData.Current, riceParameter); } } else // escaped { writer.WriteUnsigned(~0U, encodingParameterPrecision); int samplePrecision = ~RiceParameters[i]; writer.WriteUnsigned((uint)samplePrecision, 5); while (j++ < samplePerPartition) { if (!residualData.MoveNext()) { throw new FlacException("Invalid amount of residual data"); } writer.WriteSigned(residualData.Current, samplePrecision); } } j = 0; } }
internal override void WriteHeaderData(FlacBitStreamWriter writer, int bitsPerSample, int[] data) { System.Diagnostics.Debug.Assert(0 < Coefficients.CoefficientsPrecision && Coefficients.CoefficientsPrecision < 16); // samples for (int i = 0; i < Order; i++) { writer.WriteSigned(data[i], bitsPerSample); } writer.WriteUnsigned((uint)(Coefficients.CoefficientsPrecision - 1), 4); writer.WriteSigned(Coefficients.ResultShift, 5); for (int i = 0; i < Order; i++) { writer.WriteSigned(Coefficients.Coefficients[i], Coefficients.CoefficientsPrecision); } }
internal void WriteResidual(FlacBitStreamWriter writer, IPredictor predictor, int predictorOrder, int[] samples) { int totalPartitions = 1 << Order; System.Diagnostics.Debug.Assert((samples.Length % totalPartitions) == 0 && (samples.Length / totalPartitions) > predictorOrder && RiceParameters.Length == totalPartitions); if (!IsExtended) writer.WriteUnsigned(0, 2); else writer.WriteUnsigned(1, 2); writer.WriteUnsigned((uint)Order, 4); int j = predictorOrder; int samplePerPartition = samples.Length / totalPartitions; int encodingParameterPrecision = IsExtended ? 5 : 4; IEnumerator<int> residualData = GetResidual(samples, predictorOrder, predictor); for (int i = 0; i < totalPartitions; i++) { if (RiceParameters[i] >= 0) { int riceParameter = RiceParameters[i]; writer.WriteUnsigned((uint)riceParameter, encodingParameterPrecision); while (j++ < samplePerPartition) { if (!residualData.MoveNext()) throw new FlacException("Invalid amount of residual data"); writer.WriteRice(residualData.Current, riceParameter); } } else // escaped { writer.WriteUnsigned(~0U, encodingParameterPrecision); int samplePrecision = ~RiceParameters[i]; writer.WriteUnsigned((uint)samplePrecision, 5); while(j++ < samplePerPartition) { if (!residualData.MoveNext()) throw new FlacException("Invalid amount of residual data"); writer.WriteSigned(residualData.Current, samplePrecision); } } j = 0; } }