Exemplo n.º 1
0
        public ErrorCode init(IReader reader)
        {
            reader_ = reader;
            reader_.seek(0);
            ErrorCode res = ErrorCode.Success;

            do
            {
                if (reader_.size() < 44)
                {
                    res = ErrorCode.InvalidStream;
                }

                byte[] buff = new byte[1024];
                int size = 1024;
                reader_.read(buff, ref size);
                int offset = 0;
                UInt32 val = AVUtils.read32(buff, offset);
                if (val != 0x46464952)//RIFF
                {
                    res = ErrorCode.InvalidStream;
                    break;
                }
                offset += 4;
                length_ = 8 + AVUtils.read32(buff, offset);
                offset += 4;
                val = AVUtils.read32(buff, offset);
                if (val != 0x45564157) //WAVE
                {
                    res = ErrorCode.InvalidStream;
                    break;
                }
                offset += 12;
                val = AVUtils.read16(buff, offset);
                if (val != 1) //PCM
                {
                    res = ErrorCode.InvalidStream;
                    break;
                }

                offset += 2;
                channels_ = (UInt16)AVUtils.read16(buff, offset);
                offset += 2;
                frequency_ = AVUtils.read32(buff, offset);
                offset += 10;
                bps_ = (UInt16)AVUtils.read16(buff, offset);
                offset_ = 44;
                length_ = reader_.size() - offset_;
                reader.seek(44);
            }
            while (false);
            return res;
        }
Exemplo n.º 2
0
        public ErrorCode init(IReader reader)
        {
            reader_ = reader;
            reader_.seek(0);

            if (reader.size() < 4)
            {
                return ErrorCode.InvalidStream;
            }

            int size = Math.Min(64 * 1024, (int)reader.size());
            byte [] buff = new byte[size];
            int offset = 0;

            reader_.read(buff, ref size);

            while (offset + 4 < size)
            {
                MPAHeader hdr = MPAHeaderParser.parse(buff, offset);

                if (hdr.valid)
                {
                    UInt32 pckSize = MPAHeaderParser.mpaPacketSize(hdr);
                    MPAHeader hdr2 = MPAHeaderParser.parse(buff, offset + (int)pckSize);
                    if (hdr2.valid && hdr2.isEqual(hdr))
                    {
                        break;
                    }
                }
                ++offset;
            }

            if (offset + 4 < size)
            {
                MPAHeader hdr = MPAHeaderParser.parse(buff, offset);
                length_ = MPAHeaderParser.mpaPacketSize(hdr);
                offset_ = (UInt32)offset;

                UInt64 ln = reader.size() - (UInt64)offset;
                ln /= MPAHeaderParser.mpaPacketSize(hdr);

                packets_ = (UInt32)ln;
                duration_ = (UInt64)(100000 * (double)ln * (double)MPAHeaderParser.samples(hdr) / (double)MPAHeaderParser.samplingRate(hdr));
                info_ = new MPAInfo(hdr, duration_);
                samples_ = MPAHeaderParser.samples(hdr);
                seek(0);
                return ErrorCode.Success;
            }

            return ErrorCode.InvalidStream;
        }