diff options
Diffstat (limited to 'engines/bladerunner/vqa_decoder.cpp')
-rw-r--r-- | engines/bladerunner/vqa_decoder.cpp | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/engines/bladerunner/vqa_decoder.cpp b/engines/bladerunner/vqa_decoder.cpp index 63378dc5e9..06036e737c 100644 --- a/engines/bladerunner/vqa_decoder.cpp +++ b/engines/bladerunner/vqa_decoder.cpp @@ -30,7 +30,6 @@ #include "common/array.h" #include "common/util.h" -#include "common/memstream.h" namespace BladeRunner { @@ -181,14 +180,14 @@ bool VQADecoder::loadStream(Common::SeekableReadStream *s) { _videoTrack = new VQAVideoTrack(this); _audioTrack = new VQAAudioTrack(this); - /* +#if 0 for (int i = 0; i != _loopInfo.loopCount; ++i) { debug("LOOP %2d: %4d %4d %s", i, _loopInfo.loops[i].begin, _loopInfo.loops[i].end, _loopInfo.loops[i].name.c_str()); } - */ +#endif return true; } @@ -244,6 +243,16 @@ void VQADecoder::readNextPacket() { } while (chd.id != kVQFR); } +void VQADecoder::readPacket(int frame) { + if (frame < 0 || frame >= numFrames()) { + error("frame %d out of bounds, frame count is %d", frame, numFrames()); + } + + uint32 frameOffset = 2 * (_frameInfo[frame] & 0x0FFFFFFF); + _s->seek(frameOffset); + readNextPacket(); +} + bool VQADecoder::readVQHD(Common::SeekableReadStream *s, uint32 size) { if (size != 42) @@ -515,6 +524,18 @@ bool VQADecoder::readLNIN(Common::SeekableReadStream *s, uint32 size) return true; } +bool VQADecoder::getLoopBeginAndEndFrame(int loop, int *begin, int *end) { + assert(begin && end); + + if (loop < 0 || loop >= _loopInfo.loopCount) + return false; + + *begin = _loopInfo.loops[loop].begin; + *end = _loopInfo.loops[loop].end; + + return true; +} + bool VQADecoder::readCLIP(Common::SeekableReadStream *s, uint32 size) { s->skip(roundup(size)); return true; @@ -525,12 +546,7 @@ bool VQADecoder::readMFCI(Common::SeekableReadStream *s, uint32 size) { return true; } -void VQADecoder::decodeView(View* view) -{ - _videoTrack->decodeView(view); -} - - VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) { +VQADecoder::VQAVideoTrack::VQAVideoTrack(VQADecoder *vqaDecoder) { VQADecoder::Header *header = &vqaDecoder->_header; _surface = nullptr; @@ -566,8 +582,6 @@ void VQADecoder::decodeView(View* view) _surface = new Graphics::Surface(); _surface->create(_width, _height, createRGB555()); - - _viewData = new uint8[56]; } VQADecoder::VQAVideoTrack::~VQAVideoTrack() { @@ -575,12 +589,11 @@ VQADecoder::VQAVideoTrack::~VQAVideoTrack() { delete[] _cbfz; delete[] _zbufChunk; delete[] _vpointer; - delete[] _viewData; if (_surface) _surface->free(); delete _surface; - delete _zbuffer; + delete[] _zbuffer; } uint16 VQADecoder::VQAVideoTrack::getWidth() const { @@ -752,29 +765,18 @@ const uint16 *VQADecoder::VQAVideoTrack::decodeZBuffer() return _zbuffer; } - -void VQADecoder::VQAVideoTrack::decodeView(View* view) -{ - assert(_viewData); - assert(view); - - Common::MemoryReadStream s(_viewData, 56); - view->read(&s); -} - - bool VQADecoder::VQAVideoTrack::readVIEW(Common::SeekableReadStream *s, uint32 size) +bool VQADecoder::VQAVideoTrack::readVIEW(Common::SeekableReadStream *s, uint32 size) { if (size != 56) return false; - s->read(_viewData, 56); + _view.read(s); return true; } bool VQADecoder::VQAVideoTrack::readAESC(Common::SeekableReadStream *s, uint32 size) { - // some screen (2d not 3d) effects for transparency s->skip(roundup(size)); return true; } |