Blob Blame Raw


#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