diff options
Diffstat (limited to 'graphics/video/avi_player.h')
-rw-r--r-- | graphics/video/avi_player.h | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/graphics/video/avi_player.h b/graphics/video/avi_player.h new file mode 100644 index 0000000000..19126fe15d --- /dev/null +++ b/graphics/video/avi_player.h @@ -0,0 +1,241 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef GRAPHICS_AVI_PLAYER_H +#define GRAPHICS_AVI_PLAYER_H + +#include "common/file.h" +#include "common/system.h" +#include "common/rect.h" +#include "common/util.h" + +#include "sound/audiostream.h" +#include "sound/mixer.h" + +namespace Graphics { + +#define UNKNOWN_HEADER(a) error("Unknown header found -- \'%s\'", tag2str(a)) +#define AUDIO_RATE (_audsHeader.rate / _audsHeader.scale) + +// ID's That are used throughout the AVI files +// that will be handled by this player +#define ID_RIFF MKID_BE('RIFF') +#define ID_AVI MKID_BE('AVI ') +#define ID_LIST MKID_BE('LIST') +#define ID_HDRL MKID_BE('hdrl') +#define ID_AVIH MKID_BE('avih') +#define ID_STRL MKID_BE('strl') +#define ID_STRH MKID_BE('strh') +#define ID_VIDS MKID_BE('vids') +#define ID_AUDS MKID_BE('auds') +#define ID_MIDS MKID_BE('mids') +#define ID_TXTS MKID_BE('txts') +#define ID_JUNK MKID_BE('JUNK') +#define ID_STRF MKID_BE('strf') +#define ID_MOVI MKID_BE('movi') +#define ID_REC MKID_BE('rec ') +#define ID_VEDT MKID_BE('vedt') +#define ID_IDX1 MKID_BE('idx1') +#define ID_STRD MKID_BE('strd') +//#define ID_INFO MKID_BE('INFO') + +// Codec tags +#define ID_RLE MKID_BE('RLE ') +#define ID_CRAM MKID_BE('CRAM') +#define ID_MSVC MKID_BE('msvc') +#define ID_WHAM MKID_BE('WHAM') +#define ID_CVID MKID_BE('cvid') +#define ID_IV32 MKID_BE('iv32') + +struct BITMAPINFOHEADER { + uint32 size; + uint32 width; + uint32 height; + uint16 planes; + uint16 bitCount; + uint32 compression; + uint32 sizeImage; + uint32 xPelsPerMeter; + uint32 yPelsPerMeter; + uint32 clrUsed; + uint32 clrImportant; +}; + +struct WAVEFORMAT { + uint16 tag; + uint16 channels; + uint32 samplesPerSec; + uint32 avgBytesPerSec; + uint16 blockAlign; +}; + +struct PCMWAVEFORMAT : public WAVEFORMAT { + uint16 size; +}; + +struct WAVEFORMATEX : public WAVEFORMAT { + uint16 bitsPerSample; + uint16 size; +}; + +struct AVIOLDINDEX { + uint32 size; + struct Index { + uint32 id; + uint32 flags; + uint32 offset; + uint32 size; + } *indices; +}; + +// Index Flags +enum { + AVIIF_INDEX = 0x10 +}; + +enum { + WAVE_INVALIDFORMAT = 0, + WAVE_FORMAT_PCM = 1, + WAVE_FORMAT_1M08 = 1, + WAVE_FORMAT_1S08 = 2, + WAVE_FORMAT_1M16 = 4, + WAVE_FORMAT_1S16 = 8, + WAVE_FORMAT_2M08 = 16, + WAVE_FORMAT_2S08 = 32, + WAVE_FORMAT_2M16 = 64, + WAVE_FORMAT_2S16 = 128, + WAVE_FORMAT_4M08 = 256, + WAVE_FORMAT_4S08 = 512, + WAVE_FORMAT_4M16 = 1024, + WAVE_FORMAT_4S16 = 2048 +}; + +struct AVIHeader { + uint32 size; + uint32 microSecondsPerFrame; + uint32 maxBytesPerSecond; + uint32 padding; + uint32 flags; + uint32 totalFrames; + uint32 initialFrames; + uint32 streams; + uint32 bufferSize; + uint32 width; + uint32 height; +}; + +// Flags from the AVIHeader +enum { + AVIF_HASINDEX = 0x00000010, + AVIF_MUSTUSEINDEX = 0x00000020, + AVIF_ISINTERLEAVED = 0x00000100, + AVIF_TRUSTCKTYPE = 0x00000800, + AVIF_WASCAPTUREFILE = 0x00010000, + AVIF_WASCOPYRIGHTED = 0x00020000 +}; + +struct AVIStreamHeader { + uint32 size; + uint32 streamType; + uint32 streamHandler; + uint32 flags; + uint16 priority; + uint16 language; + uint32 initialFrames; + uint32 scale; + uint32 rate; + uint32 start; + uint32 length; + uint32 bufferSize; + uint32 quality; + uint32 sampleSize; + Common::Rect frame; +}; + +class Codec { +public: + Codec() {} + virtual ~Codec() {} + virtual Graphics::Surface *decodeImage(Common::SeekableReadStream *stream) = 0; +}; + +class AVIPlayer { +public: + AVIPlayer(OSystem* syst); + ~AVIPlayer(); + + // Open/Load an AVI video from "filename" + bool open(Common::String filename); + + // Open/Load an AVI video from a stream + void open(Common::SeekableReadStream *stream); + + // Close the current AVI video and release any data + void close(); + + uint32 getFrameRate() { return _vidsHeader.rate / _vidsHeader.scale; } + byte *getPalette() { return _palette; _dirtyPalette = false; } + Surface *getNextFrame(); + bool dirtyPalette() { return _dirtyPalette; } + uint32 getCurFrame() { return _curFrame; } + uint32 getFrameCount() { return _header.totalFrames; } +private: + OSystem *_system; + Common::SeekableReadStream *_stream; + BITMAPINFOHEADER _bmInfo; + PCMWAVEFORMAT _wvInfo; + AVIOLDINDEX _ixInfo; + AVIHeader _header; + AVIStreamHeader _vidsHeader; + AVIStreamHeader _audsHeader; + byte *_palette; + + bool _decodedHeader; + uint32 _curFrame; + bool _dirtyPalette; + + Codec *_videoCodec; + Codec *createCodec(); + + void runHandle(uint32 tag); + void handleList(); + void handleStreamHeader(); + void handlePalChange(); + + Audio::SoundHandle *_audHandle; + Audio::AppendableAudioStream *_audStream; + Audio::AppendableAudioStream *createAudioStream(); + + uint32 _filesize; + + // Helper functions + static byte char2num(char c); + static byte getStreamNum(uint32 tag); + static uint16 getStreamType(uint32 tag); +}; + +} // End of namespace JMP + +#endif |