VIDEO: Allow for 8bpp Cinepak videos

svn-id: r54841
This commit is contained in:
Matthew Hoops 2010-12-09 20:48:08 +00:00
parent 680b0d3172
commit 09abe6f151
4 changed files with 19 additions and 12 deletions

View File

@ -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);

View File

@ -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)
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() : Codec() {
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;
}

View File

@ -61,7 +61,7 @@ struct CinepakFrame {
class CinepakDecoder : public Codec {
public:
CinepakDecoder();
CinepakDecoder(int bitsPerPixel = 24);
~CinepakDecoder();
Surface *decodeImage(Common::SeekableReadStream *stream);

View File

@ -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());