mirror of
https://github.com/moonlight-stream/moonlight-qt
synced 2025-01-09 01:38:44 +00:00
Remove manual hwframe ctx setup for D3D11VA
It was apparently never necessary, since FFmpeg's default behavior of avcodec_get_hw_frames_parameters() + av_hwframe_ctx_init() makes a context that exactly matches the one we constructed manually.
This commit is contained in:
parent
2d15382e31
commit
2cef09471b
2 changed files with 4 additions and 58 deletions
|
@ -90,8 +90,7 @@ D3D11VARenderer::D3D11VARenderer(int decoderSelectionPass)
|
||||||
m_VideoTexture(nullptr),
|
m_VideoTexture(nullptr),
|
||||||
m_OverlayLock(0),
|
m_OverlayLock(0),
|
||||||
m_OverlayPixelShader(nullptr),
|
m_OverlayPixelShader(nullptr),
|
||||||
m_HwDeviceContext(nullptr),
|
m_HwDeviceContext(nullptr)
|
||||||
m_HwFramesContext(nullptr)
|
|
||||||
{
|
{
|
||||||
RtlZeroMemory(m_OverlayVertexBuffers, sizeof(m_OverlayVertexBuffers));
|
RtlZeroMemory(m_OverlayVertexBuffers, sizeof(m_OverlayVertexBuffers));
|
||||||
RtlZeroMemory(m_OverlayTextures, sizeof(m_OverlayTextures));
|
RtlZeroMemory(m_OverlayTextures, sizeof(m_OverlayTextures));
|
||||||
|
@ -137,10 +136,6 @@ D3D11VARenderer::~D3D11VARenderer()
|
||||||
SAFE_COM_RELEASE(m_RenderTargetView);
|
SAFE_COM_RELEASE(m_RenderTargetView);
|
||||||
SAFE_COM_RELEASE(m_SwapChain);
|
SAFE_COM_RELEASE(m_SwapChain);
|
||||||
|
|
||||||
if (m_HwFramesContext != nullptr) {
|
|
||||||
av_buffer_unref(&m_HwFramesContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Force destruction of the swapchain immediately
|
// Force destruction of the swapchain immediately
|
||||||
if (m_DeviceContext != nullptr) {
|
if (m_DeviceContext != nullptr) {
|
||||||
m_DeviceContext->ClearState();
|
m_DeviceContext->ClearState();
|
||||||
|
@ -421,10 +416,6 @@ bool D3D11VARenderer::initialize(PDECODER_PARAMETERS params)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Surfaces must be 16 pixel aligned for H.264 and 128 pixel aligned for everything else
|
|
||||||
// https://github.com/FFmpeg/FFmpeg/blob/a234e5cd80224c95a205c1f3e297d8c04a1374c3/libavcodec/dxva2.c#L609-L616
|
|
||||||
m_TextureAlignment = (params->videoFormat & VIDEO_FORMAT_MASK_H264) ? 16 : 128;
|
|
||||||
|
|
||||||
if (!setupRenderingResources()) {
|
if (!setupRenderingResources()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -458,43 +449,9 @@ bool D3D11VARenderer::initialize(PDECODER_PARAMETERS params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
// Create our video texture and SRVs
|
||||||
m_HwFramesContext = av_hwframe_ctx_alloc(m_HwDeviceContext);
|
if (!setupVideoTexture()) {
|
||||||
if (!m_HwFramesContext) {
|
return false;
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Failed to allocate D3D11VA frame context");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
AVHWFramesContext* framesContext = (AVHWFramesContext*)m_HwFramesContext->data;
|
|
||||||
|
|
||||||
// We require NV12 or P010 textures for our shader
|
|
||||||
framesContext->format = AV_PIX_FMT_D3D11;
|
|
||||||
framesContext->sw_format = (params->videoFormat & VIDEO_FORMAT_MASK_10BIT) ?
|
|
||||||
AV_PIX_FMT_P010 : AV_PIX_FMT_NV12;
|
|
||||||
|
|
||||||
framesContext->width = FFALIGN(params->width, m_TextureAlignment);
|
|
||||||
framesContext->height = FFALIGN(params->height, m_TextureAlignment);
|
|
||||||
|
|
||||||
// We can have up to 16 reference frames plus a working surface
|
|
||||||
framesContext->initial_pool_size = 17;
|
|
||||||
|
|
||||||
AVD3D11VAFramesContext* d3d11vaFramesContext = (AVD3D11VAFramesContext*)framesContext->hwctx;
|
|
||||||
|
|
||||||
d3d11vaFramesContext->BindFlags = D3D11_BIND_DECODER;
|
|
||||||
|
|
||||||
int err = av_hwframe_ctx_init(m_HwFramesContext);
|
|
||||||
if (err < 0) {
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Failed to initialize D3D11VA frame context: %d",
|
|
||||||
err);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create our video texture and SRVs
|
|
||||||
if (!setupVideoTexture()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -510,14 +467,6 @@ bool D3D11VARenderer::prepareDecoderContext(AVCodecContext* context, AVDictionar
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool D3D11VARenderer::prepareDecoderContextInGetFormat(AVCodecContext *context, AVPixelFormat)
|
|
||||||
{
|
|
||||||
// hw_frames_ctx must be initialized in ffGetFormat().
|
|
||||||
context->hw_frames_ctx = av_buffer_ref(m_HwFramesContext);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11VARenderer::setHdrMode(bool enabled)
|
void D3D11VARenderer::setHdrMode(bool enabled)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
|
@ -17,7 +17,6 @@ public:
|
||||||
virtual ~D3D11VARenderer() override;
|
virtual ~D3D11VARenderer() override;
|
||||||
virtual bool initialize(PDECODER_PARAMETERS params) override;
|
virtual bool initialize(PDECODER_PARAMETERS params) override;
|
||||||
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary**) override;
|
virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary**) override;
|
||||||
virtual bool prepareDecoderContextInGetFormat(AVCodecContext* context, AVPixelFormat pixelFormat) override;
|
|
||||||
virtual void renderFrame(AVFrame* frame) override;
|
virtual void renderFrame(AVFrame* frame) override;
|
||||||
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
virtual void notifyOverlayUpdated(Overlay::OverlayType) override;
|
||||||
virtual void setHdrMode(bool enabled) override;
|
virtual void setHdrMode(bool enabled) override;
|
||||||
|
@ -47,7 +46,6 @@ private:
|
||||||
SDL_mutex* m_ContextLock;
|
SDL_mutex* m_ContextLock;
|
||||||
|
|
||||||
DECODER_PARAMETERS m_DecoderParams;
|
DECODER_PARAMETERS m_DecoderParams;
|
||||||
int m_TextureAlignment;
|
|
||||||
int m_DisplayWidth;
|
int m_DisplayWidth;
|
||||||
int m_DisplayHeight;
|
int m_DisplayHeight;
|
||||||
int m_LastColorSpace;
|
int m_LastColorSpace;
|
||||||
|
@ -70,6 +68,5 @@ private:
|
||||||
ID3D11PixelShader* m_OverlayPixelShader;
|
ID3D11PixelShader* m_OverlayPixelShader;
|
||||||
|
|
||||||
AVBufferRef* m_HwDeviceContext;
|
AVBufferRef* m_HwDeviceContext;
|
||||||
AVBufferRef* m_HwFramesContext;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue