diff --git a/app/streaming/video/ffmpeg-renderers/cuda.cpp b/app/streaming/video/ffmpeg-renderers/cuda.cpp index f9849ef8..56f52d7c 100644 --- a/app/streaming/video/ffmpeg-renderers/cuda.cpp +++ b/app/streaming/video/ffmpeg-renderers/cuda.cpp @@ -28,7 +28,7 @@ bool CUDARenderer::initialize(PDECODER_PARAMETERS) return true; } -bool CUDARenderer::prepareDecoderContext(AVCodecContext* context) +bool CUDARenderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**) { context->hw_device_ctx = av_buffer_ref(m_HwContext); diff --git a/app/streaming/video/ffmpeg-renderers/cuda.h b/app/streaming/video/ffmpeg-renderers/cuda.h index 431fa70a..401b76f7 100644 --- a/app/streaming/video/ffmpeg-renderers/cuda.h +++ b/app/streaming/video/ffmpeg-renderers/cuda.h @@ -7,7 +7,7 @@ public: CUDARenderer(); virtual ~CUDARenderer() override; virtual bool initialize(PDECODER_PARAMETERS) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual bool needsTestFrame() override; virtual bool isDirectRenderingSupported() override; diff --git a/app/streaming/video/ffmpeg-renderers/drm.cpp b/app/streaming/video/ffmpeg-renderers/drm.cpp index 39dd43bf..bf57963b 100644 --- a/app/streaming/video/ffmpeg-renderers/drm.cpp +++ b/app/streaming/video/ffmpeg-renderers/drm.cpp @@ -33,7 +33,7 @@ DrmRenderer::~DrmRenderer() } } -bool DrmRenderer::prepareDecoderContext(AVCodecContext*) +bool DrmRenderer::prepareDecoderContext(AVCodecContext*, AVDictionary**) { /* Nothing to do */ diff --git a/app/streaming/video/ffmpeg-renderers/drm.h b/app/streaming/video/ffmpeg-renderers/drm.h index 97915d6a..f9f90199 100644 --- a/app/streaming/video/ffmpeg-renderers/drm.h +++ b/app/streaming/video/ffmpeg-renderers/drm.h @@ -10,7 +10,7 @@ public: DrmRenderer(); virtual ~DrmRenderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual enum AVPixelFormat getPreferredPixelFormat(int videoFormat) override; diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index 2aeafb2a..208eccaa 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -80,7 +80,7 @@ AVBufferRef* DXVA2Renderer::ffPoolAlloc(void* opaque, int) return NULL; } -bool DXVA2Renderer::prepareDecoderContext(AVCodecContext* context) +bool DXVA2Renderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**) { // m_DXVAContext.workaround and report_id already initialized elsewhere m_DXVAContext.decoder = m_Decoder; diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.h b/app/streaming/video/ffmpeg-renderers/dxva2.h index 335083e5..7632cbd6 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.h +++ b/app/streaming/video/ffmpeg-renderers/dxva2.h @@ -17,7 +17,7 @@ public: DXVA2Renderer(); virtual ~DXVA2Renderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual void notifyOverlayUpdated(Overlay::OverlayType) override; virtual int getDecoderColorspace() override; diff --git a/app/streaming/video/ffmpeg-renderers/mmal.cpp b/app/streaming/video/ffmpeg-renderers/mmal.cpp index f2beedd0..3418b10d 100644 --- a/app/streaming/video/ffmpeg-renderers/mmal.cpp +++ b/app/streaming/video/ffmpeg-renderers/mmal.cpp @@ -22,7 +22,7 @@ MmalRenderer::~MmalRenderer() } } -bool MmalRenderer::prepareDecoderContext(AVCodecContext*) +bool MmalRenderer::prepareDecoderContext(AVCodecContext*, AVDictionary**) { /* Nothing to do */ diff --git a/app/streaming/video/ffmpeg-renderers/mmal.h b/app/streaming/video/ffmpeg-renderers/mmal.h index 72ba446e..cc94e850 100644 --- a/app/streaming/video/ffmpeg-renderers/mmal.h +++ b/app/streaming/video/ffmpeg-renderers/mmal.h @@ -12,7 +12,7 @@ public: MmalRenderer(); virtual ~MmalRenderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual enum AVPixelFormat getPreferredPixelFormat(int videoFormat) override; virtual bool needsTestFrame() override; diff --git a/app/streaming/video/ffmpeg-renderers/renderer.h b/app/streaming/video/ffmpeg-renderers/renderer.h index 650fcb2e..6a072fc9 100644 --- a/app/streaming/video/ffmpeg-renderers/renderer.h +++ b/app/streaming/video/ffmpeg-renderers/renderer.h @@ -18,7 +18,7 @@ public: }; virtual bool initialize(PDECODER_PARAMETERS params) = 0; - virtual bool prepareDecoderContext(AVCodecContext* context) = 0; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) = 0; virtual void renderFrame(AVFrame* frame) = 0; virtual bool needsTestFrame() { diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp index 2c39a5b4..1e78f3c1 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.cpp @@ -58,7 +58,7 @@ SdlRenderer::~SdlRenderer() } } -bool SdlRenderer::prepareDecoderContext(AVCodecContext*) +bool SdlRenderer::prepareDecoderContext(AVCodecContext*, AVDictionary**) { /* Nothing to do */ diff --git a/app/streaming/video/ffmpeg-renderers/sdlvid.h b/app/streaming/video/ffmpeg-renderers/sdlvid.h index e0eefd4b..35a88d3b 100644 --- a/app/streaming/video/ffmpeg-renderers/sdlvid.h +++ b/app/streaming/video/ffmpeg-renderers/sdlvid.h @@ -9,7 +9,7 @@ public: SdlRenderer(); virtual ~SdlRenderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual void notifyOverlayUpdated(Overlay::OverlayType) override; virtual bool isRenderThreadSupported() override; diff --git a/app/streaming/video/ffmpeg-renderers/vaapi.cpp b/app/streaming/video/ffmpeg-renderers/vaapi.cpp index 58caf629..9c4843c6 100644 --- a/app/streaming/video/ffmpeg-renderers/vaapi.cpp +++ b/app/streaming/video/ffmpeg-renderers/vaapi.cpp @@ -192,7 +192,7 @@ VAAPIRenderer::initialize(PDECODER_PARAMETERS params) } bool -VAAPIRenderer::prepareDecoderContext(AVCodecContext* context) +VAAPIRenderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**) { context->hw_device_ctx = av_buffer_ref(m_HwContext); diff --git a/app/streaming/video/ffmpeg-renderers/vaapi.h b/app/streaming/video/ffmpeg-renderers/vaapi.h index 1c658fb6..e06053ec 100644 --- a/app/streaming/video/ffmpeg-renderers/vaapi.h +++ b/app/streaming/video/ffmpeg-renderers/vaapi.h @@ -34,7 +34,7 @@ public: VAAPIRenderer(); virtual ~VAAPIRenderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual bool needsTestFrame() override; virtual bool isDirectRenderingSupported() override; diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.cpp b/app/streaming/video/ffmpeg-renderers/vdpau.cpp index 66871286..033b7d01 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.cpp +++ b/app/streaming/video/ffmpeg-renderers/vdpau.cpp @@ -225,7 +225,7 @@ bool VDPAURenderer::initialize(PDECODER_PARAMETERS params) return true; } -bool VDPAURenderer::prepareDecoderContext(AVCodecContext* context) +bool VDPAURenderer::prepareDecoderContext(AVCodecContext* context, AVDictionary**) { context->hw_device_ctx = av_buffer_ref(m_HwContext); diff --git a/app/streaming/video/ffmpeg-renderers/vdpau.h b/app/streaming/video/ffmpeg-renderers/vdpau.h index c12bc6af..3260936a 100644 --- a/app/streaming/video/ffmpeg-renderers/vdpau.h +++ b/app/streaming/video/ffmpeg-renderers/vdpau.h @@ -14,7 +14,7 @@ public: VDPAURenderer(); virtual ~VDPAURenderer() override; virtual bool initialize(PDECODER_PARAMETERS params) override; - virtual bool prepareDecoderContext(AVCodecContext* context) override; + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary** options) override; virtual void renderFrame(AVFrame* frame) override; virtual bool needsTestFrame() override; virtual int getDecoderColorspace() override; diff --git a/app/streaming/video/ffmpeg-renderers/vt.mm b/app/streaming/video/ffmpeg-renderers/vt.mm index d955ecb6..ecd25841 100644 --- a/app/streaming/video/ffmpeg-renderers/vt.mm +++ b/app/streaming/video/ffmpeg-renderers/vt.mm @@ -410,7 +410,7 @@ public: } } - virtual bool prepareDecoderContext(AVCodecContext* context) override + virtual bool prepareDecoderContext(AVCodecContext* context, AVDictionary**) override { context->hw_device_ctx = av_buffer_ref(m_HwContext); diff --git a/app/streaming/video/ffmpeg.cpp b/app/streaming/video/ffmpeg.cpp index 3591daa7..280bc003 100644 --- a/app/streaming/video/ffmpeg.cpp +++ b/app/streaming/video/ffmpeg.cpp @@ -267,8 +267,10 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAM m_VideoDecoderCtx->pix_fmt = m_FrontendRenderer->getPreferredPixelFormat(params->videoFormat); m_VideoDecoderCtx->get_format = ffGetFormat; + AVDictionary* options = nullptr; + // Allow the backend renderer to attach data to this decoder - if (!m_BackendRenderer->prepareDecoderContext(m_VideoDecoderCtx)) { + if (!m_BackendRenderer->prepareDecoderContext(m_VideoDecoderCtx, &options)) { return false; } @@ -279,7 +281,8 @@ bool FFmpegVideoDecoder::completeInitialization(AVCodec* decoder, PDECODER_PARAM SDL_assert(m_VideoDecoderCtx->opaque == nullptr); m_VideoDecoderCtx->opaque = this; - int err = avcodec_open2(m_VideoDecoderCtx, decoder, nullptr); + int err = avcodec_open2(m_VideoDecoderCtx, decoder, &options); + av_dict_free(&options); if (err < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to open decoder for format: %x",