- Implemented ICSeqCompressFrame{Start,,End}
- Modified ICCompressorFree to properly free the initialized variables from ICSeqCompressFrameStart.
This commit is contained in:
parent
bae4a54539
commit
35da52d9ca
|
@ -747,20 +747,20 @@ void VFWAPI ICCompressorFree(PCOMPVARS pc)
|
||||||
ICClose(pc->hic);
|
ICClose(pc->hic);
|
||||||
pc->hic = NULL;
|
pc->hic = NULL;
|
||||||
}
|
}
|
||||||
if (pc->lpbiOut != NULL) {
|
if (pc->lpbiIn != NULL) {
|
||||||
GlobalFreePtr(pc->lpbiOut);
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
pc->lpbiOut = NULL;
|
pc->lpbiIn = NULL;
|
||||||
}
|
}
|
||||||
if (pc->lpBitsOut != NULL) {
|
if (pc->lpBitsOut != NULL) {
|
||||||
GlobalFreePtr(pc->lpBitsOut);
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
|
||||||
pc->lpBitsOut = NULL;
|
pc->lpBitsOut = NULL;
|
||||||
}
|
}
|
||||||
if (pc->lpBitsPrev != NULL) {
|
if (pc->lpBitsPrev != NULL) {
|
||||||
GlobalFreePtr(pc->lpBitsPrev);
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
|
||||||
pc->lpBitsPrev = NULL;
|
pc->lpBitsPrev = NULL;
|
||||||
}
|
}
|
||||||
if (pc->lpState != NULL) {
|
if (pc->lpState != NULL) {
|
||||||
GlobalFreePtr(pc->lpBitsPrev);
|
HeapFree(GetProcessHeap(), 0, pc->lpState);
|
||||||
pc->lpState = NULL;
|
pc->lpState = NULL;
|
||||||
}
|
}
|
||||||
pc->dwFlags = 0;
|
pc->dwFlags = 0;
|
||||||
|
@ -1119,7 +1119,55 @@ err:
|
||||||
*/
|
*/
|
||||||
LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL *pfKey, LONG *plSize)
|
LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL *pfKey, LONG *plSize)
|
||||||
{
|
{
|
||||||
FIXME("(%p, 0x%08x, %p, %p, %p), stub!\n", pc, uiFlags, lpBits, pfKey, plSize);
|
ICCOMPRESS* icComp = (ICCOMPRESS *)pc->lpState;
|
||||||
|
DWORD ret;
|
||||||
|
TRACE("(%p, 0x%08x, %p, %p, %p)\n", pc, uiFlags, lpBits, pfKey, plSize);
|
||||||
|
|
||||||
|
if (pc->cbState != sizeof(ICCOMPRESS))
|
||||||
|
{
|
||||||
|
ERR("Invalid cbState (%li should be %i)\n", pc->cbState, sizeof(ICCOMPRESS));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pc->lKeyCount++)
|
||||||
|
icComp->dwFlags = ICCOMPRESS_KEYFRAME;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pc->lKey && pc->lKeyCount == (pc->lKey - 1))
|
||||||
|
/* No key frames if pc->lKey == 0 */
|
||||||
|
pc->lKeyCount = 0;
|
||||||
|
icComp->dwFlags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
icComp->lpInput = lpBits;
|
||||||
|
icComp->lFrameNum = pc->lFrame++;
|
||||||
|
icComp->lpOutput = pc->lpBitsOut;
|
||||||
|
icComp->lpPrev = pc->lpBitsPrev;
|
||||||
|
ret = ICSendMessage(pc->hic, ICM_COMPRESS, (DWORD_PTR)icComp, sizeof(icComp));
|
||||||
|
|
||||||
|
if (icComp->dwFlags & AVIIF_KEYFRAME)
|
||||||
|
{
|
||||||
|
pc->lKeyCount = 1;
|
||||||
|
*pfKey = TRUE;
|
||||||
|
TRACE("Key frame\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*pfKey = FALSE;
|
||||||
|
|
||||||
|
*plSize = icComp->lpbiOutput->biSizeImage;
|
||||||
|
TRACE(" -- 0x%08lx\n", ret);
|
||||||
|
if (ret == ICERR_OK)
|
||||||
|
{
|
||||||
|
LPVOID oldprev, oldout;
|
||||||
|
/* We shift Prev and Out, so we don't have to allocate and release memory */
|
||||||
|
oldprev = pc->lpBitsPrev;
|
||||||
|
oldout = pc->lpBitsOut;
|
||||||
|
pc->lpBitsPrev = oldout;
|
||||||
|
pc->lpBitsOut = oldprev;
|
||||||
|
|
||||||
|
TRACE("returning: %p\n", icComp->lpOutput);
|
||||||
|
return icComp->lpOutput;
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1128,7 +1176,19 @@ LPVOID VFWAPI ICSeqCompressFrame(PCOMPVARS pc, UINT uiFlags, LPVOID lpBits, BOOL
|
||||||
*/
|
*/
|
||||||
void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc)
|
void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc)
|
||||||
{
|
{
|
||||||
FIXME("(%p), stub!\n", pc);
|
DWORD ret;
|
||||||
|
TRACE("(%p)\n", pc);
|
||||||
|
ret = ICSendMessage(pc->hic, ICM_COMPRESS_END, 0, 0);
|
||||||
|
TRACE(" -- %lx", ret);
|
||||||
|
if (pc->lpbiIn)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
|
if (pc->lpBitsPrev)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
|
||||||
|
if (pc->lpBitsOut)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
|
||||||
|
if (pc->lpState)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpState);
|
||||||
|
pc->lpbiIn = pc->lpBitsPrev = pc->lpBitsOut = pc->lpState = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1136,9 +1196,74 @@ void VFWAPI ICSeqCompressFrameEnd(PCOMPVARS pc)
|
||||||
*/
|
*/
|
||||||
BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn)
|
BOOL VFWAPI ICSeqCompressFrameStart(PCOMPVARS pc, LPBITMAPINFO lpbiIn)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %p), stub!\n", pc, lpbiIn);
|
/* I'm ignoring bmiColors as I don't know what to do with it,
|
||||||
|
* it doesn't appear to be used though
|
||||||
|
*/
|
||||||
|
DWORD ret;
|
||||||
|
pc->lpbiIn = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFO));
|
||||||
|
if (!pc->lpbiIn)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
memcpy(pc->lpbiIn, lpbiIn, sizeof(BITMAPINFO));
|
||||||
|
pc->lpBitsPrev = HeapAlloc(GetProcessHeap(), 0, pc->lpbiIn->bmiHeader.biSizeImage);
|
||||||
|
if (!pc->lpBitsPrev)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pc->lpState = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS));
|
||||||
|
if (!pc->lpState)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
pc->cbState = sizeof(ICCOMPRESS);
|
||||||
|
|
||||||
|
pc->lpBitsOut = HeapAlloc(GetProcessHeap(), 0, pc->lpbiOut->bmiHeader.biSizeImage);
|
||||||
|
if (!pc->lpBitsOut)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpState);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
TRACE("Compvars:\n"
|
||||||
|
"\tpc:\n"
|
||||||
|
"\tsize: %li\n"
|
||||||
|
"\tflags: %li\n"
|
||||||
|
"\thic: %p\n"
|
||||||
|
"\ttype: %lx\n"
|
||||||
|
"\thandler: %lx\n"
|
||||||
|
"\tin/out: %p/%p\n"
|
||||||
|
"key/data/quality: %li/%li/%li\n",
|
||||||
|
pc->cbSize, pc->dwFlags, pc->hic, pc->fccType, pc->fccHandler,
|
||||||
|
pc->lpbiIn, pc->lpbiOut, pc->lKey, pc->lDataRate, pc->lQ);
|
||||||
|
|
||||||
|
ret = ICSendMessage(pc->hic, ICM_COMPRESS_BEGIN, (DWORD)pc->lpbiIn, (DWORD)pc->lpbiOut);
|
||||||
|
TRACE(" -- %lx\n", ret);
|
||||||
|
if (ret == ICERR_OK)
|
||||||
|
{
|
||||||
|
ICCOMPRESS* icComp = (ICCOMPRESS *)pc->lpState;
|
||||||
|
/* Initialise some variables */
|
||||||
|
pc->lFrame = 0; pc->lKeyCount = 0;
|
||||||
|
|
||||||
|
icComp->lpbiOutput = &pc->lpbiOut->bmiHeader;
|
||||||
|
icComp->lpbiInput = &pc->lpbiIn->bmiHeader;
|
||||||
|
icComp->lpckid = NULL;
|
||||||
|
icComp->dwFrameSize = 0;
|
||||||
|
icComp->dwQuality = pc->lQ;
|
||||||
|
icComp->lpbiPrev = &pc->lpbiIn->bmiHeader;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpState);
|
||||||
|
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
|
||||||
|
pc->lpBitsPrev = pc->lpbiIn = pc->lpState = pc->lpBitsOut = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* GetFileNamePreview [MSVFW32.@]
|
* GetFileNamePreview [MSVFW32.@]
|
||||||
|
|
Loading…
Reference in New Issue