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; }
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; }