Common::SeekableReadStream *WwRIFFVorbisStream::createPacket() { if (_currentOffset >= (_dataOffset + _dataSize)) return 0; Common::MemoryWriteStreamDynamic header(true); Common::BitStreamWriter8LSB bits(header); Packet audioPacket(*_inStream, _currentOffset, _noGranule); const size_t packerHeaderSize = audioPacket.headerSize(); const size_t size = audioPacket.size(); const size_t packetPayloadOffset = audioPacket.offset(); const size_t nextOffset = audioPacket.nextOffset(); if (_currentOffset + packerHeaderSize > _dataOffset + _dataSize) throw Common::Exception("WwRIFFVorbisStream::createPacket(): " "Page header truncated"); _currentOffset = packetPayloadOffset; _inStream->seek(_currentOffset); Common::ScopedPtr<Common::SeekableReadStream> packetStream(_inStream->readStream(size)); _currentOffset = nextOffset; if (_currentOffset > (_dataOffset + _dataSize)) throw Common::Exception("WwRIFFVorbisStream::createPacket(): " "Page truncated"); return packetStream.release(); }
const Graphics::Surface *BinkDecoder::decodeNextFrame() { if (endOfVideo()) return 0; VideoFrame &frame = _frames[_curFrame + 1]; if (!_bink->seek(frame.offset)) error("Bad bink seek"); uint32 frameSize = frame.size; for (uint32 i = 0; i < _audioTracks.size(); i++) { AudioTrack &audio = _audioTracks[i]; uint32 audioPacketLength = _bink->readUint32LE(); frameSize -= 4; if (frameSize < audioPacketLength) error("Audio packet too big for the frame"); if (audioPacketLength >= 4) { uint32 audioPacketStart = _bink->pos(); uint32 audioPacketEnd = _bink->pos() + audioPacketLength; if (i == _audioTrack) { // Only play one audio track // Number of samples in bytes audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels); audio.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, audioPacketStart + 4, audioPacketEnd), true); audioPacket(audio); delete audio.bits; audio.bits = 0; } _bink->seek(audioPacketEnd); frameSize -= audioPacketLength; } } uint32 videoPacketStart = _bink->pos(); uint32 videoPacketEnd = _bink->pos() + frameSize; frame.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, videoPacketStart, videoPacketEnd), true); videoPacket(frame); delete frame.bits; frame.bits = 0; _curFrame++; if (_curFrame == 0) _startTime = g_system->getMillis(); return &_surface; }
void Bink::processData() { if (getTimeToNextFrame() > 0) return; if (_curFrame >= _frames.size()) { finish(); return; } VideoFrame &frame = _frames[_curFrame]; if (!_bink->seek(frame.offset)) throw Common::Exception(Common::kSeekError); uint32 frameSize = frame.size; for (uint32 i = 0; i < _audioTracks.size(); i++) { AudioTrack &audio = _audioTracks[i]; uint32 audioPacketLength = _bink->readUint32LE(); frameSize -= 4; if (frameSize < audioPacketLength) throw Common::Exception("Audio packet too big for the frame"); if (audioPacketLength >= 4) { uint32 audioPacketStart = _bink->pos(); uint32 audioPacketEnd = _bink->pos() + audioPacketLength; if (i == _audioTrack) { // Only play one audio track // Number of samples in bytes audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels); audio.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, audioPacketStart + 4, audioPacketEnd), true); audioPacket(audio); delete audio.bits; audio.bits = 0; } _bink->seek(audioPacketEnd); frameSize -= audioPacketLength; } } uint32 videoPacketStart = _bink->pos(); uint32 videoPacketEnd = _bink->pos() + frameSize; frame.bits = new Common::BitStream32LELSB(new Common::SeekableSubReadStream(_bink, videoPacketStart, videoPacketEnd), true); videoPacket(frame); delete frame.bits; frame.bits = 0; _needCopy = true; _curFrame++; }
const Graphics::Surface *BinkDecoder::decodeNextFrame() { if (endOfVideo()) return 0; VideoFrame &frame = _frames[_curFrame + 1]; if (!_bink->seek(frame.offset)) error("Bad bink seek"); uint32 frameSize = frame.size; for (uint32 i = 0; i < _audioTracks.size(); i++) { AudioTrack &audio = _audioTracks[i]; uint32 audioPacketLength = _bink->readUint32LE(); frameSize -= 4; if (frameSize < audioPacketLength) error("Audio packet too big for the frame"); if (audioPacketLength >= 4) { if (i == _audioTrack) { // Only play one audio track // Number of samples in bytes audio.sampleCount = _bink->readUint32LE() / (2 * audio.channels); audio.bits = new Common::BitStream32LE(*_bink, (audioPacketLength - 4) * 8); audioPacket(audio); delete audio.bits; audio.bits = 0; } else // Skip the rest _bink->skip(audioPacketLength); frameSize -= audioPacketLength; } } frame.bits = new Common::BitStream32LE(*_bink, frameSize * 8); videoPacket(frame); delete frame.bits; frame.bits = 0; _curFrame++; if (_curFrame == 0) _startTime = g_system->getMillis(); if (!_audioStarted && _audioStream) { _audioStarted = true; g_system->getMixer()->playStream(Audio::Mixer::kPlainSoundType, &_audioHandle, _audioStream); } return &_surface; }