📄 msvideo_main.c
字号:
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_CHECKBOX), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME), SW_HIDE);
ShowWindow(GetDlgItem(hdlg, IDC_KEYFRAME_FRAMES), SW_HIDE);
}
/* FIXME */
EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_SCROLL), FALSE);
EnableWindow(GetDlgItem(hdlg, IDC_QUALITY_TXT), FALSE);
/*if (!(choose_comp->flags & ICMF_CHOOSE_PREVIEW))
ShowWindow(GetDlgItem(hdlg, IDC_PREVIEW), SW_HIDE);*/
LoadStringW(MSVFW32_hModule, IDS_FULLFRAMES, buf, 128);
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_ADDSTRING, 0, (LPARAM)buf);
ic = HeapAlloc(GetProcessHeap(), 0, sizeof(struct codec_info));
ic->icinfo.fccType = streamtypeVIDEO;
ic->icinfo.fccHandler = comptypeDIB;
ic->hic = 0;
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETITEMDATA, 0, (LPARAM)ic);
enum_compressors(GetDlgItem(hdlg, IDC_COMP_LIST), &choose_comp->cv, choose_comp->flags & ICMF_CHOOSE_ALLCOMPRESSORS);
SendDlgItemMessageW(hdlg, IDC_COMP_LIST, CB_SETCURSEL, 0, 0);
SetFocus(GetDlgItem(hdlg, IDC_COMP_LIST));
SetWindowLongPtrW(hdlg, DWLP_USER, (ULONG_PTR)choose_comp);
break;
}
case WM_COMMAND:
switch (LOWORD(wparam))
{
case IDC_COMP_LIST:
{
INT cur_sel;
struct codec_info *ic;
BOOL can_configure = FALSE, can_about = FALSE;
struct choose_compressor *choose_comp;
if (HIWORD(wparam) != CBN_SELCHANGE && HIWORD(wparam) != CBN_SETFOCUS)
break;
choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER);
cur_sel = SendMessageW((HWND)lparam, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW((HWND)lparam, CB_GETITEMDATA, cur_sel, 0);
if (ic && ic->hic)
{
if (ICQueryConfigure(ic->hic) == DRVCNF_OK)
can_configure = TRUE;
if (ICQueryAbout(ic->hic) == DRVCNF_OK)
can_about = TRUE;
}
EnableWindow(GetDlgItem(hdlg, IDC_CONFIGURE), can_configure);
EnableWindow(GetDlgItem(hdlg, IDC_ABOUT), can_about);
if (choose_comp->flags & ICMF_CHOOSE_DATARATE)
{
/* FIXME */
}
if (choose_comp->flags & ICMF_CHOOSE_KEYFRAME)
{
/* FIXME */
}
break;
}
case IDC_CONFIGURE:
case IDC_ABOUT:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT cur_sel;
struct codec_info *ic;
if (HIWORD(wparam) != BN_CLICKED)
break;
cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0);
if (ic && ic->hic)
{
if (LOWORD(wparam) == IDC_CONFIGURE)
ICConfigure(ic->hic, hdlg);
else
ICAbout(ic->hic, hdlg);
}
break;
}
case IDOK:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT cur_sel;
struct codec_info *ic;
if (HIWORD(wparam) != BN_CLICKED)
break;
cur_sel = SendMessageW(list, CB_GETCURSEL, 0, 0);
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, cur_sel, 0);
if (ic)
{
struct choose_compressor *choose_comp = (struct choose_compressor *)GetWindowLongPtrW(hdlg, DWLP_USER);
choose_comp->cv.hic = ic->hic;
choose_comp->cv.fccType = ic->icinfo.fccType;
choose_comp->cv.fccHandler = ic->icinfo.fccHandler;
/* FIXME: fill everything else */
/* prevent closing the codec handle below */
ic->hic = 0;
}
}
/* fall through */
case IDCANCEL:
{
HWND list = GetDlgItem(hdlg, IDC_COMP_LIST);
INT idx = 0;
if (HIWORD(wparam) != BN_CLICKED)
break;
while (1)
{
struct codec_info *ic;
ic = (struct codec_info *)SendMessageW(list, CB_GETITEMDATA, idx++, 0);
if (!ic || (LONG_PTR)ic == CB_ERR) break;
if (ic->hic) ICClose(ic->hic);
HeapFree(GetProcessHeap(), 0, ic);
}
EndDialog(hdlg, LOWORD(wparam) == IDOK);
break;
}
default:
break;
}
break;
default:
break;
}
return FALSE;
}
/***********************************************************************
* ICCompressorChoose [MSVFW32.@]
*/
BOOL VFWAPI ICCompressorChoose(HWND hwnd, UINT uiFlags, LPVOID pvIn,
LPVOID lpData, PCOMPVARS pc, LPSTR lpszTitle)
{
struct choose_compressor choose_comp;
BOOL ret;
TRACE("(%p,%08x,%p,%p,%p,%s)\n", hwnd, uiFlags, pvIn, lpData, pc, lpszTitle);
if (!pc || pc->cbSize != sizeof(COMPVARS))
return FALSE;
if (!(pc->dwFlags & ICMF_COMPVARS_VALID))
{
pc->dwFlags = 0;
pc->fccType = pc->fccHandler = 0;
pc->hic = NULL;
pc->lpbiIn = NULL;
pc->lpbiOut = NULL;
pc->lpBitsOut = pc->lpBitsPrev = pc->lpState = NULL;
pc->lQ = ICQUALITY_DEFAULT;
pc->lKey = -1;
pc->lDataRate = 300; /* kB */
pc->lpState = NULL;
pc->cbState = 0;
}
if (pc->fccType == 0)
pc->fccType = ICTYPE_VIDEO;
choose_comp.cv = *pc;
choose_comp.flags = uiFlags;
choose_comp.title = lpszTitle;
ret = DialogBoxParamW(MSVFW32_hModule, MAKEINTRESOURCEW(ICM_CHOOSE_COMPRESSOR), hwnd,
icm_choose_compressor_dlgproc, (LPARAM)&choose_comp);
if (ret)
{
*pc = choose_comp.cv;
pc->dwFlags |= ICMF_COMPVARS_VALID;
}
return ret;
}
/***********************************************************************
* ICCompressorFree [MSVFW32.@]
*/
void VFWAPI ICCompressorFree(PCOMPVARS pc)
{
TRACE("(%p)\n",pc);
if (pc != NULL && pc->cbSize == sizeof(COMPVARS)) {
if (pc->hic != NULL) {
ICClose(pc->hic);
pc->hic = NULL;
}
HeapFree(GetProcessHeap(), 0, pc->lpbiIn);
pc->lpbiIn = NULL;
HeapFree(GetProcessHeap(), 0, pc->lpBitsOut);
pc->lpBitsOut = NULL;
HeapFree(GetProcessHeap(), 0, pc->lpBitsPrev);
pc->lpBitsPrev = NULL;
HeapFree(GetProcessHeap(), 0, pc->lpState);
pc->lpState = NULL;
pc->dwFlags = 0;
}
}
/******************************************************************
* MSVIDEO_SendMessage
*
*
*/
LRESULT MSVIDEO_SendMessage(WINE_HIC* whic, UINT msg, DWORD_PTR lParam1, DWORD_PTR lParam2)
{
LRESULT ret;
#define XX(x) case x: TRACE("(%p,"#x",0x%08lx,0x%08lx)\n",whic,lParam1,lParam2); break;
switch (msg) {
/* DRV_* */
XX(DRV_LOAD);
XX(DRV_ENABLE);
XX(DRV_OPEN);
XX(DRV_CLOSE);
XX(DRV_DISABLE);
XX(DRV_FREE);
/* ICM_RESERVED+X */
XX(ICM_ABOUT);
XX(ICM_CONFIGURE);
XX(ICM_GET);
XX(ICM_GETINFO);
XX(ICM_GETDEFAULTQUALITY);
XX(ICM_GETQUALITY);
XX(ICM_GETSTATE);
XX(ICM_SETQUALITY);
XX(ICM_SET);
XX(ICM_SETSTATE);
/* ICM_USER+X */
XX(ICM_COMPRESS_FRAMES_INFO);
XX(ICM_COMPRESS_GET_FORMAT);
XX(ICM_COMPRESS_GET_SIZE);
XX(ICM_COMPRESS_QUERY);
XX(ICM_COMPRESS_BEGIN);
XX(ICM_COMPRESS);
XX(ICM_COMPRESS_END);
XX(ICM_DECOMPRESS_GET_FORMAT);
XX(ICM_DECOMPRESS_QUERY);
XX(ICM_DECOMPRESS_BEGIN);
XX(ICM_DECOMPRESS);
XX(ICM_DECOMPRESS_END);
XX(ICM_DECOMPRESS_SET_PALETTE);
XX(ICM_DECOMPRESS_GET_PALETTE);
XX(ICM_DRAW_QUERY);
XX(ICM_DRAW_BEGIN);
XX(ICM_DRAW_GET_PALETTE);
XX(ICM_DRAW_START);
XX(ICM_DRAW_STOP);
XX(ICM_DRAW_END);
XX(ICM_DRAW_GETTIME);
XX(ICM_DRAW);
XX(ICM_DRAW_WINDOW);
XX(ICM_DRAW_SETTIME);
XX(ICM_DRAW_REALIZE);
XX(ICM_DRAW_FLUSH);
XX(ICM_DRAW_RENDERBUFFER);
XX(ICM_DRAW_START_PLAY);
XX(ICM_DRAW_STOP_PLAY);
XX(ICM_DRAW_SUGGESTFORMAT);
XX(ICM_DRAW_CHANGEPALETTE);
XX(ICM_GETBUFFERSWANTED);
XX(ICM_GETDEFAULTKEYFRAMERATE);
XX(ICM_DECOMPRESSEX_BEGIN);
XX(ICM_DECOMPRESSEX_QUERY);
XX(ICM_DECOMPRESSEX);
XX(ICM_DECOMPRESSEX_END);
XX(ICM_SET_STATUS_PROC);
default:
FIXME("(%p,0x%08x,0x%08lx,0x%08lx) unknown message\n",whic,(DWORD)msg,lParam1,lParam2);
}
#undef XX
if (whic->driverproc) {
/* dwDriverId parameter is the value returned by the DRV_OPEN */
ret = whic->driverproc(whic->driverId, whic->hdrv, msg, lParam1, lParam2);
} else {
ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2);
}
TRACE(" -> 0x%08lx\n", ret);
return ret;
}
/***********************************************************************
* ICSendMessage [MSVFW32.@]
*/
LRESULT VFWAPI ICSendMessage(HIC hic, UINT msg, DWORD_PTR lParam1, DWORD_PTR lParam2)
{
WINE_HIC* whic = MSVIDEO_GetHicPtr(hic);
if (!whic) return ICERR_BADHANDLE;
return MSVIDEO_SendMessage(whic, msg, lParam1, lParam2);
}
/***********************************************************************
* ICDrawBegin [MSVFW32.@]
*/
DWORD VFWAPIV ICDrawBegin(
HIC hic, /* [in] */
DWORD dwFlags, /* [in] flags */
HPALETTE hpal, /* [in] palette to draw with */
HWND hwnd, /* [in] window to draw to */
HDC hdc, /* [in] HDC to draw to */
INT xDst, /* [in] destination rectangle */
INT yDst, /* [in] */
INT dxDst, /* [in] */
INT dyDst, /* [in] */
LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw */
INT xSrc, /* [in] source rectangle */
INT ySrc, /* [in] */
INT dxSrc, /* [in] */
INT dySrc, /* [in] */
DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */
DWORD dwScale) /* [in] */
{
ICDRAWBEGIN icdb;
TRACE("(%p,%d,%p,%p,%p,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n",
hic, dwFlags, hpal, hwnd, hdc, xDst, yDst, dxDst, dyDst,
lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, dwScale);
icdb.dwFlags = dwFlags;
icdb.hpal = hpal;
icdb.hwnd = hwnd;
icdb.hdc = hdc;
icdb.xDst = xDst;
icdb.yDst = yDst;
icdb.dxDst = dxDst;
icdb.dyDst = dyDst;
icdb.lpbi = lpbi;
icdb.xSrc = xSrc;
icdb.ySrc = ySrc;
icdb.dxSrc = dxSrc;
icdb.dySrc = dySrc;
icdb.dwRate = dwRate;
icdb.dwScale = dwScale;
return ICSendMessage(hic,ICM_DRAW_BEGIN,(DWORD_PTR)&icdb,sizeof(icdb));
}
/***********************************************************************
* ICDraw [MSVFW32.@]
*/
DWORD VFWAPIV ICDraw(HIC hic, DWORD dwFlags, LPVOID lpFormat, LPVOID lpData, DWORD cbData, LONG lTime) {
ICDRAW icd;
TRACE("(%p,%d,%p,%p,%d,%d)\n",hic,dwFlags,lpFormat,lpData,cbData,lTime);
icd.dwFlags = dwFlags;
icd.lpFormat = lpFormat;
icd.lpData = lpData;
icd.cbData = cbData;
icd.lTime = lTime;
return ICSendMessage(hic,ICM_DRAW,(DWORD_PTR)&icd,sizeof(icd));
}
/***********************************************************************
* ICClose [MSVFW32.@]
*/
LRESULT WINAPI ICClose(HIC hic)
{
WINE_HIC* whic = MSVIDEO_GetHicPtr(hic);
WINE_HIC** p;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -