diff options
-rw-r--r-- | graphics/video/avi_decoder.cpp | 2 | ||||
-rw-r--r-- | graphics/video/codecs/cinepak.cpp | 27 | ||||
-rw-r--r-- | graphics/video/codecs/cinepak.h | 2 | ||||
-rw-r--r-- | graphics/video/qt_decoder.cpp | 2 |
4 files changed, 20 insertions, 13 deletions
diff --git a/graphics/video/avi_decoder.cpp b/graphics/video/avi_decoder.cpp index a7c8157a89..aa6844a498 100644 --- a/graphics/video/avi_decoder.cpp +++ b/graphics/video/avi_decoder.cpp @@ -401,7 +401,7 @@ Codec *AviDecoder::createCodec() { case ID_RLE: return new MSRLEDecoder(_bmInfo.width, _bmInfo.height, _bmInfo.bitCount); case ID_CVID: - return new CinepakDecoder(); + return new CinepakDecoder(_bmInfo.bitCount); #ifdef USE_INDEO3 case ID_IV32: return new Indeo3Decoder(_bmInfo.width, _bmInfo.height); diff --git a/graphics/video/codecs/cinepak.cpp b/graphics/video/codecs/cinepak.cpp index a14eaf9acf..b6903cf201 100644 --- a/graphics/video/codecs/cinepak.cpp +++ b/graphics/video/codecs/cinepak.cpp @@ -39,17 +39,24 @@ inline static void CPYUV2RGB(byte y, byte u, byte v, byte &r, byte &g, byte &b) } #define PUT_PIXEL(offset, lum, u, v) \ - CPYUV2RGB(lum, u, v, r, g, b); \ - if (_pixelFormat.bytesPerPixel == 2) \ - *((uint16 *)_curFrame.surface->pixels + offset) = _pixelFormat.RGBToColor(r, g, b); \ - else \ - *((uint32 *)_curFrame.surface->pixels + offset) = _pixelFormat.RGBToColor(r, g, b) - -CinepakDecoder::CinepakDecoder() : Codec() { + if (_pixelFormat.bytesPerPixel != 1) { \ + CPYUV2RGB(lum, u, v, r, g, b); \ + if (_pixelFormat.bytesPerPixel == 2) \ + *((uint16 *)_curFrame.surface->pixels + offset) = _pixelFormat.RGBToColor(r, g, b); \ + else \ + *((uint32 *)_curFrame.surface->pixels + offset) = _pixelFormat.RGBToColor(r, g, b); \ + } else \ + *((byte *)_curFrame.surface->pixels + offset) = lum + +CinepakDecoder::CinepakDecoder(int bitsPerPixel) : Codec() { _curFrame.surface = NULL; _curFrame.strips = NULL; _y = 0; - _pixelFormat = g_system->getScreenFormat(); + + if (bitsPerPixel == 8) + _pixelFormat = PixelFormat::createFormatCLUT8(); + else + _pixelFormat = g_system->getScreenFormat(); } CinepakDecoder::~CinepakDecoder() { @@ -181,8 +188,8 @@ void CinepakDecoder::loadCodebook(Common::SeekableReadStream *stream, uint16 str codebook[i].v = stream->readByte() + 128; } else { // This codebook type indicates either greyscale or - // palettized video. We don't handle palettized video - // currently. + // palettized video. For greyscale, default us to + // 128 for both u and v. codebook[i].u = 128; codebook[i].v = 128; } diff --git a/graphics/video/codecs/cinepak.h b/graphics/video/codecs/cinepak.h index 92351cdba8..0c42cbbb97 100644 --- a/graphics/video/codecs/cinepak.h +++ b/graphics/video/codecs/cinepak.h @@ -61,7 +61,7 @@ struct CinepakFrame { class CinepakDecoder : public Codec { public: - CinepakDecoder(); + CinepakDecoder(int bitsPerPixel = 24); ~CinepakDecoder(); Surface *decodeImage(Common::SeekableReadStream *stream); diff --git a/graphics/video/qt_decoder.cpp b/graphics/video/qt_decoder.cpp index 66dc48b57d..bb2714c4e5 100644 --- a/graphics/video/qt_decoder.cpp +++ b/graphics/video/qt_decoder.cpp @@ -161,7 +161,7 @@ void QuickTimeDecoder::rewind() { Codec *QuickTimeDecoder::createCodec(uint32 codecTag, byte bitsPerPixel) { if (codecTag == MKID_BE('cvid')) { // Cinepak: As used by most Myst and all Riven videos as well as some Myst ME videos. "The Chief" videos also use this. - return new CinepakDecoder(); + return new CinepakDecoder(bitsPerPixel); } else if (codecTag == MKID_BE('rpza')) { // Apple Video ("Road Pizza"): Used by some Myst videos. return new RPZADecoder(getWidth(), getHeight()); |