// AviFromBmp.cpp: implementation of the CAviFromBmp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "bta.h"
#include "AviFromBmp.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAviFromBmp::CAviFromBmp()
{
AVIFileInit();
m_hBmp = NULL;
m_pAviFile = NULL;
m_pStream = NULL;
m_pCompStream =NULL;
m_frameNum = 0;
}
CAviFromBmp::~CAviFromBmp()
{
CloseAvi();
AVIFileExit();
}
void CAviFromBmp::ReGetBmpInfo()
{
}
void CAviFromBmp::CloseAvi()
{
if (m_hBmp) {
CloseHandle(m_hBmp);
}
if(m_pStream) {
AVIStreamRelease(m_pStream);
m_pStream = NULL;
}
if(m_pCompStream) {
AVIStreamRelease(m_pCompStream);
m_pCompStream =NULL;
}
if(m_pAviFile) {
AVIFileRelease(m_pAviFile);
m_pAviFile= NULL;
}
}
void CAviFromBmp::AviInitFormat(CString avifile)
{
if(FAILED(AVIFileOpen(&m_pAviFile,avifile,OF_CREATE|OF_WRITE, NULL))) {
MessageBox(NULL,"error","open error",NULL);
return;
}
}
void CAviFromBmp::AviAddBmp(CString bmpfile)
{
if (m_hBmp) {
CloseHandle(m_hBmp);
}
m_hBmp = (HBITMAP)LoadImage(NULL, bmpfile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
GetObject(m_hBmp, sizeof(BITMAP), &m_bm);
//set bmp info
ZeroMemory(&m_bmpInfo,sizeof(BITMAPINFO));
m_bmpInfo.bmiHeader.biPlanes = 1;
m_bmpInfo.bmiHeader.biWidth = m_bm.bmWidth;
m_bmpInfo.bmiHeader.biHeight = m_bm.bmHeight;
m_bmpInfo.bmiHeader.biCompression = BI_RGB;
m_bmpInfo.bmiHeader.biBitCount = m_bm.bmBitsPixel;
m_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
m_bmpInfo.bmiHeader.biSizeImage = m_bmpInfo.bmiHeader.biWidth*m_bmpInfo.bmiHeader.biHeight*m_bmpInfo.bmiHeader.biBitCount/8;
if(m_frameNum == 0)
{
InitStream();
}
StreamWrite();
}
void CAviFromBmp::StreamWrite()
{
CBitmap cbmp;
cbmp.Attach(m_hBmp);
LPVOID lpBits = (LPVOID)GlobalAlloc(GPTR,m_bm.bmWidth*m_bm.bmHeight*4);
cbmp.GetBitmapBits(m_bm.bmWidth*m_bm.bmHeight*4,lpBits);
if(FAILED(AVIStreamWrite(m_pCompStream,m_frameNum,1,lpBits,m_bm.bmWidth*m_bm.bmHeight*4,0,NULL,NULL)))
{
MessageBox(NULL,"error","stream write error",NULL);
return;
}
m_frameNum++;
GlobalFree(lpBits);
}
void CAviFromBmp::InitStream()
{
if (!m_pAviFile) {
return;
}
//stream
AVISTREAMINFOA psi;
ZeroMemory(&psi,sizeof(AVISTREAMINFOA));
_tcscpy(psi.szName, _T("Video Stream"));
psi.fccType = streamtypeVIDEO;
psi.fccHandler = mmioFOURCC('M','S','V','C'); //mmioFOURCC('M','S','V','C');
psi.dwScale = 1;
psi.dwRate = 1;
psi.dwQuality = -1;
psi.dwSuggestedBufferSize = m_bm.bmWidth * m_bm.bmHeight * 4;
SetRect(&psi.rcFrame, 0, 0, m_bm.bmWidth, m_bm.bmHeight);
if(FAILED(AVIFileCreateStream(m_pAviFile,&m_pStream, &psi)))
{
MessageBox(NULL,"error","stream error",NULL);
return;
}
//compress stream
AVICOMPRESSOPTIONS options;
ZeroMemory(&options,sizeof(AVICOMPRESSOPTIONS));
options.fccType = streamtypeVIDEO;
options.fccHandler = psi.fccHandler;
options.dwKeyFrameEvery = 1;
options.dwFlags = AVICOMPRESSF_VALID|AVICOMPRESSF_KEYFRAMES;
if(FAILED(AVIMakeCompressedStream(&m_pCompStream, m_pStream, &options, NULL)))
{
MessageBox(NULL,"error","stream ccc error",NULL);
return;
}
//set steam format
AVIStreamSetFormat(m_pCompStream, 0, (LPVOID)&m_bmpInfo, m_bmpInfo.bmiHeader.biSize);
}