mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-08-09 20:24:14 +00:00
[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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user