[host] added initial framework for DXGI capture

This commit is contained in:
Geoffrey McRae 2017-11-02 17:55:25 +11:00
parent fc192c0016
commit 44d7e9e77c
6 changed files with 144 additions and 2 deletions

71
host/Capture/DXGI.cpp Normal file
View File

@ -0,0 +1,71 @@
/*
KVMGFX Client - A KVM Client for VGA Passthrough
Copyright (C) 2017 Geoffrey McRae <geoff@hostfission.com>
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "DXGI.h"
using namespace Capture;
DXGI::DXGI() :
m_initialized(false)
{
}
DXGI::~DXGI()
{
}
bool DXGI::Initialize()
{
if (m_initialized)
DeInitialize();
m_initialized = true;
return true;
}
void DXGI::DeInitialize()
{
m_initialized = false;
}
FrameType DXGI::GetFrameType()
{
if (!m_initialized)
return FRAME_TYPE_INVALID;
return FrameType();
}
FrameComp DXGI::GetFrameCompression()
{
if (!m_initialized)
return FRAME_COMP_NONE;
return FrameComp();
}
size_t DXGI::GetMaxFrameSize()
{
return size_t();
}
bool DXGI::GrabFrame(FrameInfo & frame)
{
return false;
}

40
host/Capture/DXGI.h Normal file
View File

@ -0,0 +1,40 @@
/*
KVMGFX Client - A KVM Client for VGA Passthrough
Copyright (C) 2017 Geoffrey McRae <geoff@hostfission.com>
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include "ICapture.h"
namespace Capture
{
class DXGI : public ICapture
{
public:
DXGI();
~DXGI();
bool Initialize();
void DeInitialize();
enum FrameType GetFrameType();
enum FrameComp GetFrameCompression();
size_t GetMaxFrameSize();
bool GrabFrame(struct FrameInfo & frame);
private:
bool m_initialized;
};
};

View File

@ -21,14 +21,37 @@ Place, Suite 330, Boston, MA 02111-1307 USA
#define W32_LEAN_AND_MEAN #define W32_LEAN_AND_MEAN
#include <Windows.h> #include <Windows.h>
#include "common\debug.h"
#include "ICapture.h" #include "ICapture.h"
#include "Capture\NvFBC.h" #include "Capture\NvFBC.h"
#include "Capture\DXGI.h"
class CaptureFactory class CaptureFactory
{ {
public: public:
static ICapture * GetCaptureDevice() static ICapture * GetCaptureDevice()
{ {
return new Capture::NvFBC(); ICapture *dev;
dev = new Capture::NvFBC();
if (dev->Initialize())
{
DEBUG_INFO("Using NvFBC");
return dev;
}
dev->DeInitialize();
delete dev;
dev = new Capture::DXGI();
if (dev->Initialize())
{
DEBUG_INFO("Using DXGI");
return dev;
}
dev->DeInitialize();
delete dev;
DEBUG_ERROR("Failed to initialize a compatible capture device");
return NULL;
} }
}; };

View File

@ -45,7 +45,7 @@ bool Service::Initialize()
DeInitialize(); DeInitialize();
m_capture = CaptureFactory::GetCaptureDevice(); m_capture = CaptureFactory::GetCaptureDevice();
if (!m_capture || !m_capture->Initialize()) if (!m_capture)
{ {
DEBUG_ERROR("Failed to initialize capture interface"); DEBUG_ERROR("Failed to initialize capture interface");
DeInitialize(); DeInitialize();

View File

@ -160,6 +160,7 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Capture\DXGI.cpp" />
<ClCompile Include="Capture\NvFBC.cpp" /> <ClCompile Include="Capture\NvFBC.cpp" />
<ClCompile Include="ivshmem.cpp" /> <ClCompile Include="ivshmem.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
@ -168,6 +169,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="CaptureFactory.h" /> <ClInclude Include="CaptureFactory.h" />
<ClInclude Include="Capture\DXGI.h" />
<ClInclude Include="Capture\NvFBC.h" /> <ClInclude Include="Capture\NvFBC.h" />
<ClInclude Include="ICapture.h" /> <ClInclude Include="ICapture.h" />
<ClInclude Include="ivshmem.h" /> <ClInclude Include="ivshmem.h" />

View File

@ -36,6 +36,9 @@
<ClCompile Include="MTMemcpy.cpp"> <ClCompile Include="MTMemcpy.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Capture\DXGI.cpp">
<Filter>Source Files\Capture</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="ivshmem.h"> <ClInclude Include="ivshmem.h">
@ -59,5 +62,8 @@
<ClInclude Include="MTMemcpy.h"> <ClInclude Include="MTMemcpy.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Capture\DXGI.h">
<Filter>Header Files\Capture</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>