System: Add video capture feature
This commit is contained in:
@ -44,6 +44,8 @@ add_library(util
|
||||
input_source.h
|
||||
iso_reader.cpp
|
||||
iso_reader.h
|
||||
media_capture.cpp
|
||||
media_capture.h
|
||||
page_fault_handler.cpp
|
||||
page_fault_handler.h
|
||||
platform_misc.h
|
||||
|
||||
1679
src/util/media_capture.cpp
Normal file
1679
src/util/media_capture.cpp
Normal file
File diff suppressed because it is too large
Load Diff
75
src/util/media_capture.h
Normal file
75
src/util/media_capture.h
Normal file
@ -0,0 +1,75 @@
|
||||
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
|
||||
// SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "gpu_texture.h"
|
||||
|
||||
#include <ctime>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
class Error;
|
||||
class GPUTexture;
|
||||
|
||||
enum class MediaCaptureBackend : u8
|
||||
{
|
||||
#ifdef _WIN32
|
||||
MediaFoundation,
|
||||
#endif
|
||||
#ifndef __ANDROID__
|
||||
FFMPEG,
|
||||
#endif
|
||||
MaxCount,
|
||||
};
|
||||
|
||||
class MediaCapture
|
||||
{
|
||||
public:
|
||||
virtual ~MediaCapture();
|
||||
|
||||
using ContainerName = std::pair<std::string, std::string>; // configname,longname
|
||||
using ContainerList = std::vector<ContainerName>;
|
||||
using CodecName = std::pair<std::string, std::string>; // configname,longname
|
||||
using CodecList = std::vector<CodecName>;
|
||||
|
||||
static std::optional<MediaCaptureBackend> ParseBackendName(const char* str);
|
||||
static const char* GetBackendName(MediaCaptureBackend backend);
|
||||
static const char* GetBackendDisplayName(MediaCaptureBackend backend);
|
||||
|
||||
static ContainerList GetContainerList(MediaCaptureBackend backend);
|
||||
static CodecList GetVideoCodecList(MediaCaptureBackend backend, const char* container);
|
||||
static CodecList GetAudioCodecList(MediaCaptureBackend backend, const char* container);
|
||||
|
||||
static void AdjustVideoSize(u32* width, u32* height);
|
||||
|
||||
static std::unique_ptr<MediaCapture> Create(MediaCaptureBackend backend, Error* error);
|
||||
|
||||
virtual bool BeginCapture(float fps, float aspect, u32 width, u32 height, GPUTexture::Format texture_format,
|
||||
u32 sample_rate, std::string path, bool capture_video, std::string_view video_codec,
|
||||
u32 video_bitrate, std::string_view video_codec_args, bool capture_audio,
|
||||
std::string_view audio_codec, u32 audio_bitrate, std::string_view audio_codec_args,
|
||||
Error* error) = 0;
|
||||
virtual bool EndCapture(Error* error) = 0;
|
||||
|
||||
// TODO: make non-virtual?
|
||||
virtual const std::string& GetPath() const = 0;
|
||||
virtual bool IsCapturingAudio() const = 0;
|
||||
virtual bool IsCapturingVideo() const = 0;
|
||||
virtual u32 GetVideoWidth() const = 0;
|
||||
virtual u32 GetVideoHeight() const = 0;
|
||||
|
||||
/// Returns the elapsed time in seconds.
|
||||
virtual time_t GetElapsedTime() const = 0;
|
||||
|
||||
virtual float GetCaptureThreadUsage() const = 0;
|
||||
virtual float GetCaptureThreadTime() const = 0;
|
||||
virtual void UpdateCaptureThreadUsage(double pct_divider, double time_divider) = 0;
|
||||
|
||||
virtual GPUTexture* GetRenderTexture() = 0;
|
||||
virtual bool DeliverVideoFrame(GPUTexture* stex) = 0;
|
||||
virtual bool DeliverAudioFrames(const s16* frames, u32 num_frames) = 0;
|
||||
virtual void Flush() = 0;
|
||||
};
|
||||
@ -13,7 +13,7 @@
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);d3d11.lib;d3d12.lib;d3dcompiler.lib;dxgi.lib;Dwmapi.lib;winhttp.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);d3d11.lib;d3d12.lib;d3dcompiler.lib;dxgi.lib;Dwmapi.lib;winhttp.lib;Mfplat.lib;Mfreadwrite.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies Condition="'$(Platform)'!='ARM64'">%(AdditionalDependencies);opengl32.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@ -36,6 +36,7 @@
|
||||
<ClInclude Include="input_manager.h" />
|
||||
<ClInclude Include="input_source.h" />
|
||||
<ClInclude Include="iso_reader.h" />
|
||||
<ClInclude Include="media_capture.h" />
|
||||
<ClInclude Include="metal_device.h">
|
||||
<ExcludedFromBuild>true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
@ -146,6 +147,7 @@
|
||||
<ClCompile Include="input_source.cpp" />
|
||||
<ClCompile Include="iso_reader.cpp" />
|
||||
<ClCompile Include="cd_subchannel_replacement.cpp" />
|
||||
<ClCompile Include="media_capture.cpp" />
|
||||
<ClCompile Include="opengl_context.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Platform)'=='ARM64'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
|
||||
@ -71,6 +71,7 @@
|
||||
<ClInclude Include="opengl_context_wgl.h" />
|
||||
<ClInclude Include="image.h" />
|
||||
<ClInclude Include="sockets.h" />
|
||||
<ClInclude Include="media_capture.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="state_wrapper.cpp" />
|
||||
@ -150,6 +151,7 @@
|
||||
<ClCompile Include="image.cpp" />
|
||||
<ClCompile Include="sdl_audio_stream.cpp" />
|
||||
<ClCompile Include="sockets.cpp" />
|
||||
<ClCompile Include="media_capture.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="metal_shaders.metal" />
|
||||
|
||||
Reference in New Issue
Block a user