ASFStream::ASFStream(Common::SeekableReadStream *stream, bool dispose) : _stream(stream), _disposeAfterUse(dispose) { _extraData = 0; _lastPacket = 0; _curPacket = 0; _codec = 0; _curAudioStream = 0; _curSequenceNumber = 1; // They always start at one ASFGUID guid = ASFGUID(*_stream); if (guid != s_asfHeader) throw Common::Exception("ASFStream: Missing asf header"); _stream->readUint64LE(); _stream->readUint32LE(); _stream->readByte(); _stream->readByte(); for (;;) { uint64 startPos = _stream->pos(); guid = ASFGUID(*_stream); uint64 size = _stream->readUint64LE(); if (_stream->eos()) throw Common::Exception("ASFStream: Unexpected eos"); // TODO: Parse each chunk if (guid == s_asfFileHeader) { parseFileHeader(); } else if (guid == s_asfHead1) { // Should be safe to ignore } else if (guid == s_asfComment) { // Ignored } else if (guid == s_asfStreamHeader) { parseStreamHeader(); } else if (guid == s_asfCodecComment) { // TODO } else if (guid == s_asfDataHeader) { // Done parsing the header break; } else if (guid == s_asfExtendedHeader) { // TODO } else if (guid == s_asfStreamBitRate) { // Ignored } else warning("Found unknown ASF GUID: %s", guid.toString().c_str()); _stream->seek(startPos + size); } // Skip to the beginning of the packets _stream->skip(26); _rewindPos = _stream->pos(); }
void ASFStream::load() { ASFGUID guid = ASFGUID(*_stream); if (guid != s_asfHeader) throw Common::Exception("ASFStream: Missing asf header"); _stream->readUint64LE(); _stream->readUint32LE(); _stream->readByte(); _stream->readByte(); for (;;) { size_t startPos = _stream->pos(); guid = ASFGUID(*_stream); uint64 size = _stream->readUint64LE(); if (_stream->eos()) throw Common::Exception("ASFStream: Unexpected eos"); // TODO: Parse each chunk if (guid == s_asfFileHeader) { parseFileHeader(); } else if (guid == s_asfHead1) { // Should be safe to ignore } else if (guid == s_asfComment) { // Ignored } else if (guid == s_asfStreamHeader) { parseStreamHeader(); } else if (guid == s_asfCodecComment) { // TODO } else if (guid == s_asfDataHeader) { // Done parsing the header break; } else if (guid == s_asfExtendedHeader) { // TODO } else if (guid == s_asfStreamBitRate) { // Ignored } else warning("Found unknown ASF GUID: %s", guid.toString().c_str()); _stream->seek(startPos + size); } // Skip to the beginning of the packets _stream->skip(26); _rewindPos = _stream->pos(); }