[host] Added experimental H264 compression to DXGI (disabled by default)

This is not yet working, the client is yet to be updated to support
decompressing this stream.
This commit is contained in:
Geoffrey McRae
2017-12-29 20:53:52 +11:00
parent 3d9230ac93
commit 03622f61b0
9 changed files with 687 additions and 115 deletions

View File

@@ -24,14 +24,17 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#define W32_LEAN_AND_MEAN
#include <windows.h>
#include <shlwapi.h>
#include <dxgi1_2.h>
#include <d3d11.h>
#include <mftransform.h>
#include <stdio.h>
#include <comdef.h>
_COM_SMARTPTR_TYPEDEF(IDXGIFactory1 , __uuidof(IDXGIFactory1 ));
_COM_SMARTPTR_TYPEDEF(ID3D11Device , __uuidof(ID3D11Device ));
_COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext , __uuidof(ID3D11DeviceContext ));
_COM_SMARTPTR_TYPEDEF(ID3D10Multithread , __uuidof(ID3D10Multithread ));
_COM_SMARTPTR_TYPEDEF(IDXGIDevice , __uuidof(IDXGIDevice ));
_COM_SMARTPTR_TYPEDEF(IDXGIOutput1 , __uuidof(IDXGIOutput1 ));
_COM_SMARTPTR_TYPEDEF(IDXGIOutput , __uuidof(IDXGIOutput ));
@@ -40,17 +43,28 @@ _COM_SMARTPTR_TYPEDEF(IDXGIOutputDuplication, __uuidof(IDXGIOutputDuplication));
_COM_SMARTPTR_TYPEDEF(ID3D11Texture2D , __uuidof(ID3D11Texture2D ));
_COM_SMARTPTR_TYPEDEF(IDXGIResource , __uuidof(IDXGIResource ));
_COM_SMARTPTR_TYPEDEF(IMFActivate , __uuidof(IMFActivate ));
_COM_SMARTPTR_TYPEDEF(IMFAttributes , __uuidof(IMFAttributes ));
_COM_SMARTPTR_TYPEDEF(IMFDXGIDeviceManager , __uuidof(IMFDXGIDeviceManager ));
_COM_SMARTPTR_TYPEDEF(IMFTransform , __uuidof(IMFTransform ));
_COM_SMARTPTR_TYPEDEF(IMFMediaEventGenerator, __uuidof(IMFMediaEventGenerator));
_COM_SMARTPTR_TYPEDEF(IMFMediaType , __uuidof(IMFMediaType ));
_COM_SMARTPTR_TYPEDEF(IMFSample , __uuidof(IMFSample ));
_COM_SMARTPTR_TYPEDEF(IMFMediaBuffer , __uuidof(IMFMediaBuffer ));
_COM_SMARTPTR_TYPEDEF(IMF2DBuffer , __uuidof(IMF2DBuffer ));
namespace Capture
{
class DXGI : public ICapture
class DXGI : public ICapture, public IMFAsyncCallback
{
public:
DXGI();
~DXGI();
virtual ~DXGI();
const char * GetName() { return "DXGI"; }
bool Initialize(CaptureOptions * options);
void DeInitialize();
bool ReInitialize()
{
@@ -67,14 +81,54 @@ namespace Capture
size_t GetMaxFrameSize();
enum GrabStatus GrabFrame(struct FrameInfo & frame);
/*
Junk needed for the horrid IMFAsyncCallback interface
*/
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
static const QITAB qit[] =
{
QITABENT(DXGI, IMFAsyncCallback),
{ NULL }
};
return QISearch(this, qit, riid, ppv);
}
STDMETHODIMP_(ULONG) AddRef()
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) Release()
{
long cRef = InterlockedDecrement(&m_cRef);
if (!cRef)
delete this;
return cRef;
}
STDMETHODIMP GetParameters(DWORD *pdwFlags, DWORD *pdwQueue) { return E_NOTIMPL; }
STDMETHODIMP Invoke(IMFAsyncResult *pAsyncResult);
private:
bool InitRawCapture();
bool InitH264Capture();
GrabStatus DXGI::GrabFrameTexture(FrameInfo & frame, ID3D11Texture2DPtr & texture);
GrabStatus DXGI::GrabFrameRaw (FrameInfo & frame);
GrabStatus DXGI::GrabFrameH264 (FrameInfo & frame);
void WaitForDesktop();
long m_cRef;
CaptureOptions * m_options;
bool m_initialized;
unsigned int m_width;
unsigned int m_height;
bool m_initialized;
unsigned int m_width;
unsigned int m_height;
enum FrameType m_frameType;
MultiMemcpy m_memcpy;
IDXGIFactory1Ptr m_dxgiFactory;
@@ -87,6 +141,16 @@ namespace Capture
ID3D11Texture2DPtr m_texture;
D3D11_MAPPED_SUBRESOURCE m_mapping;
bool m_surfaceMapped;
HANDLE m_encodeEvent;
bool m_encodeNeedsData, m_encodeHasData;
CRITICAL_SECTION m_encodeCS;
UINT m_resetToken;
IMFDXGIDeviceManagerPtr m_mfDeviceManager;
IMFTransformPtr m_mfTransform;
IMFMediaEventGeneratorPtr m_mediaEventGen;
BYTE * m_pointer;
UINT m_pointerBufSize;
UINT m_pointerSize;