#ifndef TIIO_AVI_H
#define TIIO_AVI_H
#ifdef _WIN32
#include <windows.h>
#include <vfw.h>
#endif
#include "tlevel_io.h"
#include "tthreadmessage.h"
class TAviCodecCompressor;
class VDVideoDecompressor;
//===========================================================
//
// TLevelWriterAvi
//
//===========================================================
class TLevelWriterAvi : public TLevelWriter
{
public:
TLevelWriterAvi(const TFilePath &path, TPropertyGroup *winfo);
~TLevelWriterAvi();
TImageWriterP getFrameWriter(TFrameId fid);
void saveSoundTrack(TSoundTrack *st);
void save(const TImageP &image, int frameIndex);
static TLevelWriter *create(const TFilePath &f, TPropertyGroup *winfo) { return new TLevelWriterAvi(f, winfo); }
private:
TThread::Mutex m_mutex;
#ifdef _WIN32
PAVIFILE m_aviFile;
PAVISTREAM m_videoStream;
PAVISTREAM m_audioStream;
TSoundTrack *m_st;
HIC m_hic;
BITMAPINFO *m_bitmapinfo;
BITMAPINFO *m_outputFmt;
AVISTREAMINFO m_audioStreamInfo;
void *m_buffer;
bool m_initDone;
int IOError;
int m_bpp;
long m_maxDataSize;
std::list<int> m_delayedFrames;
int m_firstframe;
#endif
void doSaveSoundTrack();
void searchForCodec();
#ifdef _WIN32
int compressFrame(BITMAPINFOHEADER *outHeader, void **bufferOut, int frameIndex,
DWORD flagsIn, DWORD &flagsOut);
#endif
void createBitmap(int lx, int ly);
};
//===========================================================
//
// TLevelWriterAvi
//
//===========================================================
class TLevelReaderAvi : public TLevelReader
{
public:
TLevelReaderAvi(const TFilePath &path);
~TLevelReaderAvi();
TImageReaderP getFrameReader(TFrameId fid);
static TLevelReader *create(const TFilePath &f) { return new TLevelReaderAvi(f); }
TLevelP loadInfo();
TImageP load(int frameIndex);
TDimension getSize();
TThread::Mutex m_mutex;
void *m_decompressedBuffer;
#ifdef _WIN32
private:
PAVISTREAM m_videoStream;
BITMAPINFO *m_srcBitmapInfo, *m_dstBitmapInfo;
HIC m_hic;
int IOError, m_prevFrame;
int readFrameFromStream(void *bufferOut, DWORD &bufferSize, int frameIndex) const;
DWORD decompressFrame(void *srcBuffer, int srcSize, void *dstBuffer, int currentFrame, int desiredFrame);
HIC findCandidateDecompressor();
#endif
};
//===========================================================
//
// Tiio::AviWriterProperties
//
//===========================================================
namespace Tiio
{
class AviWriterProperties : public TPropertyGroup
{
public:
AviWriterProperties();
TEnumProperty m_codec;
static TEnumProperty m_defaultCodec;
};
}
#endif //TIIO_AVI_H