Exemple #1
0
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();
}
Exemple #2
0
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;
}
Exemple #3
0
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++;
}
Exemple #4
0
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;
}