Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
4.4 KiB

  1. // Copyright (c) 1996 - 1998 Microsoft Corporation. All Rights Reserved.
  2. #include <streams.h>
  3. #include "driver.h"
  4. // !!! make a property page for capturing a palette that only legacy has and
  5. // so it won't conflict with standard property pages of other cap filters
  6. // constructor
  7. //
  8. CPropPage::CPropPage (TCHAR * pszName, LPUNKNOWN punk, HRESULT *phr) :
  9. CBasePropertyPage(pszName, punk, IDD_PROPERTIES, IDS_NAME)
  10. ,m_pOpt(NULL)
  11. ,m_pPin(NULL)
  12. {
  13. DbgLog((LOG_TRACE,1,TEXT("CPropPage constructor")));
  14. }
  15. // create a new instance of this class
  16. //
  17. CUnknown *CPropPage::CreateInstance(LPUNKNOWN pUnk, HRESULT *phr)
  18. {
  19. return new CPropPage(NAME("VFW Capture Property Page"),pUnk,phr);
  20. }
  21. HRESULT CPropPage::OnConnect(IUnknown *pUnknown)
  22. {
  23. DbgLog((LOG_TRACE,2,TEXT("Getting IVfwCaptureOptions")));
  24. HRESULT hr = (pUnknown)->QueryInterface(IID_VfwCaptureOptions,
  25. (void **)&m_pOpt);
  26. if (FAILED(hr))
  27. return E_NOINTERFACE;
  28. // Now get our streaming pin's IPin... we want it in INITDIALOG
  29. IEnumPins *pins;
  30. IPin *pPin;
  31. IBaseFilter *pFilter;
  32. hr = pUnknown->QueryInterface(IID_IBaseFilter, (void **)&pFilter);
  33. if (FAILED(hr))
  34. return NOERROR; // oh well
  35. hr = pFilter->EnumPins(&pins);
  36. pFilter->Release();
  37. if (SUCCEEDED(hr)) {
  38. DWORD n;
  39. hr = pins->Next(1, &pPin, &n);
  40. if (hr == S_OK) {
  41. ASSERT(m_pPin == NULL);
  42. m_pPin = pPin;
  43. }
  44. pins->Release();
  45. }
  46. return NOERROR;
  47. }
  48. HRESULT CPropPage::OnDisconnect()
  49. {
  50. DbgLog((LOG_TRACE,2,TEXT("Releasing IVfwCaptureOptions")));
  51. if (m_pOpt)
  52. m_pOpt->Release();
  53. m_pOpt = NULL;
  54. if (m_pPin)
  55. m_pPin->Release();
  56. m_pPin = NULL;
  57. return NOERROR;
  58. }
  59. // Handles the messages for our property window
  60. //
  61. INT_PTR CPropPage::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  62. {
  63. HRESULT hr = E_FAIL;
  64. const int versize = 40;
  65. const int descsize = 40;
  66. DbgLog((LOG_TRACE,99,TEXT("CPropPage::DialogProc %08x %04x %08x %08x"),
  67. hwnd, uMsg, wParam, lParam));
  68. switch (uMsg)
  69. {
  70. case WM_INITDIALOG:
  71. // alpha compiler bug blows up if we don't encase this case in braces
  72. {
  73. DbgLog((LOG_TRACE,2,TEXT("Initializing the Dialog Box")));
  74. CAPTURESTATS cs;
  75. m_pOpt->VfwCapGetCaptureStats(&cs);
  76. SetDlgItemInt(hwnd, ID_FRAMESCAPTURED, (int)cs.dwlNumCaptured, FALSE);
  77. SetDlgItemInt(hwnd,ID_MSCAPTURED,(int)(cs.msCaptureTime / 1000),FALSE);
  78. SetDlgItemInt(hwnd, ID_FRAMESDROPPED, (int)cs.dwlNumDropped, FALSE);
  79. SetDlgItemInt(hwnd, ID_FRAMESPERSEC,(int)cs.flFrameRateAchieved,FALSE);
  80. SetDlgItemInt(hwnd, ID_BYTESPERSEC, (int)cs.flDataRateAchieved, FALSE);
  81. // Which dialog boxes does this driver have?
  82. EnableWindow(GetDlgItem(hwnd, ID_SOURCE),
  83. m_pOpt->VfwCapDriverDialog(hwnd,
  84. VIDEO_EXTERNALIN, VIDEO_DLG_QUERY) == 0);
  85. EnableWindow(GetDlgItem(hwnd, ID_FORMAT),
  86. m_pOpt->VfwCapDriverDialog(hwnd,
  87. VIDEO_IN, VIDEO_DLG_QUERY) == 0);
  88. EnableWindow(GetDlgItem(hwnd, ID_DISPLAY),
  89. m_pOpt->VfwCapDriverDialog(hwnd,
  90. VIDEO_EXTERNALOUT, VIDEO_DLG_QUERY) == 0);
  91. // put the driver name in the dialog box
  92. WCHAR wachVer[versize], wachDesc[descsize];
  93. TCHAR tachDesc[versize + descsize + 5];
  94. long lCap;
  95. IAMVideoCompression *pVC;
  96. if (m_pPin)
  97. hr = m_pPin->QueryInterface(IID_IAMVideoCompression,
  98. (void **)&pVC);
  99. if (hr == NOERROR) {
  100. LONG l1, l2;
  101. double l3;
  102. hr = pVC->GetInfo(wachVer, (int *)&versize, wachDesc,
  103. (int *)&versize, &l1, &l2, &l3, &lCap);
  104. if (hr == NOERROR) {
  105. wsprintf(tachDesc, TEXT("%ls %ls"), wachDesc, wachVer);
  106. SetDlgItemText(hwnd, ID_DESC, tachDesc);
  107. }
  108. pVC->Release();
  109. }
  110. return TRUE;
  111. }
  112. case WM_COMMAND:
  113. {
  114. UINT uID = GET_WM_COMMAND_ID(wParam,lParam);
  115. switch (uID)
  116. {
  117. case ID_SOURCE:
  118. case ID_FORMAT:
  119. case ID_DISPLAY:
  120. static UINT auType[] = {VIDEO_EXTERNALIN, VIDEO_IN,
  121. VIDEO_EXTERNALOUT};
  122. if (m_pOpt->VfwCapDriverDialog(hwnd,
  123. auType[uID - ID_SOURCE], FALSE) == NOERROR)
  124. m_bDirty = TRUE;
  125. break;
  126. }
  127. }
  128. return TRUE;
  129. }
  130. return FALSE;
  131. }