Use ffmpeg for Windows Video Dumping instead of VFW
This commit is contained in:
1 parent
e7f2a04699
commit
6cad635bd8
313 files changed
+260584
-379
No files matched your search
@@ -800,7 +800,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
{
|
||||
s_recordWidth = GetTargetRectangle().GetWidth();
|
||||
s_recordHeight = GetTargetRectangle().GetHeight();
|
||||
bAVIDumping = AVIDump::Start(D3D::hWnd, s_recordWidth, s_recordHeight);
|
||||
bAVIDumping = AVIDump::Start(s_recordWidth, s_recordHeight);
|
||||
if (!bAVIDumping)
|
||||
{
|
||||
PanicAlert("Error dumping frames to AVI.");
|
||||
@@ -825,6 +825,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
h = s_recordHeight;
|
||||
}
|
||||
formatBufferDump((u8*)map.pData, &frame_data[0], s_recordWidth, s_recordHeight, map.RowPitch);
|
||||
FlipImageData(&frame_data[0], w, h);
|
||||
AVIDump::AddFrame(&frame_data[0], GetTargetRectangle().GetWidth(), GetTargetRectangle().GetHeight());
|
||||
D3D::context->Unmap(s_screenshot_texture, 0);
|
||||
}
|
||||
@@ -1275,4 +1276,16 @@ void Renderer::BlitScreen(TargetRectangle src, TargetRectangle dst, D3DTexture2D
|
||||
}
|
||||
}
|
||||
|
||||
void Renderer::FlipImageData(u8 *data, int w, int h, int pixel_width)
|
||||
{
|
||||
for (int y = 0; y < h / 2; ++y)
|
||||
{
|
||||
for (int x = 0; x < w; ++x)
|
||||
{
|
||||
for (int delta = 0; delta < pixel_width; ++delta)
|
||||
std::swap(data[(y * w + x) * pixel_width + delta], data[((h - 1 - y) * w + x) * pixel_width + delta]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace DX11
|
||||
@@ -31,6 +31,7 @@ public:
|
||||
void RestoreCull();
|
||||
|
||||
void RenderText(const std::string& text, int left, int top, u32 color) override;
|
||||
void FlipImageData(u8 *data, int w, int h, int pixel_width = 3);
|
||||
|
||||
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
||||
u16 BBoxRead(int index) override;
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
#include "VideoBackends/OGL/TextureConverter.h"
|
||||
#include "VideoBackends/OGL/VertexManager.h"
|
||||
|
||||
#if defined(HAVE_LIBAV) || defined (WIN32)
|
||||
#include "VideoCommon/AVIDump.h"
|
||||
#endif
|
||||
#include "VideoCommon/BPFunctions.h"
|
||||
#include "VideoCommon/BPStructs.h"
|
||||
#include "VideoCommon/DriverDetails.h"
|
||||
@@ -49,10 +52,6 @@
|
||||
#include "VideoCommon/VertexShaderManager.h"
|
||||
#include "VideoCommon/VideoConfig.h"
|
||||
|
||||
#if defined _WIN32 || defined HAVE_LIBAV
|
||||
#include "VideoCommon/AVIDump.h"
|
||||
#endif
|
||||
|
||||
|
||||
void VideoConfig::UpdateProjectionHack()
|
||||
{
|
||||
@@ -1415,7 +1414,7 @@ void Renderer::SetBlendMode(bool forceUpdate)
|
||||
|
||||
static void DumpFrame(const std::vector<u8>& data, int w, int h)
|
||||
{
|
||||
#if defined(HAVE_LIBAV) || defined(_WIN32)
|
||||
#if defined(HAVE_LIBAV) || defined (WIN32)
|
||||
if (SConfig::GetInstance().m_DumpFrames && !data.empty())
|
||||
{
|
||||
AVIDump::AddFrame(&data[0], w, h);
|
||||
@@ -1535,7 +1534,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
// Frame dumping disabled entirely on GLES3
|
||||
if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL)
|
||||
{
|
||||
#if defined _WIN32 || defined HAVE_LIBAV
|
||||
#if defined(HAVE_LIBAV) || defined (WIN32)
|
||||
if (SConfig::GetInstance().m_DumpFrames)
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(s_criticalScreenshot);
|
||||
@@ -1552,11 +1551,7 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
{
|
||||
if (!bLastFrameDumped)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
bAVIDumping = AVIDump::Start(nullptr, w, h);
|
||||
#else
|
||||
bAVIDumping = AVIDump::Start(w, h);
|
||||
#endif
|
||||
bAVIDumping = AVIDump::Start(w, h);
|
||||
if (!bAVIDumping)
|
||||
{
|
||||
OSD::AddMessage("AVIDump Start failed", 2000);
|
||||
@@ -1570,11 +1565,8 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
}
|
||||
if (bAVIDumping)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
FlipImageData(&frame_data[0], w, h);
|
||||
#endif
|
||||
|
||||
AVIDump::AddFrame(&frame_data[0], w, h);
|
||||
FlipImageData(&frame_data[0], w, h);
|
||||
AVIDump::AddFrame(&frame_data[0], w, h);
|
||||
}
|
||||
|
||||
bLastFrameDumped = true;
|
||||
@@ -1596,45 +1588,6 @@ void Renderer::SwapImpl(u32 xfbAddr, u32 fbWidth, u32 fbStride, u32 fbHeight, co
|
||||
}
|
||||
bLastFrameDumped = false;
|
||||
}
|
||||
#else
|
||||
if (SConfig::GetInstance().m_DumpFrames)
|
||||
{
|
||||
std::lock_guard<std::mutex> lk(s_criticalScreenshot);
|
||||
std::string movie_file_name;
|
||||
w = GetTargetRectangle().GetWidth();
|
||||
h = GetTargetRectangle().GetHeight();
|
||||
frame_data.resize(3 * w * h);
|
||||
glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
||||
glReadPixels(GetTargetRectangle().left, GetTargetRectangle().bottom, w, h, GL_BGR, GL_UNSIGNED_BYTE, &frame_data[0]);
|
||||
|
||||
if (!bLastFrameDumped)
|
||||
{
|
||||
movie_file_name = File::GetUserPath(D_DUMPFRAMES_IDX) + "framedump.raw";
|
||||
File::CreateFullPath(movie_file_name);
|
||||
pFrameDump.Open(movie_file_name, "wb");
|
||||
if (!pFrameDump)
|
||||
{
|
||||
OSD::AddMessage("Error opening framedump.raw for writing.", 2000);
|
||||
}
|
||||
else
|
||||
{
|
||||
OSD::AddMessage(StringFromFormat("Dumping Frames to \"%s\" (%dx%d RGB24)", movie_file_name.c_str(), w, h), 2000);
|
||||
}
|
||||
}
|
||||
if (pFrameDump)
|
||||
{
|
||||
FlipImageData(&frame_data[0], w, h);
|
||||
pFrameDump.WriteBytes(&frame_data[0], w * 3 * h);
|
||||
pFrameDump.Flush();
|
||||
}
|
||||
bLastFrameDumped = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bLastFrameDumped)
|
||||
pFrameDump.Close();
|
||||
bLastFrameDumped = false;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
// Finish up the current frame, print some stats
|
||||
|
||||
Reference in new issue
Block a user