diff options
| author | uruk | 2014-05-30 11:14:47 +0200 |
|---|---|---|
| committer | uruk | 2014-05-30 11:14:47 +0200 |
| commit | bb2f8dd68e1d6b2b30b07f60c0cd4e125b47ea4d (patch) | |
| tree | 9a1e28cfb1eb1a322225c05adc0962a2f96ea521 /image/codecs | |
| parent | 5ad4e157e5398347651a0da0db07f9daf01bf373 (diff) | |
| parent | 0a46d67baea121bed0511ce45bfdd8438a43d35d (diff) | |
| download | scummvm-rg350-bb2f8dd68e1d6b2b30b07f60c0cd4e125b47ea4d.tar.gz scummvm-rg350-bb2f8dd68e1d6b2b30b07f60c0cd4e125b47ea4d.tar.bz2 scummvm-rg350-bb2f8dd68e1d6b2b30b07f60c0cd4e125b47ea4d.zip | |
Merge branch 'master' of https://github.com/scummvm/scummvm into cge2
Diffstat (limited to 'image/codecs')
| -rw-r--r-- | image/codecs/codec.cpp | 4 | ||||
| -rw-r--r-- | image/codecs/truemotion1.cpp | 50 | ||||
| -rw-r--r-- | image/codecs/truemotion1.h | 3 |
3 files changed, 32 insertions, 25 deletions
diff --git a/image/codecs/codec.cpp b/image/codecs/codec.cpp index 530fb3b836..6b0c7ebcfb 100644 --- a/image/codecs/codec.cpp +++ b/image/codecs/codec.cpp @@ -58,10 +58,10 @@ Codec *createBitmapCodec(uint32 tag, int width, int height, int bitsPerPixel) { return new CinepakDecoder(bitsPerPixel); case MKTAG('I','V','3','2'): return new Indeo3Decoder(width, height); -#ifdef VIDEO_CODECS_TRUEMOTION1_H +#ifdef IMAGE_CODECS_TRUEMOTION1_H case MKTAG('D','U','C','K'): case MKTAG('d','u','c','k'): - return new TrueMotion1Decoder(width, height); + return new TrueMotion1Decoder(); #endif #ifdef USE_MPEG2 case MKTAG('m','p','g','2'): diff --git a/image/codecs/truemotion1.cpp b/image/codecs/truemotion1.cpp index 1302d72e2f..e60ec6c72e 100644 --- a/image/codecs/truemotion1.cpp +++ b/image/codecs/truemotion1.cpp @@ -30,6 +30,7 @@ #include "image/codecs/truemotion1data.h" #include "common/stream.h" #include "common/textconsole.h" +#include "common/rect.h" #include "common/util.h" namespace Image { @@ -88,24 +89,20 @@ static const CompressionType compressionTypes[17] = { { ALGO_RGB24H, 2, 2, BLOCK_2x2 } }; -TrueMotion1Decoder::TrueMotion1Decoder(uint16 width, uint16 height) { - _surface = new Graphics::Surface(); - _width = width; - _height = height; - - _surface->create(width, height, getPixelFormat()); - - // there is a vertical predictor for each pixel in a line; each vertical - // predictor is 0 to start with - _vertPred = new uint32[_width]; +TrueMotion1Decoder::TrueMotion1Decoder() { + _surface = 0; + _vertPred = 0; _buf = _mbChangeBits = _indexStream = 0; _lastDeltaset = _lastVectable = -1; } TrueMotion1Decoder::~TrueMotion1Decoder() { - _surface->free(); - delete _surface; + if (_surface) { + _surface->free(); + delete _surface; + } + delete[] _vertPred; } @@ -170,11 +167,6 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream &stream) { byte headerBuffer[128]; // logical maximum size of the header const byte *selVectorTable; - // There is 1 change bit per 4 pixels, so each change byte represents - // 32 pixels; divide width by 4 to obtain the number of change bits and - // then round up to the nearest byte. - _mbChangeBitsRowSize = ((_width >> 2) + 7) >> 3; - _header.headerSize = ((_buf[0] >> 5) | (_buf[0] << 3)) & 0x7f; if (_buf[0] < 0x10) @@ -196,6 +188,22 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream &stream) { _header.flags = headerBuffer[11]; _header.control = headerBuffer[12]; + if (!_vertPred) { + // there is a vertical predictor for each pixel in a line; each vertical + // predictor is 0 to start with + _vertPred = new uint32[_header.xsize]; + } + + if (!_surface) { + _surface = new Graphics::Surface(); + _surface->create(_header.xsize, _header.ysize, getPixelFormat()); + } + + // There is 1 change bit per 4 pixels, so each change byte represents + // 32 pixels; divide width by 4 to obtain the number of change bits and + // then round up to the nearest byte. + _mbChangeBitsRowSize = ((_header.xsize >> 2) + 7) >> 3; + // Version 2 if (_header.version >= 2) { if (_header.headerType > 3) { @@ -240,7 +248,7 @@ void TrueMotion1Decoder::decodeHeader(Common::SeekableReadStream &stream) { _indexStream = _mbChangeBits; } else { // one change bit per 4x4 block - _indexStream = _mbChangeBits + _mbChangeBitsRowSize * (_height >> 2); + _indexStream = _mbChangeBits + _mbChangeBitsRowSize * (_header.ysize >> 2); } _indexStreamSize = stream.size() - (_indexStream - _buf); @@ -306,11 +314,11 @@ void TrueMotion1Decoder::decode16() { int index; // clean out the line buffer - memset(_vertPred, 0, _width * 4); + memset(_vertPred, 0, _header.xsize * 4); GET_NEXT_INDEX(); - for (int y = 0; y < _height; y++) { + for (int y = 0; y < _header.ysize; y++) { // re-init variables for the next line iteration uint32 horizPred = 0; uint32 *currentPixelPair = (uint32 *)_surface->getBasePtr(0, y); @@ -319,7 +327,7 @@ void TrueMotion1Decoder::decode16() { byte mbChangeByte = _mbChangeBits[mbChangeIndex++]; byte mbChangeByteMask = 1; - for (int pixelsLeft = _width; pixelsLeft > 0; pixelsLeft -= 4) { + for (int pixelsLeft = _header.xsize; pixelsLeft > 0; pixelsLeft -= 4) { if (keyframe || (mbChangeByte & mbChangeByteMask) == 0) { switch (y & 3) { case 0: diff --git a/image/codecs/truemotion1.h b/image/codecs/truemotion1.h index 12570f066c..51daf607d2 100644 --- a/image/codecs/truemotion1.h +++ b/image/codecs/truemotion1.h @@ -39,7 +39,7 @@ namespace Image { */ class TrueMotion1Decoder : public Codec { public: - TrueMotion1Decoder(uint16 width, uint16 height); + TrueMotion1Decoder(); ~TrueMotion1Decoder(); const Graphics::Surface *decodeFrame(Common::SeekableReadStream &stream); @@ -54,7 +54,6 @@ private: byte *_buf, *_mbChangeBits, *_indexStream; int _indexStreamSize; - uint16 _width, _height; int _flags; struct PredictorTableEntry { |
