Source code of Windows XP (NT5)
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.

161 lines
4.2 KiB

  1. /******************************Module*Header*******************************\
  2. * Module Name: VMRDeinterlace.cpp
  3. *
  4. *
  5. *
  6. *
  7. * Created: Wed 03/13/2002
  8. * Author: Stephen Estrop [StEstrop]
  9. *
  10. * Copyright (c) 2002 Microsoft Corporation
  11. \**************************************************************************/
  12. #include <streams.h>
  13. #include "vmrenderer.h"
  14. /******************************Public*Routine******************************\
  15. * CVMRDeinterlaceContainer
  16. *
  17. *
  18. *
  19. * History:
  20. * Thu 02/28/2002 - StEstrop - Created
  21. *
  22. \**************************************************************************/
  23. CVMRDeinterlaceContainer::CVMRDeinterlaceContainer(
  24. LPDIRECTDRAW7 pDD,
  25. HRESULT* phr
  26. ) :
  27. m_pIDDVAContainer(NULL),
  28. m_pIDDVideoAccelerator(NULL)
  29. {
  30. HRESULT hr = DD_OK;
  31. __try {
  32. CHECK_HR(hr = pDD->QueryInterface(IID_IDDVideoAcceleratorContainer,
  33. (void**)&m_pIDDVAContainer));
  34. GUID guid;
  35. DDVAUncompDataInfo UncompInfo = {sizeof(DDVAUncompDataInfo), 0, 0, 0};
  36. CopyMemory(&guid, &DXVA_DeinterlaceContainerDevice, sizeof(GUID));
  37. CHECK_HR(hr = m_pIDDVAContainer->CreateVideoAccelerator(
  38. &guid, &UncompInfo,
  39. NULL, 0,
  40. &m_pIDDVideoAccelerator,
  41. NULL));
  42. }
  43. __finally {
  44. if (hr != DD_OK) {
  45. RELEASE(m_pIDDVideoAccelerator);
  46. RELEASE(m_pIDDVAContainer);
  47. *phr = hr;
  48. }
  49. }
  50. }
  51. /******************************Public*Routine******************************\
  52. * ~CVMRDeinterlaceContainer
  53. *
  54. *
  55. *
  56. * History:
  57. * Thu 02/28/2002 - StEstrop - Created
  58. *
  59. \**************************************************************************/
  60. CVMRDeinterlaceContainer::~CVMRDeinterlaceContainer()
  61. {
  62. RELEASE(m_pIDDVideoAccelerator);
  63. RELEASE(m_pIDDVAContainer);
  64. }
  65. /******************************Public*Routine******************************\
  66. * QueryAvailableModes
  67. *
  68. *
  69. *
  70. * History:
  71. * Thu 02/28/2002 - StEstrop - Created
  72. *
  73. \**************************************************************************/
  74. HRESULT
  75. CVMRDeinterlaceContainer::QueryAvailableModes(
  76. LPDXVA_VideoDesc lpVideoDescription,
  77. LPDWORD lpdwNumModesSupported,
  78. LPGUID pGuidsDeinterlaceModes
  79. )
  80. {
  81. // lpInput => DXVA_VideoDesc*
  82. // lpOuput => DXVA_DeinterlaceQueryAvailableModes*
  83. DXVA_DeinterlaceQueryAvailableModes qam;
  84. qam.Size = sizeof(DXVA_DeinterlaceQueryAvailableModes);
  85. qam.NumGuids = MAX_DEINTERLACE_DEVICE_GUIDS;
  86. ZeroMemory(&qam.Guids[0], MAX_DEINTERLACE_DEVICE_GUIDS);
  87. HRESULT hr = m_pIDDVideoAccelerator->Execute(
  88. DXVA_DeinterlaceQueryAvailableModesFnCode,
  89. (LPVOID)lpVideoDescription, sizeof(LPDXVA_VideoDesc),
  90. &qam, sizeof(qam),
  91. 0, NULL);
  92. if (hr == DD_OK) {
  93. DWORD NumGUIDs;
  94. if (pGuidsDeinterlaceModes) {
  95. NumGUIDs = min(*lpdwNumModesSupported, qam.NumGuids);
  96. for (DWORD i = 0; i < NumGUIDs; i++) {
  97. pGuidsDeinterlaceModes[i] = qam.Guids[i];
  98. }
  99. }
  100. else {
  101. NumGUIDs = qam.NumGuids;
  102. }
  103. *lpdwNumModesSupported = NumGUIDs;
  104. }
  105. return hr;
  106. }
  107. /******************************Public*Routine******************************\
  108. * QueryModeCaps
  109. *
  110. *
  111. *
  112. * History:
  113. * Thu 02/28/2002 - StEstrop - Created
  114. *
  115. \**************************************************************************/
  116. HRESULT
  117. CVMRDeinterlaceContainer::QueryModeCaps(
  118. LPGUID pGuidDeinterlaceMode,
  119. LPDXVA_VideoDesc lpVideoDescription,
  120. LPDXVA_DeinterlaceCaps lpDeinterlaceCaps
  121. )
  122. {
  123. // lpInput => DXVA_DeinterlaceQueryModeCaps*
  124. // lpOuput => DXVA_DeinterlaceCaps*
  125. DXVA_DeinterlaceQueryModeCaps qmc;
  126. qmc.Size = sizeof(DXVA_DeinterlaceQueryModeCaps),
  127. qmc.Guid = *pGuidDeinterlaceMode;
  128. qmc.VideoDesc = *lpVideoDescription;
  129. HRESULT hr = m_pIDDVideoAccelerator->Execute(
  130. DXVA_DeinterlaceQueryModeCapsFnCode,
  131. &qmc, sizeof(qmc),
  132. lpDeinterlaceCaps, sizeof(DXVA_DeinterlaceCaps),
  133. 0, NULL);
  134. return hr;
  135. }