aboutsummaryrefslogtreecommitdiff
path: root/graphics/video/codecs
diff options
context:
space:
mode:
authorMatthew Hoops2010-12-09 20:48:08 +0000
committerMatthew Hoops2010-12-09 20:48:08 +0000
commit09abe6f1510b797727cc2c5de5b3c85607cd915b (patch)
tree871dd1db84b482f7e10fa09c9d4b06bde91dfc29 /graphics/video/codecs
parent680b0d3172007a6c29558785456ffbc2078b7a10 (diff)
downloadscummvm-rg350-09abe6f1510b797727cc2c5de5b3c85607cd915b.tar.gz
scummvm-rg350-09abe6f1510b797727cc2c5de5b3c85607cd915b.tar.bz2
scummvm-rg350-09abe6f1510b797727cc2c5de5b3c85607cd915b.zip
VIDEO: Allow for 8bpp Cinepak videos
svn-id: r54841
Diffstat (limited to 'graphics/video/codecs')
-rw-r--r--graphics/video/codecs/cinepak.cpp27
-rw-r--r--graphics/video/codecs/cinepak.h2
2 files changed, 18 insertions, 11 deletions
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);