#pragma once #include "renderer.h" #include "pacer/pacer.h" #include #include #include class DXVA2Renderer : public IFFmpegRenderer { public: DXVA2Renderer(int decoderSelectionPass); virtual ~DXVA2Renderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual void notifyOverlayUpdated(Overlay::OverlayType type) override; virtual int getDecoderColorspace() override; virtual int getDecoderCapabilities() override; private: bool initializeDecoder(); bool initializeRenderer(); bool initializeVideoProcessor(); bool initializeDevice(SDL_Window* window, bool enableVsync); bool isDecoderBlacklisted(); bool initializeQuirksForAdapter(IDirect3D9Ex* d3d9ex, int adapterIndex); void renderOverlay(Overlay::OverlayType type); int m_DecoderSelectionPass; int m_VideoFormat; int m_DisplayWidth; int m_DisplayHeight; AVBufferRef* m_HwDeviceContext; SDL_SpinLock m_OverlayLock; std::array, Overlay::OverlayMax> m_OverlayVertexBuffers; std::array, Overlay::OverlayMax> m_OverlayTextures; Microsoft::WRL::ComPtr m_Device; Microsoft::WRL::ComPtr m_DeviceManager; Microsoft::WRL::ComPtr m_RenderTarget; Microsoft::WRL::ComPtr m_ProcService; Microsoft::WRL::ComPtr m_Processor; DXVA2_ValueRange m_BrightnessRange; DXVA2_ValueRange m_ContrastRange; DXVA2_ValueRange m_HueRange; DXVA2_ValueRange m_SaturationRange; DXVA2_VideoDesc m_Desc; REFERENCE_TIME m_FrameIndex; bool m_BlockingPresent; #define DXVA2_QUIRK_NO_VP 0x01 #define DXVA2_QUIRK_SET_DEST_FORMAT 0x02 #define DXVA2_QUIRK_WDDM_20_PLUS 0x04 // Unused #define DXVA2_QUIRK_MULTI_GPU 0x08 int m_DeviceQuirks; };