#pragma once #include "renderer.h" #include #include extern "C" { #include } class DXVA2Renderer : public IRenderer { public: DXVA2Renderer(); virtual ~DXVA2Renderer(); virtual bool initialize(SDL_Window* window, int videoFormat, int width, int height); virtual bool prepareDecoderContext(AVCodecContext* context); virtual void renderFrame(AVFrame* frame); private: bool initializeDecoder(); bool initializeRenderer(); static AVBufferRef* ffPoolAlloc(void* opaque, int size); static void ffPoolDummyDelete(void*, uint8_t*); static int ffGetBuffer2(AVCodecContext* context, AVFrame* frame, int flags); static enum AVPixelFormat ffGetFormat(AVCodecContext*, const enum AVPixelFormat* pixFmts); int m_VideoFormat; int m_Width; int m_Height; SDL_Renderer* m_SdlRenderer; struct dxva_context m_DXVAContext; IDirect3DSurface9* m_DecSurfaces[19]; DXVA2_ConfigPictureDecode m_Config; IDirectXVideoDecoderService* m_DecService; IDirectXVideoDecoder* m_Decoder; int m_SurfacesUsed; AVBufferPool* m_Pool; IDirect3DDevice9* m_Device; IDirect3DSurface9* m_RenderTarget; IDirectXVideoProcessorService* m_ProcService; IDirectXVideoProcessor* 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; };