Fix DXVA 2 regression on Windows

This commit is contained in:
Cameron Gutman
2018-08-02 22:28:59 -07:00
parent 624578f286
commit 0c18bcdd5e
3 changed files with 15 additions and 7 deletions

View File

@@ -1,5 +1,6 @@
#include <initguid.h>
#include "dxva2.h"
#include "../ffmpeg.h"
#include <Limelight.h>
@@ -77,8 +78,6 @@ bool DXVA2Renderer::prepareDecoderContext(AVCodecContext* context)
context->get_buffer2 = ffGetBuffer2;
context->opaque = this;
m_Pool = av_buffer_pool_init2(ARRAYSIZE(m_DecSurfaces), this, ffPoolAlloc, nullptr);
if (!m_Pool) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
@@ -94,7 +93,7 @@ bool DXVA2Renderer::prepareDecoderContext(AVCodecContext* context)
int DXVA2Renderer::ffGetBuffer2(AVCodecContext* context, AVFrame* frame, int)
{
DXVA2Renderer* me = reinterpret_cast<DXVA2Renderer*>(context->opaque);
DXVA2Renderer* me = (DXVA2Renderer*)((FFmpegVideoDecoder*)context->opaque)->getRenderer();
frame->buf[0] = av_buffer_pool_get(me->m_Pool);
if (!frame->buf[0]) {

View File

@@ -60,6 +60,11 @@ FFmpegVideoDecoder::~FFmpegVideoDecoder()
reset();
}
IFFmpegRenderer* FFmpegVideoDecoder::getRenderer()
{
return m_Renderer;
}
void FFmpegVideoDecoder::reset()
{
// Drop any frames still queued to ensure
@@ -99,9 +104,6 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, int videoForma
return false;
}
// Stash a pointer to this object in the context
m_VideoDecoderCtx->opaque = this;
// Always request low delay decoding
m_VideoDecoderCtx->flags |= AV_CODEC_FLAG_LOW_DELAY;
@@ -126,6 +128,10 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, int videoForma
return false;
}
// Stash a pointer to this object in the context
SDL_assert(m_VideoDecoderCtx->opaque == nullptr);
m_VideoDecoderCtx->opaque = this;
int err = avcodec_open2(m_VideoDecoderCtx, decoder, nullptr);
if (err < 0) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,

View File

@@ -22,8 +22,11 @@ public:
virtual void renderFrame(SDL_UserEvent* event) override;
virtual void dropFrame(SDL_UserEvent* event) override;
virtual IFFmpegRenderer* getRenderer();
private:
bool completeInitialization(AVCodec* decoder, int videoFormat, int width, int height, bool testOnly);
bool completeInitialization(AVCodec* decoder, int videoFormat,
int width, int height, bool testOnly);
IFFmpegRenderer* createAcceleratedRenderer(const AVCodecHWConfig* hwDecodeCfg);