stretchdibits fails
This is my function that I wrote to extract AVI frames from AVI file.
Actually I wanted to get avi frames into DIB format, converter it DDB
and then save it to a file, This is a function that I write to do so,
Here SetDIBits function returns O (Error), I don't know what am I
doing wrong, Could anyone please tell where I am wrong.
BOOL CAviFile::ExtractAVIFrames(CString szFileName)
{
AVIFileInit();
PAVIFILE avi;
int res = AVIFileOpen(&avi, szFileName, OF_READ, NULL);
if (res!=AVIERR_OK)
{
//an error occures
if (avi != NULL)
AVIFileRelease(avi);
return FALSE;
}
AVIFILEINFO avi_info;
AVIFileInfo(avi, &avi_info, sizeof(AVIFILEINFO));
CString szFileInfo;
szFileInfo.Format(_T("Dimention: %dx%d\n")
_T("Length: %d frames\n")
_T("Max bytes per second: %d\n")
_T("Samples per second: %d\n")
_T("Streams: %d\n")
_T("File Type: %d"), avi_info.dwWidth,
avi_info.dwHeight,
avi_info.dwLength,
avi_info.dwMaxBytesPerSec,
(DWORD) (avi_info.dwRate /
avi_info.dwScale),
avi_info.dwStreams,
avi_info.szFileType);
//AfxMessageBox(szFileInfo, MB_ICONINFORMATION | MB_OK);
PAVISTREAM pStream;
res=AVIFileGetStream(avi, &pStream, streamtypeVIDEO /*video
stream*/,
0 /*first stream*/);
if (res!=AVIERR_OK)
{
if (pStream!=NULL)
AVIStreamRelease(pStream);
AVIFileExit();
return FALSE;
}
//do some task with the stream
int iNumFrames;
int iFirstFrame;
iFirstFrame=AVIStreamStart(pStream);
if (iFirstFrame==-1)
{
//Error getteing the frame inside the stream
if (pStream!=NULL)
AVIStreamRelease(pStream);
AVIFileExit();
return FALSE;
}
iNumFrames=AVIStreamLength(pStream);
if (iNumFrames==-1)
{
//Error getteing the number of frames inside the stream
if (pStream!=NULL)
AVIStreamRelease(pStream);
AVIFileExit();
return FALSE;
}
PGETFRAME pFrame;
pFrame = AVIStreamGetFrameOpen(pStream,NULL/*(BITMAPINFOHEADER*)
AVIGETFRAMEF_BESTDISPLAYFMT*/ /*&bih*/);
//Get the first frame
int index=0;
for (int i = iFirstFrame; i<iNumFrames; i++)
{
HBITMAP hBitmap;
index = i-iFirstFrame;
BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, index);
if(!pDIB)
{
TCHAR szError[1024]={0};
wsprintf(szError,_T("AVIStreamGetFrame failed
to return DIB bits,
Error:%d"),GetLastError());
OutputDebugString(szError);
}
int iHeight = ((LPBITMAPINFOHEADER)pDIB)->biHeight;
int iWidth = ((LPBITMAPINFOHEADER)pDIB)->biWidth;
HDC hDC = GetDC(NULL);
if(!hDC)
{
TCHAR szError[1024]={0};
wsprintf(szError,_T("CreateCompatibleDC
failed, Error:
%d"),GetLastError());
OutputDebugString(szError);
}
// Get compatible DC
HDC hMemDC = CreateCompatibleDC(hDC);
if(!hMemDC)
{
TCHAR szError[1024]={0};
wsprintf(szError,_T("CreateCompatibleDC
failed, Error:
%d"),GetLastError());
OutputDebugString(szError);
}
hBitmap =
CreateCompatibleBitmap(hMemDC,iWidth,iHeight);
if(!hBitmap)
{
TCHAR szError[1024]={0};
wsprintf(szError,_T("CreateCompatibleBitmap
failed, Error:
%d"),GetLastError());
OutputDebugString(szError);
}
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo,sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biBitCount = 32;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = iWidth * iHeight * 4;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biHeight = iHeight;
bmpInfo.bmiHeader.biWidth = iWidth;
//get the BitmapInfoHeader
BITMAPINFOHEADER bih;
RtlMoveMemory(&bih.biSize, pDIB,
sizeof(BITMAPINFOHEADER));
//now get the bitmap bits
if (bih.biSize < 1)
{
return FALSE;
}
BYTE* Bits = new BYTE[bih.biSize];
RtlMoveMemory(Bits, pDIB + sizeof(BITMAPINFOHEADER),
bih.biSize);
BYTE memBitmapInfo[40];
RtlMoveMemory(memBitmapInfo, &bih, sizeof(bih));
int nScanLines = SetDIBits(hDC, hBitmap, 0, iHeight,
Bits,
(BITMAPINFO*)memBitmapInfo, DIB_RGB_COLORS);
TCHAR szError[1024]={0};
wsprintf(szError,_T("SetDIBits, No Of scan lines:%d,
Error:
%d"),nScanLines,GetLastError());
OutputDebugString(szError);
// Create DDB into hMemDC
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC,
hBitmap);
// Copy hMemDC into hDC
if(!BitBlt(hMemDC, 0, 0, (WORD)iWidth,
(WORD)iHeight,hDC,0, 0,
SRCCOPY))
{
TCHAR szError[1024]={0};
wsprintf(szError,_T("BitBlt failed , Error:
%d"),GetLastError());
OutputDebugString(szError);
}
hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
SaveBitmap("C:\\Capture.bmp",hBitmap);
delete [] Bits;
DeleteObject(SelectObject(hMemDC, hBitmap));
DeleteDC(hMemDC);
ReleaseDC(NULL,hDC);
//CreateFromPackedDIBPointer(pDIB, index);
}
AVIStreamGetFrameClose(pFrame);
//close the stream after finishing the task
if (pStream!=NULL)
AVIStreamRelease(pStream);
AVIFileExit();
return TRUE;