void CVideoOptions::RefreshCompressorButtons() { int sel = ((CComboBox *) GetDlgItem(IDC_COMPRESSORS))->GetCurSel(); if (sel != CB_ERR) { HIC hic = ICOpen(compressor_info[sel].fccType, compressor_info[sel].fccHandler, ICMODE_QUERY); if (hic) { if (ICQueryAbout(hic)) ((CButton *) GetDlgItem(ID_ABOUT))->EnableWindow(TRUE); else ((CButton *) GetDlgItem(ID_ABOUT))->EnableWindow(FALSE); if (ICQueryConfigure(hic)) ((CButton *) GetDlgItem(ID_CONFIGURE))->EnableWindow(TRUE); else ((CButton *) GetDlgItem(ID_CONFIGURE))->EnableWindow(FALSE); ICClose(hic); } } }
// queries a video compression driver to determine if it has an About dialog box. // Returns ICERR_OK if the driver supports this message or ICERR_UNSUPPORTED otherwise. // n.b Actually returns unsupported state ICERR_UNSUPPORTED; otherwise supported. DWORD CHIC::QueryAbout() { DWORD dwResult = ICQueryAbout(m_hIC); //TRACE("CHIC::QueryAbout : %s About\n", (ICERR_UNSUPPORTED == dwResult) ? "No" : "Have"); TRACE("CHIC::QueryAbout : %s About\n", (dwResult) ? "Have" : "No"); return dwResult; }
int AVInfo::GetCodecListSize(int width, int height) { if (m_plCodecList) { for (int i=0; i<m_codecListSize; ++i) delete m_plCodecList[i]; delete[] m_plCodecList; m_plCodecList = NULL; m_codecListSize = 0; } BITMAPINFO bmi; Make24BitRGB(&bmi.bmiHeader, width, height); ICINFO icInfo; ZeroMemory(&icInfo, sizeof ICINFO); icInfo.dwSize = sizeof ICINFO; int count = 0; std::vector<CODECINFO *> codecList; // The first codec is always uncompressed RGB // data. We can be sure this is the case here CODECINFO *pInfo = new CODECINFO; pInfo->fcc = MAKEFOURCC('D', 'I', 'B', ' '); pInfo->alternativeFcc = BI_RGB; pInfo->bHasAboutDialog = false; pInfo->bHasConfigureDialog = false; pInfo->bSupportsKeyframes = false; pInfo->bSupportsQuality = false; pInfo->nDefaultKeyframeRate = 1; pInfo->nDefaultQuality = 100; _tcscpy(pInfo->tszDescription, _T("DIB : <uncompressed>")); codecList.push_back(pInfo); while (ICInfo(ICTYPE_VIDEO, count, &icInfo)) { HIC hic = ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY); if (hic) { ICINFO moreInfo; ZeroMemory(&moreInfo, sizeof ICINFO); moreInfo.dwSize = sizeof ICINFO; if (ICGetInfo(hic, &moreInfo, sizeof ICINFO) > 0) { // Ignore MSVC/CRAM if (moreInfo.fccHandler != 'CVSM' && moreInfo.fccHandler != 'MARC') { if (ICERR_OK == ICCompressQuery(hic, &bmi, NULL)) { // Ok, this codec seems to be ok; put that // into the list CODECINFO *pInfo = new CODECINFO; ZeroMemory(pInfo, sizeof CODECINFO); char szFcc[5]; if (moreInfo.fccHandler != BI_RGB) { szFcc[0] = (moreInfo.fccHandler & 0x000000ff); szFcc[1] = (moreInfo.fccHandler & 0x0000ff00) >> 8; szFcc[2] = (moreInfo.fccHandler & 0x00ff0000) >> 16; szFcc[3] = (moreInfo.fccHandler & 0xff000000) >> 24; szFcc[4] = 0; } else strcpy(szFcc, "DIB "); bool bIsReallyOk = true; // We know that IV50 has restrictions. if (moreInfo.fccHandler == '05vi' || moreInfo.fccHandler == '05VI') { if (width % 4 != 0 || height % 4 != 0) bIsReallyOk = false; } // The following code should normally check if the codec // is really able encode a certain BITMAPINFO type. But, // This will fail for the HuffYUV codec. Thus, we have to // assume that it might fail for other codecs, too. /* if (moreInfo.fccHandler == BI_RGB) { bIsReallyOk = true; } else { // The codec says that the input format is ok. // Let's try to create an output format and try // again. For some resolutions, e.g. Indeo Video 5 // now fails to compress the format. AM_MEDIA_TYPE mtTmp; ZeroMemory(&mtTmp, sizeof AM_MEDIA_TYPE); bool cool = CreateStreamFormat(moreInfo.fccHandler, width, height, &mtTmp); if (cool) { BITMAPINFO bmiOut; ZeroMemory(&bmiOut, sizeof BITMAPINFO); bmiOut.bmiHeader = ((VIDEOINFOHEADER *) mtTmp.pbFormat)->bmiHeader; DWORD dwOk = ICCompressBegin(hic, &bmi, &bmiOut); if (ICERR_OK == dwOk) { // It's really ok to use this codec. bIsReallyOk = true; ICCompressEnd(hic); } } FreeMediaType(mtTmp); } */ if (bIsReallyOk) { // Copy the name #ifndef _UNICODE _TCHAR tszDesc[128]; if (WideCharToMultiByte(CP_ACP, 0, moreInfo.szDescription, -1, tszDesc, 128, NULL, NULL) == 0) strcpy(tszDesc, "<unknown>"); sprintf(pInfo->tszDescription, "(%s): %s", szFcc, tszDesc); #else _stprintf(pInfo->tszDescription, _T("(%S): %s"), szFcc, moreInfo.szDescription); #endif pInfo->fcc = moreInfo.fccHandler; pInfo->alternativeFcc = icInfo.fccHandler; pInfo->bSupportsKeyframes = (moreInfo.dwFlags & VIDCF_TEMPORAL) > 0; pInfo->bSupportsQuality = (moreInfo.dwFlags & VIDCF_QUALITY) > 0; if (pInfo->bSupportsKeyframes) pInfo->nDefaultKeyframeRate = ICGetDefaultKeyFrameRate(hic); else pInfo->nDefaultKeyframeRate = 0; if (pInfo->bSupportsQuality) pInfo->nDefaultQuality = ICGetDefaultQuality(hic) / 100; else pInfo->nDefaultQuality = 0; pInfo->bHasConfigureDialog = ICQueryConfigure(hic) == TRUE ? true : false; pInfo->bHasAboutDialog = ICQueryAbout(hic) == TRUE ? true : false; codecList.push_back(pInfo); } } } }
static INT_PTR CALLBACK icm_choose_compressor_dlgproc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_INITDIALOG: { struct codec_info *ic; WCHAR buf[128]; struct choose_compressor *choose_comp = (struct choose_compressor *)lparam; SetWindowLongPtrW(hdlg, DWLP_USER, lparam); /* FIXME */ choose_comp->flags &= ~(ICMF_CHOOSE_DATARATE | ICMF_CHOOSE_KEYFRAME); if (choose_comp->title) SetWindowTextA(hdlg, choose_comp->title); if (!(choose_comp->flags & ICMF_CHOOSE_DATARATE)) { ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_CHECKBOX), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_DATARATE), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_DATARATE_KB), SW_HIDE); } if (!(choose_comp->flags & ICMF_CHOOSE_KEYFRAME)) { 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; }