2016-05-17 03:04:11 +12:00
|
|
|
#pragma once
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
#ifndef TIIO_AVI_H
|
|
|
|
#define TIIO_AVI_H
|
|
|
|
|
2016-04-15 17:11:23 +12:00
|
|
|
#ifdef _WIN32
|
2016-03-19 06:57:51 +13:00
|
|
|
#include <windows.h>
|
|
|
|
#include <vfw.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "tlevel_io.h"
|
|
|
|
#include "tthreadmessage.h"
|
|
|
|
|
2018-06-04 15:18:43 +12:00
|
|
|
#include <QCoreApplication>
|
|
|
|
|
2016-03-19 06:57:51 +13:00
|
|
|
class TAviCodecCompressor;
|
|
|
|
class VDVideoDecompressor;
|
|
|
|
|
|
|
|
//===========================================================
|
|
|
|
//
|
|
|
|
// TLevelWriterAvi
|
|
|
|
//
|
|
|
|
//===========================================================
|
|
|
|
|
2016-06-29 18:17:12 +12:00
|
|
|
class TLevelWriterAvi final : public TLevelWriter {
|
2016-03-19 06:57:51 +13:00
|
|
|
public:
|
2016-06-15 18:43:10 +12:00
|
|
|
TLevelWriterAvi(const TFilePath &path, TPropertyGroup *winfo);
|
|
|
|
~TLevelWriterAvi();
|
2016-06-19 20:06:29 +12:00
|
|
|
TImageWriterP getFrameWriter(TFrameId fid) override;
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-19 20:06:29 +12:00
|
|
|
void saveSoundTrack(TSoundTrack *st) override;
|
2016-06-15 18:43:10 +12:00
|
|
|
void save(const TImageP &image, int frameIndex);
|
|
|
|
static TLevelWriter *create(const TFilePath &f, TPropertyGroup *winfo) {
|
|
|
|
return new TLevelWriterAvi(f, winfo);
|
|
|
|
}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
private:
|
2016-06-15 18:43:10 +12:00
|
|
|
TThread::Mutex m_mutex;
|
2016-04-15 17:11:23 +12:00
|
|
|
#ifdef _WIN32
|
2016-06-15 18:43:10 +12:00
|
|
|
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;
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void doSaveSoundTrack();
|
|
|
|
void searchForCodec();
|
2016-04-15 17:11:23 +12:00
|
|
|
#ifdef _WIN32
|
2016-06-15 18:43:10 +12:00
|
|
|
int compressFrame(BITMAPINFOHEADER *outHeader, void **bufferOut,
|
|
|
|
int frameIndex, DWORD flagsIn, DWORD &flagsOut);
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
2016-06-15 18:43:10 +12:00
|
|
|
void createBitmap(int lx, int ly);
|
2016-03-19 06:57:51 +13:00
|
|
|
};
|
|
|
|
|
|
|
|
//===========================================================
|
|
|
|
//
|
|
|
|
// TLevelWriterAvi
|
|
|
|
//
|
|
|
|
//===========================================================
|
|
|
|
|
2016-06-29 18:17:12 +12:00
|
|
|
class TLevelReaderAvi final : public TLevelReader {
|
2016-03-19 06:57:51 +13:00
|
|
|
public:
|
2016-06-15 18:43:10 +12:00
|
|
|
TLevelReaderAvi(const TFilePath &path);
|
|
|
|
~TLevelReaderAvi();
|
2016-06-19 20:06:29 +12:00
|
|
|
TImageReaderP getFrameReader(TFrameId fid) override;
|
2016-06-15 18:43:10 +12:00
|
|
|
|
|
|
|
static TLevelReader *create(const TFilePath &f) {
|
|
|
|
return new TLevelReaderAvi(f);
|
|
|
|
}
|
2016-06-19 20:06:29 +12:00
|
|
|
TLevelP loadInfo() override;
|
2016-06-15 18:43:10 +12:00
|
|
|
TImageP load(int frameIndex);
|
|
|
|
TDimension getSize();
|
|
|
|
TThread::Mutex m_mutex;
|
|
|
|
void *m_decompressedBuffer;
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-04-15 17:11:23 +12:00
|
|
|
#ifdef _WIN32
|
2016-03-19 06:57:51 +13:00
|
|
|
private:
|
2016-06-15 18:43:10 +12:00
|
|
|
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();
|
2016-03-19 06:57:51 +13:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
//===========================================================
|
|
|
|
//
|
|
|
|
// Tiio::AviWriterProperties
|
|
|
|
//
|
|
|
|
//===========================================================
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
namespace Tiio {
|
2016-06-29 18:17:12 +12:00
|
|
|
class AviWriterProperties final : public TPropertyGroup {
|
2018-06-04 15:18:43 +12:00
|
|
|
Q_DECLARE_TR_FUNCTIONS(AviWriterProperties)
|
2016-03-19 06:57:51 +13:00
|
|
|
public:
|
2016-06-15 18:43:10 +12:00
|
|
|
AviWriterProperties();
|
|
|
|
TEnumProperty m_codec;
|
|
|
|
static TEnumProperty m_defaultCodec;
|
2018-06-04 15:18:43 +12:00
|
|
|
|
|
|
|
void updateTranslation() override;
|
2016-03-19 06:57:51 +13:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
#endif // TIIO_AVI_H
|