예제 #1
0
        public void Read(FlacStream stream, FrameHeader frameHeader, int order, int bitsPerSample)
        {
            bitsPerSample_ = bitsPerSample;
            lpcOrder_ = order;

            uint [] warmupSamples = Warmup.ReadSamples(stream, order, bitsPerSample_);

            quantitizedLpcPrecisionInBitsMinusOne_ = stream.Reader.ReadBitsAsSByte(QLPC_PRECISION_BITS_COUNT);
            quantitizedLpcShiftInBits_ = stream.Reader.ReadBitsAsSByte(QLPC_PRECISION_SHIFT_COUNT);

            predictorCoefficients_ = new uint[order];
            int i  = 0;
            while (i < predictorCoefficients_.Length)
            {
                predictorCoefficients_[i] = stream.Reader.ReadBits(quantitizedLpcPrecisionInBitsMinusOne_ + 1);
                i++;
            }

            samples_ = new uint[frameHeader.BlockSize];

            i = 0;
            foreach (uint w in warmupSamples)
            {
                samples_[i] = w;
                i++;
            }

            residual_ = new Residual();
            residual_.Read(stream, frameHeader.BlockSize, order, ref samples_);
        }
예제 #2
0
        public static Subframe New(FlacStream stream, FrameHeader frameHeader, int bitsPerSampleInFrame)
        {
            Subframe sf;
            SubframeHeader header = new SubframeHeader();
            header.Read(stream);

            int subframeType = header.SubframeType;
            if (subframeType == 0)
            {
                // constant
                SubframeConstant subframe = new SubframeConstant();
                subframe.header_ = header;
                subframe.Read(stream, bitsPerSampleInFrame);
                sf = subframe;
            }
            else if (subframeType == 1)
            {
                // verbatim
                SubframeVerbatim subframe = new SubframeVerbatim();
                subframe.header_ = header;
                subframe.Read(stream, bitsPerSampleInFrame, frameHeader.BlockSize);
                sf = subframe;
            }
            else if (subframeType >= 2 && subframeType <= 7)
            {
                throw new FlacFormatReservedException();
            }
            else if (subframeType >= 8 && subframeType <= 15)
            {
                // fixed
                int predictorOrder = subframeType & 7;
                Validation.IsReserved(predictorOrder <= 4);

                SubframeFixed subframe = new SubframeFixed();
                subframe.header_ = header;
                subframe.Read(stream, frameHeader, predictorOrder, bitsPerSampleInFrame);
                sf = subframe;
            }
            else if (subframeType == 16)
            {
                throw new FlacFormatReservedException();
            }
            else
            {
                int lpcOrder = (subframeType & 0x1f) + 1;

                SubframeLpc subframe = new SubframeLpc();
                subframe.header_ = header;
                subframe.Read(stream, frameHeader, lpcOrder, bitsPerSampleInFrame);
                sf = subframe;
            }
            return sf;
        }
예제 #3
0
        public void Read(FlacStream stream, FrameHeader frameHeader, int predictorOrder, int bitsPerSample)
        {
            bitsPerSample_ = bitsPerSample;
            predictorOrder_ = predictorOrder;

            uint [] warmupSamples = Warmup.ReadSamples(stream, predictorOrder, bitsPerSample_);

            int sampleCount = frameHeader.BlockSize;
            samples_ = new uint[sampleCount];

            int i = 0;
            foreach (uint w in warmupSamples)
            {
                samples_[i] = w;
                i++;
            }

            residual_ = new Residual();
            residual_.Read(stream, frameHeader.BlockSize, predictorOrder, ref samples_);
        }
예제 #4
0
        private void WriteFrame(Frame frame, FrameHeader header, long start, long end)
        {
            frame.ReadData(stream_);
            frame.ReadFooter(stream_);

            long startSample = frame.Header.StartingSampleNumber;
            int count = (int)(end - start);

            header.StartingSampleNumber = sampleCount_;
            header.BlockingStrategy = FrameHeader.BLOCKING_STRATEGY_VARIABLE;

            if (count == header.BlockSize)
            {
                frame.Write(outStream_);
            }
            else
            {
                header.BlockSize = count;
                frame.Write(outStream_, (int)(start - startSample), count);
            }

            trackFrameCount_++;
            sampleCount_ += header.BlockSize;
        }