2018-07-13 02:28:10 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "renderer.h"
|
2018-08-15 23:20:56 -07:00
|
|
|
#include "pacer/pacer.h"
|
2018-07-13 02:28:10 -07:00
|
|
|
|
|
|
|
#include <d3d9.h>
|
|
|
|
#include <dxva2api.h>
|
|
|
|
|
|
|
|
extern "C" {
|
|
|
|
#include <libavcodec/dxva2.h>
|
|
|
|
}
|
|
|
|
|
2018-08-15 23:57:03 -07:00
|
|
|
class DXVA2Renderer : public IFFmpegRenderer
|
2018-07-13 02:28:10 -07:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
DXVA2Renderer();
|
2019-04-12 22:12:53 -07:00
|
|
|
virtual ~DXVA2Renderer() override;
|
2019-04-11 22:27:20 -07:00
|
|
|
virtual bool initialize(PDECODER_PARAMETERS params) override;
|
2020-02-08 17:47:26 -08:00
|
|
|
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override;
|
2019-02-15 19:31:01 -08:00
|
|
|
virtual void renderFrame(AVFrame* frame) override;
|
2020-12-13 16:50:02 -06:00
|
|
|
virtual void notifyOverlayUpdated(Overlay::OverlayType type) override;
|
2019-12-15 13:29:19 -08:00
|
|
|
virtual int getDecoderColorspace() override;
|
2018-07-13 02:28:10 -07:00
|
|
|
|
|
|
|
private:
|
|
|
|
bool initializeDecoder();
|
|
|
|
bool initializeRenderer();
|
2018-08-20 18:19:42 -07:00
|
|
|
bool initializeDevice(SDL_Window* window, bool enableVsync);
|
2018-07-31 18:09:09 -07:00
|
|
|
bool isDecoderBlacklisted();
|
2019-01-28 19:18:43 -08:00
|
|
|
bool isDXVideoProcessorAPIBlacklisted();
|
2020-12-13 16:50:02 -06:00
|
|
|
void renderOverlay(Overlay::OverlayType type);
|
2018-07-13 02:28:10 -07:00
|
|
|
|
2022-01-21 23:09:43 -06:00
|
|
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 68, 0)
|
|
|
|
#define FF_POOL_SIZE_TYPE size_t
|
|
|
|
#else
|
|
|
|
#define FF_POOL_SIZE_TYPE int
|
|
|
|
#endif
|
|
|
|
|
2018-07-13 02:28:10 -07:00
|
|
|
static
|
2022-01-21 23:09:43 -06:00
|
|
|
AVBufferRef* ffPoolAlloc(void* opaque, FF_POOL_SIZE_TYPE size);
|
2018-07-13 02:28:10 -07:00
|
|
|
|
|
|
|
static
|
|
|
|
void ffPoolDummyDelete(void*, uint8_t*);
|
|
|
|
|
|
|
|
static
|
|
|
|
int ffGetBuffer2(AVCodecContext* context, AVFrame* frame, int flags);
|
|
|
|
|
|
|
|
int m_VideoFormat;
|
2018-07-18 19:10:14 -07:00
|
|
|
int m_VideoWidth;
|
|
|
|
int m_VideoHeight;
|
|
|
|
|
|
|
|
int m_DisplayWidth;
|
|
|
|
int m_DisplayHeight;
|
2018-07-13 02:28:10 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2020-12-18 20:23:52 -06:00
|
|
|
SDL_SpinLock m_OverlayLock;
|
2020-12-16 18:15:50 -06:00
|
|
|
IDirect3DVertexBuffer9* m_OverlayVertexBuffers[Overlay::OverlayMax];
|
2020-12-13 16:50:02 -06:00
|
|
|
IDirect3DTexture9* m_OverlayTextures[Overlay::OverlayMax];
|
|
|
|
|
2018-08-19 21:53:39 -07:00
|
|
|
IDirect3DDevice9Ex* m_Device;
|
2018-07-13 02:28:10 -07:00
|
|
|
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;
|
2019-01-20 14:08:53 -08:00
|
|
|
bool m_BlockingPresent;
|
2018-07-13 02:28:10 -07:00
|
|
|
};
|