예제 #1
0
 internal override void WriteData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     for (int i = 0; i < data.Length; i++)
     {
         writer.WriteSigned(data[i], bitsPerSample);
     }
 }
예제 #2
0
 internal override void WriteHeaderData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     // samples
     for (int i = 0; i < Order; i++)
     {
         writer.WriteSigned(data[i], bitsPerSample);
     }
 }
예제 #3
0
 internal override void WriteHeaderData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     // samples
     for (int i = 0; i < Order; i++)
     {
         writer.WriteSigned(data[i], bitsPerSample);
     }
 }
예제 #4
0
        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;
            }
        }
예제 #5
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);
            }
        }
예제 #6
0
        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;
            }
        }
예제 #7
0
 internal override void WriteData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     writer.WriteSigned(data[0], bitsPerSample);
 }
예제 #8
0
 internal override void WriteData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     for (int i = 0; i < data.Length; i++)
     {
         writer.WriteSigned(data[i], bitsPerSample);
     }
 }
예제 #9
0
 internal override void WriteData(FlacBitStreamWriter writer, int bitsPerSample, int[] data)
 {
     writer.WriteSigned(data[0], bitsPerSample);
 }
예제 #10
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);
            }
        }