uint32_t FormatParser::Parse(ByteReader& aReader) { while (aReader.CanRead8() && !mFmtChunk.ParseNext(aReader.ReadU8())) { } if (mFmtChunk.IsValid()) { return FMT_CHUNK_MIN_SIZE; } return 0; }
uint32_t RIFFParser::Parse(ByteReader& aReader) { while (aReader.CanRead8() && !mRiffHeader.ParseNext(aReader.ReadU8())) { } if (mRiffHeader.IsValid()) { return RIFF_CHUNK_SIZE; } return 0; }
uint32_t HeaderParser::Parse(ByteReader& aReader) { while (aReader.CanRead8() && !mHeader.ParseNext(aReader.ReadU8())) { } if (mHeader.IsValid()) { return CHUNK_HEAD_SIZE; } return 0; }
bool WaveDataDecoder::DoDecode(MediaRawData* aSample) { size_t aLength = aSample->Size(); ByteReader aReader = ByteReader(aSample->Data(), aLength); int64_t aOffset = aSample->mOffset; uint64_t aTstampUsecs = aSample->mTime; int32_t frames = aLength * 8 / mInfo.mBitDepth / mInfo.mChannels; auto buffer = MakeUnique<AudioDataValue[]>(frames * mInfo.mChannels); for (int i = 0; i < frames; ++i) { for (unsigned int j = 0; j < mInfo.mChannels; ++j) { if (mInfo.mBitDepth == 8) { uint8_t v = aReader.ReadU8(); buffer[i * mInfo.mChannels + j] = UInt8bitToAudioSample<AudioDataValue>(v); } else if (mInfo.mBitDepth == 16) { int16_t v = aReader.ReadLE16(); buffer[i * mInfo.mChannels + j] = IntegerToAudioSample<AudioDataValue>(v); } else if (mInfo.mBitDepth == 24) { int32_t v = aReader.ReadLE24(); buffer[i * mInfo.mChannels + j] = Int24bitToAudioSample<AudioDataValue>(v); } } } aReader.DiscardRemaining(); int64_t duration = frames / mInfo.mRate; mCallback->Output(new AudioData(aOffset, aTstampUsecs, duration, frames, Move(buffer), mInfo.mChannels, mInfo.mRate)); mFrames += frames; return true; }