[vlc-devel] [PATCH 21/42] avcodec: provide the vlc_decoder_device from the vout thread to the VA constructor
Steve Lhomme
robux4 at ycbcr.xyz
Wed Oct 16 16:58:56 CEST 2019
This is used to initialize the VA instead of the picture_sys_t from the
external decoder pool.
---
modules/codec/avcodec/d3d11va.c | 4 ++--
modules/codec/avcodec/dxva2.c | 4 ++--
modules/codec/avcodec/va.c | 7 ++++---
modules/codec/avcodec/va.h | 5 +++--
modules/codec/avcodec/vaapi.c | 2 +-
modules/codec/avcodec/video.c | 2 +-
modules/hw/vdpau/avcodec.c | 2 +-
7 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index 8fa15e640d4..2c0feef1602 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -62,7 +62,7 @@ struct d3d11va_pic_context
#include "directx_va.h"
static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, enum PixelFormat,
- const es_format_t *, void *);
+ const es_format_t *, void *, vlc_decoder_device *);
vlc_module_begin()
set_description(N_("Direct3D11 Video Acceleration"))
@@ -318,7 +318,7 @@ static const struct vlc_va_operations ops = { Get, Close, };
static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc,
enum PixelFormat pix_fmt,
- const es_format_t *fmt, void *picsys)
+ const es_format_t *fmt, void *picsys, vlc_decoder_device *dec_device)
{
int err = VLC_EGENERIC;
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 02f71b20280..194b498538f 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -49,7 +49,7 @@ struct dxva2_pic_context
#include "directx_va.h"
static int Open(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *, enum PixelFormat,
- const es_format_t *, void *);
+ const es_format_t *, void *, vlc_decoder_device *);
vlc_module_begin()
set_description(N_("DirectX Video Acceleration (DXVA) 2.0"))
@@ -256,7 +256,7 @@ static const struct vlc_va_operations ops = { Get, Close, };
static int Open(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc,
enum PixelFormat pix_fmt,
- const es_format_t *fmt, void *picsys)
+ const es_format_t *fmt, void *picsys, vlc_decoder_device *dec_device)
{
int err = VLC_EGENERIC;
diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c
index ac4bd75db88..2103f2fd438 100644
--- a/modules/codec/avcodec/va.c
+++ b/modules/codec/avcodec/va.c
@@ -95,17 +95,18 @@ static int vlc_va_Start(void *func, bool forced, va_list ap)
const AVPixFmtDescriptor *src_desc = va_arg(ap, const AVPixFmtDescriptor *);
enum PixelFormat pix_fmt = va_arg(ap, enum PixelFormat);
const es_format_t *fmt = va_arg(ap, const es_format_t *);
+ vlc_decoder_device *device = va_arg(ap, vlc_decoder_device *);
void *p_sys = va_arg(ap, void *);
vlc_va_open open = func;
(void) forced;
- return open(va, ctx, src_desc, pix_fmt, fmt, p_sys);
+ return open(va, ctx, src_desc, pix_fmt, fmt, p_sys, device);
}
vlc_va_t *vlc_va_New(vlc_object_t *obj,
AVCodecContext *avctx, const AVPixFmtDescriptor *src_desc,
enum PixelFormat pix_fmt, const es_format_t *fmt,
- void *sys)
+ vlc_decoder_device *device, void *sys)
{
struct vlc_va_t *va = vlc_object_create(obj, sizeof (*va));
if (unlikely(va == NULL))
@@ -114,7 +115,7 @@ vlc_va_t *vlc_va_New(vlc_object_t *obj,
char *modlist = var_InheritString(obj, "avcodec-hw");
if (vlc_module_load(va, "hw decoder", modlist, true,
- vlc_va_Start, va, avctx, src_desc, pix_fmt, fmt, sys) == NULL)
+ vlc_va_Start, va, avctx, src_desc, pix_fmt, fmt, device, sys) == NULL)
{
vlc_object_delete(va);
va = NULL;
diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h
index 7011124baaf..8bf2cfa5517 100644
--- a/modules/codec/avcodec/va.h
+++ b/modules/codec/avcodec/va.h
@@ -28,6 +28,7 @@
typedef struct vlc_va_t vlc_va_t;
typedef struct vlc_va_sys_t vlc_va_sys_t;
+typedef struct vlc_decoder_device vlc_decoder_device;
struct vlc_va_operations {
int (*get)(vlc_va_t *, picture_t *pic, uint8_t **surface);
@@ -43,7 +44,7 @@ struct vlc_va_t {
typedef int (*vlc_va_open)(vlc_va_t *, AVCodecContext *, const AVPixFmtDescriptor *,
enum PixelFormat,
- const es_format_t *, void *);
+ const es_format_t *, void *, vlc_decoder_device *);
#define set_va_callback(activate, priority) \
{ \
@@ -70,7 +71,7 @@ vlc_fourcc_t vlc_va_GetChroma(enum PixelFormat hwfmt, enum PixelFormat swfmt);
*/
vlc_va_t *vlc_va_New(vlc_object_t *obj, AVCodecContext *, const AVPixFmtDescriptor *,
enum PixelFormat, const es_format_t *fmt,
- void *p_sys);
+ vlc_decoder_device *device, void *p_sys);
/**
* Get a hardware video surface for a libavcodec frame.
diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index a374cedd507..87c67b79aab 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -147,7 +147,7 @@ static const struct vlc_va_operations ops = { Get, Delete, };
static int Create(vlc_va_t *va, AVCodecContext *ctx, const AVPixFmtDescriptor *desc,
enum PixelFormat pix_fmt,
- const es_format_t *fmt, void *p_sys)
+ const es_format_t *fmt, void *p_sys, vlc_decoder_device *device)
{
VLC_UNUSED(desc);
if (pix_fmt != AV_PIX_FMT_VAAPI_VLD || p_sys == NULL)
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 9c2090e6024..af90a01fe3e 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -1752,7 +1752,7 @@ no_reuse:
// TEMP: decoder_NewPicture cannot be used until decoder_UpdateVideoOutput is called
vlc_va_t *va = vlc_va_New(VLC_OBJECT(p_dec), p_context, src_desc, hwfmt,
&p_dec->fmt_in,
- NULL);
+ init_device, NULL);
if (init_device)
vlc_decoder_device_Release(init_device);
vlc_mutex_lock(&p_sys->lock);
diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
index e0b94ec55e5..3c8317ca12d 100644
--- a/modules/hw/vdpau/avcodec.c
+++ b/modules/hw/vdpau/avcodec.c
@@ -134,7 +134,7 @@ static const struct vlc_va_operations ops = { Lock, Close, };
static int Open(vlc_va_t *va, AVCodecContext *avctx, const AVPixFmtDescriptor *desc,
enum PixelFormat pix_fmt,
- const es_format_t *fmt, void *p_sys)
+ const es_format_t *fmt, void *p_sys, vlc_decoder_device *dec_device)
{
if (pix_fmt != AV_PIX_FMT_VDPAU)
return VLC_EGENERIC;
--
2.17.1
More information about the vlc-devel
mailing list