Commit b655a1d7 authored by Steve Lhomme's avatar Steve Lhomme Committed by Jean-Baptiste Kempf

directx_va: don't pass the AVCodecContext and es_format_t to directx_va_Open

Only to directx_va_Setup (and va_pool_Setup)
Signed-off-by: Jean-Baptiste Kempf's avatarJean-Baptiste Kempf <jb@videolan.org>
parent 4e28f09f
...@@ -355,6 +355,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, ...@@ -355,6 +355,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
int err = VLC_EGENERIC; int err = VLC_EGENERIC;
directx_sys_t *dx_sys; directx_sys_t *dx_sys;
ctx->hwaccel_context = NULL;
if (pix_fmt != AV_PIX_FMT_D3D11VA_VLD) if (pix_fmt != AV_PIX_FMT_D3D11VA_VLD)
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -412,14 +414,14 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, ...@@ -412,14 +414,14 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
sys->i_chroma = d3d11va_fourcc(ctx->sw_pix_fmt); sys->i_chroma = d3d11va_fourcc(ctx->sw_pix_fmt);
#if VLC_WINSTORE_APP #if VLC_WINSTORE_APP
err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, false); err = directx_va_Open(va, &sys->dx_sys, false);
#else #else
err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, dx_sys->d3ddev == NULL || va->sys->d3dctx == NULL); err = directx_va_Open(va, &sys->dx_sys, dx_sys->d3ddev == NULL || va->sys->d3dctx == NULL);
#endif #endif
if (err!=VLC_SUCCESS) if (err!=VLC_SUCCESS)
goto error; goto error;
err = directx_va_Setup(va, &sys->dx_sys, ctx); err = directx_va_Setup(va, &sys->dx_sys, ctx, fmt);
if (err != VLC_SUCCESS) if (err != VLC_SUCCESS)
goto error; goto error;
......
...@@ -159,7 +159,7 @@ DEFINE_GUID(DXVA_ModeVP9_VLD_Profile0, 0x463707f8, 0xa1d0, 0x4585, ...@@ -159,7 +159,7 @@ DEFINE_GUID(DXVA_ModeVP9_VLD_Profile0, 0x463707f8, 0xa1d0, 0x4585,
typedef struct { typedef struct {
const char *name; const char *name;
const GUID *guid; const GUID *guid;
int codec; enum AVCodecID codec;
const int *p_profiles; // NULL or ends with 0 const int *p_profiles; // NULL or ends with 0
} directx_va_mode_t; } directx_va_mode_t;
...@@ -261,7 +261,7 @@ static const directx_va_mode_t DXVA_MODES[] = { ...@@ -261,7 +261,7 @@ static const directx_va_mode_t DXVA_MODES[] = {
{ NULL, NULL, 0, NULL } { NULL, NULL, 0, NULL }
}; };
static int FindVideoServiceConversion(vlc_va_t *, directx_sys_t *, const es_format_t *fmt); static int FindVideoServiceConversion(vlc_va_t *, directx_sys_t *, const es_format_t *, const AVCodecContext *);
char *directx_va_GetDecoderName(const GUID *guid) char *directx_va_GetDecoderName(const GUID *guid)
{ {
...@@ -277,12 +277,19 @@ char *directx_va_GetDecoderName(const GUID *guid) ...@@ -277,12 +277,19 @@ char *directx_va_GetDecoderName(const GUID *guid)
} }
/* */ /* */
int directx_va_Setup(vlc_va_t *va, directx_sys_t *dx_sys, AVCodecContext *avctx) int directx_va_Setup(vlc_va_t *va, directx_sys_t *dx_sys, const AVCodecContext *avctx,
const es_format_t *fmt)
{ {
/* */
if (FindVideoServiceConversion(va, dx_sys, fmt, avctx)) {
msg_Err(va, "FindVideoServiceConversion failed");
return VLC_EGENERIC;
}
int surface_alignment = 16; int surface_alignment = 16;
unsigned surface_count = 2; unsigned surface_count = 2;
switch ( dx_sys->va_pool.codec_id ) switch ( avctx->codec_id )
{ {
case AV_CODEC_ID_MPEG2VIDEO: case AV_CODEC_ID_MPEG2VIDEO:
/* decoding MPEG-2 requires additional alignment on some Intel GPUs, /* decoding MPEG-2 requires additional alignment on some Intel GPUs,
...@@ -317,8 +324,7 @@ void directx_va_Close(vlc_va_t *va, directx_sys_t *dx_sys) ...@@ -317,8 +324,7 @@ void directx_va_Close(vlc_va_t *va, directx_sys_t *dx_sys)
FreeLibrary(dx_sys->hdecoder_dll); FreeLibrary(dx_sys->hdecoder_dll);
} }
int directx_va_Open(vlc_va_t *va, directx_sys_t *dx_sys, int directx_va_Open(vlc_va_t *va, directx_sys_t *dx_sys, bool b_dll)
AVCodecContext *ctx, const es_format_t *fmt, bool b_dll)
{ {
if (b_dll) { if (b_dll) {
/* Load dll*/ /* Load dll*/
...@@ -330,15 +336,9 @@ int directx_va_Open(vlc_va_t *va, directx_sys_t *dx_sys, ...@@ -330,15 +336,9 @@ int directx_va_Open(vlc_va_t *va, directx_sys_t *dx_sys,
msg_Dbg(va, "DLLs loaded"); msg_Dbg(va, "DLLs loaded");
} }
if (va_pool_Open(va, &dx_sys->va_pool, ctx) != VLC_SUCCESS) if (va_pool_Open(va, &dx_sys->va_pool) != VLC_SUCCESS)
goto error; goto error;
/* */
if (FindVideoServiceConversion(va, dx_sys, fmt)) {
msg_Err(va, "FindVideoServiceConversion failed");
goto error;
}
return VLC_SUCCESS; return VLC_SUCCESS;
error: error:
...@@ -381,7 +381,8 @@ static bool profile_supported(const directx_va_mode_t *mode, const es_format_t * ...@@ -381,7 +381,8 @@ static bool profile_supported(const directx_va_mode_t *mode, const es_format_t *
/** /**
* Find the best suited decoder mode GUID and render format. * Find the best suited decoder mode GUID and render format.
*/ */
static int FindVideoServiceConversion(vlc_va_t *va, directx_sys_t *dx_sys, const es_format_t *fmt) static int FindVideoServiceConversion(vlc_va_t *va, directx_sys_t *dx_sys,
const es_format_t *fmt, const AVCodecContext *avctx)
{ {
input_list_t p_list = { 0 }; input_list_t p_list = { 0 };
int err = dx_sys->pf_get_input_list(va, &p_list); int err = dx_sys->pf_get_input_list(va, &p_list);
...@@ -404,7 +405,7 @@ static int FindVideoServiceConversion(vlc_va_t *va, directx_sys_t *dx_sys, const ...@@ -404,7 +405,7 @@ static int FindVideoServiceConversion(vlc_va_t *va, directx_sys_t *dx_sys, const
/* Try all supported mode by our priority */ /* Try all supported mode by our priority */
const directx_va_mode_t *mode = DXVA_MODES; const directx_va_mode_t *mode = DXVA_MODES;
for (; mode->name; ++mode) { for (; mode->name; ++mode) {
if (!mode->codec || mode->codec != dx_sys->va_pool.codec_id) if (!mode->codec || mode->codec != avctx->codec_id)
continue; continue;
/* */ /* */
......
...@@ -81,9 +81,9 @@ typedef struct ...@@ -81,9 +81,9 @@ typedef struct
} directx_sys_t; } directx_sys_t;
int directx_va_Open(vlc_va_t *, directx_sys_t *, AVCodecContext *ctx, const es_format_t *fmt, bool b_dll); int directx_va_Open(vlc_va_t *, directx_sys_t *, bool b_dll);
void directx_va_Close(vlc_va_t *, directx_sys_t *); void directx_va_Close(vlc_va_t *, directx_sys_t *);
int directx_va_Setup(vlc_va_t *, directx_sys_t *, AVCodecContext *avctx); int directx_va_Setup(vlc_va_t *, directx_sys_t *, const AVCodecContext *avctx, const es_format_t *);
char *directx_va_GetDecoderName(const GUID *guid); char *directx_va_GetDecoderName(const GUID *guid);
#endif /* AVCODEC_DIRECTX_VA_H */ #endif /* AVCODEC_DIRECTX_VA_H */
...@@ -294,6 +294,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, ...@@ -294,6 +294,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
if (pix_fmt != AV_PIX_FMT_DXVA2_VLD) if (pix_fmt != AV_PIX_FMT_DXVA2_VLD)
return VLC_EGENERIC; return VLC_EGENERIC;
ctx->hwaccel_context = NULL;
vlc_va_sys_t *sys = calloc(1, sizeof (*sys)); vlc_va_sys_t *sys = calloc(1, sizeof (*sys));
if (unlikely(sys == NULL)) if (unlikely(sys == NULL))
return VLC_ENOMEM; return VLC_ENOMEM;
...@@ -334,11 +336,11 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt, ...@@ -334,11 +336,11 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
sys->i_chroma = d3d9va_fourcc(ctx->sw_pix_fmt); sys->i_chroma = d3d9va_fourcc(ctx->sw_pix_fmt);
err = directx_va_Open(va, &sys->dx_sys, ctx, fmt, true); err = directx_va_Open(va, &sys->dx_sys, true);
if (err!=VLC_SUCCESS) if (err!=VLC_SUCCESS)
goto error; goto error;
err = directx_va_Setup(va, &sys->dx_sys, ctx); err = directx_va_Setup(va, &sys->dx_sys, ctx, fmt);
if (err != VLC_SUCCESS) if (err != VLC_SUCCESS)
goto error; goto error;
......
...@@ -48,7 +48,7 @@ static void DestroyVideoDecoder(vlc_va_t *va, va_pool_t *va_pool) ...@@ -48,7 +48,7 @@ static void DestroyVideoDecoder(vlc_va_t *va, va_pool_t *va_pool)
} }
/* */ /* */
int va_pool_Setup(vlc_va_t *va, va_pool_t *va_pool, AVCodecContext *avctx, unsigned count, int alignment) int va_pool_Setup(vlc_va_t *va, va_pool_t *va_pool, const AVCodecContext *avctx, unsigned count, int alignment)
{ {
int err = VLC_ENOMEM; int err = VLC_ENOMEM;
unsigned i = va_pool->surface_count; unsigned i = va_pool->surface_count;
...@@ -169,10 +169,8 @@ void va_pool_Close(vlc_va_t *va, va_pool_t *va_pool) ...@@ -169,10 +169,8 @@ void va_pool_Close(vlc_va_t *va, va_pool_t *va_pool)
va_pool->pf_destroy_device(va); va_pool->pf_destroy_device(va);
} }
int va_pool_Open(vlc_va_t *va, va_pool_t *va_pool, AVCodecContext *ctx) int va_pool_Open(vlc_va_t *va, va_pool_t *va_pool)
{ {
va_pool->codec_id = ctx->codec_id;
/* */ /* */
if (va_pool->pf_create_device(va)) { if (va_pool->pf_create_device(va)) {
msg_Err(va, "Failed to create device"); msg_Err(va, "Failed to create device");
......
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
#define MAX_SURFACE_COUNT (64) #define MAX_SURFACE_COUNT (64)
typedef struct typedef struct
{ {
int codec_id;
/* */ /* */
unsigned surface_count; unsigned surface_count;
int surface_width; int surface_width;
...@@ -76,9 +74,9 @@ typedef struct ...@@ -76,9 +74,9 @@ typedef struct
} va_pool_t; } va_pool_t;
int va_pool_Open(vlc_va_t *, va_pool_t *, AVCodecContext *); int va_pool_Open(vlc_va_t *, va_pool_t *);
void va_pool_Close(vlc_va_t *va, va_pool_t *); void va_pool_Close(vlc_va_t *va, va_pool_t *);
int va_pool_Setup(vlc_va_t *, va_pool_t *, AVCodecContext *, unsigned count, int alignment); int va_pool_Setup(vlc_va_t *, va_pool_t *, const AVCodecContext *, unsigned count, int alignment);
int va_pool_Get(vlc_va_t *, picture_t *, va_pool_t *); int va_pool_Get(vlc_va_t *, picture_t *, va_pool_t *);
void va_surface_AddRef(vlc_va_surface_t *surface); void va_surface_AddRef(vlc_va_surface_t *surface);
void va_surface_Release(vlc_va_surface_t *surface); void va_surface_Release(vlc_va_surface_t *surface);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment