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

directx_va: make va_pic_context public via va_surface.h

Signed-off-by: Jean-Baptiste Kempf's avatarJean-Baptiste Kempf <jb@videolan.org>
parent abe40414
...@@ -237,7 +237,7 @@ done: ...@@ -237,7 +237,7 @@ done:
return pic_ctx; return pic_ctx;
} }
static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *va_surface, ID3D11VideoDecoderOutputView *surface) static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, ID3D11VideoDecoderOutputView *surface)
{ {
ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW]; ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW];
ID3D11Resource *p_resource; ID3D11Resource *p_resource;
...@@ -249,7 +249,7 @@ static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *v ...@@ -249,7 +249,7 @@ static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *v
for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++) for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++)
resourceView[i] = va->sys->resourceView[viewDesc.Texture2D.ArraySlice*D3D11_MAX_SHADER_VIEW + i]; resourceView[i] = va->sys->resourceView[viewDesc.Texture2D.ArraySlice*D3D11_MAX_SHADER_VIEW + i];
struct va_pic_context *pic_ctx = CreatePicContext(va_surface, struct va_pic_context *pic_ctx = CreatePicContext(NULL,
surface, surface,
p_resource, p_resource,
va->sys->d3dctx, va->sys->d3dctx,
...@@ -262,7 +262,7 @@ static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *v ...@@ -262,7 +262,7 @@ static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *v
* CreatePicContext(), undo one of them otherwise we need an extra release * CreatePicContext(), undo one of them otherwise we need an extra release
* when the pool is emptied */ * when the pool is emptied */
ReleasePictureSys(&pic_ctx->picsys); ReleasePictureSys(&pic_ctx->picsys);
return &pic_ctx->s; return pic_ctx;
} }
static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
...@@ -304,7 +304,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) ...@@ -304,7 +304,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
else else
#endif #endif
{ {
int res = va_pool_Get(va, pic, &va->sys->dx_sys.va_pool); int res = va_pool_Get(&va->sys->dx_sys.va_pool, pic);
if (unlikely(res != VLC_SUCCESS)) if (unlikely(res != VLC_SUCCESS))
return res; return res;
} }
......
...@@ -40,7 +40,9 @@ ...@@ -40,7 +40,9 @@
#define D3D_DecoderType IUnknown #define D3D_DecoderType IUnknown
#define D3D_DecoderDevice IUnknown #define D3D_DecoderDevice IUnknown
#define D3D_DecoderSurface IUnknown #define D3D_DecoderSurface IUnknown
typedef struct vlc_va_surface_t vlc_va_surface_t; struct picture_sys_t {
void *dummy;
};
#include "directx_va.h" #include "directx_va.h"
#include "avcodec.h" #include "avcodec.h"
......
...@@ -198,10 +198,7 @@ static struct va_pic_context *CreatePicContext(vlc_va_surface_t *, IDirect3DSurf ...@@ -198,10 +198,7 @@ static struct va_pic_context *CreatePicContext(vlc_va_surface_t *, IDirect3DSurf
static struct picture_context_t *d3d9_pic_context_copy(struct picture_context_t *ctx) static struct picture_context_t *d3d9_pic_context_copy(struct picture_context_t *ctx)
{ {
struct va_pic_context *src_ctx = (struct va_pic_context*)ctx; struct va_pic_context *src_ctx = (struct va_pic_context*)ctx;
struct va_pic_context *pic_ctx = CreatePicContext(src_ctx->va_surface, src_ctx->picsys.surface); return (picture_context_t*)CreatePicContext(src_ctx->va_surface, src_ctx->picsys.surface);
if (unlikely(pic_ctx==NULL))
return NULL;
return &pic_ctx->s;
} }
static struct va_pic_context *CreatePicContext(vlc_va_surface_t *va_surface, IDirect3DSurface9 *surface) static struct va_pic_context *CreatePicContext(vlc_va_surface_t *va_surface, IDirect3DSurface9 *surface)
...@@ -218,13 +215,10 @@ static struct va_pic_context *CreatePicContext(vlc_va_surface_t *va_surface, IDi ...@@ -218,13 +215,10 @@ static struct va_pic_context *CreatePicContext(vlc_va_surface_t *va_surface, IDi
return pic_ctx; return pic_ctx;
} }
static picture_context_t* NewSurfacePicContext(vlc_va_t *va, vlc_va_surface_t *va_surface, IDirect3DSurface9 *surface) static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, IDirect3DSurface9 *surface)
{ {
VLC_UNUSED(va); VLC_UNUSED(va);
struct va_pic_context *pic_ctx = CreatePicContext(va_surface, surface); return CreatePicContext(NULL, surface);
if (unlikely(pic_ctx==NULL))
return NULL;
return &pic_ctx->s;
} }
static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
...@@ -241,7 +235,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data) ...@@ -241,7 +235,7 @@ static int Get(vlc_va_t *va, picture_t *pic, uint8_t **data)
return VLC_EGENERIC; return VLC_EGENERIC;
} }
int res = va_pool_Get(va, pic, &sys->dx_sys.va_pool); int res = va_pool_Get(&sys->dx_sys.va_pool, pic);
if (likely(res==VLC_SUCCESS)) if (likely(res==VLC_SUCCESS))
*data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface; *data = (uint8_t*)((struct va_pic_context*)pic->context)->picsys.surface;
return res; return res;
......
...@@ -36,7 +36,9 @@ ...@@ -36,7 +36,9 @@
#define D3D_DecoderSurface void #define D3D_DecoderSurface void
typedef struct vlc_va_surface_t vlc_va_surface_t; struct picture_sys_t {
void *dummy;
};
#include "va_surface_internal.h" #include "va_surface_internal.h"
#include "avcodec.h" #include "avcodec.h"
...@@ -93,11 +95,11 @@ int va_pool_Setup(vlc_va_t *va, va_pool_t *va_pool, const AVCodecContext *avctx, ...@@ -93,11 +95,11 @@ int va_pool_Setup(vlc_va_t *va, va_pool_t *va_pool, const AVCodecContext *avctx,
return VLC_EGENERIC; return VLC_EGENERIC;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
vlc_va_surface_t *surface = malloc(sizeof(*surface)); struct va_pic_context *p_ctx = va_pool->pf_new_surface_context(va, va_pool->hw_surface[i]);
if (unlikely(surface==NULL)) if (unlikely(p_ctx==NULL))
goto done; goto done;
atomic_init(&surface->refcount, 1); atomic_init(&p_ctx->va_surface->refcount, 1);
va_pool->surface[i] = surface; va_pool->surface[i] = p_ctx;
} }
va_pool->surface_width = surface_width; va_pool->surface_width = surface_width;
...@@ -111,18 +113,18 @@ done: ...@@ -111,18 +113,18 @@ done:
return err; return err;
} }
static picture_context_t *GetSurface(vlc_va_t *va, va_pool_t *va_pool) static picture_context_t *GetSurface(va_pool_t *va_pool)
{ {
for (unsigned i = 0; i < va_pool->surface_count; i++) { for (unsigned i = 0; i < va_pool->surface_count; i++) {
vlc_va_surface_t *surface = va_pool->surface[i]; struct va_pic_context *surface = va_pool->surface[i];
uintptr_t expected = 1; uintptr_t expected = 1;
if (atomic_compare_exchange_strong(&surface->refcount, &expected, 2)) if (atomic_compare_exchange_strong(&surface->va_surface->refcount, &expected, 2))
{ {
picture_context_t *field = va_pool->pf_new_surface_context(va, surface, va_pool->hw_surface[i]); picture_context_t *field = surface->s.copy(&surface->s);
if (!field) if (!field)
{ {
atomic_fetch_sub(&surface->refcount, 1); atomic_fetch_sub(&surface->va_surface->refcount, 1);
continue; continue;
} }
return field; return field;
...@@ -131,12 +133,12 @@ static picture_context_t *GetSurface(vlc_va_t *va, va_pool_t *va_pool) ...@@ -131,12 +133,12 @@ static picture_context_t *GetSurface(vlc_va_t *va, va_pool_t *va_pool)
return NULL; return NULL;
} }
int va_pool_Get(vlc_va_t *va, picture_t *pic, va_pool_t *va_pool) int va_pool_Get(va_pool_t *va_pool, picture_t *pic)
{ {
unsigned tries = (CLOCK_FREQ + VOUT_OUTMEM_SLEEP) / VOUT_OUTMEM_SLEEP; unsigned tries = (CLOCK_FREQ + VOUT_OUTMEM_SLEEP) / VOUT_OUTMEM_SLEEP;
picture_context_t *field; picture_context_t *field;
while ((field = GetSurface(va, va_pool)) == NULL) while ((field = GetSurface(va_pool)) == NULL)
{ {
if (--tries == 0) if (--tries == 0)
return VLC_ENOITEM; return VLC_ENOITEM;
......
/***************************************************************************** /*****************************************************************************
* directx_va.h: DirectX Generic Video Acceleration helpers * va_surface.h: libavcodec Generic Video Acceleration helpers
***************************************************************************** *****************************************************************************
* Copyright (C) 2009 Geoffroy Couprie * Copyright (C) 2009 Geoffroy Couprie
* Copyright (C) 2009 Laurent Aimar * Copyright (C) 2009 Laurent Aimar
...@@ -27,13 +27,13 @@ ...@@ -27,13 +27,13 @@
#ifndef AVCODEC_VA_SURFACE_H #ifndef AVCODEC_VA_SURFACE_H
#define AVCODEC_VA_SURFACE_H #define AVCODEC_VA_SURFACE_H
#include <vlc_common.h> #include <vlc_picture.h>
#include <stdatomic.h> struct va_pic_context
{
/* */ picture_context_t s;
struct vlc_va_surface_t { struct vlc_va_surface_t *va_surface;
atomic_uintptr_t refcount; struct picture_sys_t picsys;
}; };
#endif /* AVCODEC_VA_SURFACE_H */ #endif /* AVCODEC_VA_SURFACE_H */
...@@ -32,6 +32,13 @@ ...@@ -32,6 +32,13 @@
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
#include "va.h" #include "va.h"
#include <stdatomic.h>
/* */
typedef struct vlc_va_surface_t {
atomic_uintptr_t refcount;
} vlc_va_surface_t;
#define MAX_SURFACE_COUNT (64) #define MAX_SURFACE_COUNT (64)
typedef struct typedef struct
{ {
...@@ -40,8 +47,8 @@ typedef struct ...@@ -40,8 +47,8 @@ typedef struct
int surface_width; int surface_width;
int surface_height; int surface_height;
vlc_va_surface_t *surface[MAX_SURFACE_COUNT]; struct va_pic_context *surface[MAX_SURFACE_COUNT];
D3D_DecoderSurface *hw_surface[MAX_SURFACE_COUNT]; D3D_DecoderSurface *hw_surface[MAX_SURFACE_COUNT];
int (*pf_create_device)(vlc_va_t *); int (*pf_create_device)(vlc_va_t *);
void (*pf_destroy_device)(vlc_va_t *); void (*pf_destroy_device)(vlc_va_t *);
...@@ -70,14 +77,14 @@ typedef struct ...@@ -70,14 +77,14 @@ typedef struct
/** /**
* Create a new context for the surface being acquired * Create a new context for the surface being acquired
*/ */
picture_context_t* (*pf_new_surface_context)(vlc_va_t *, vlc_va_surface_t *, D3D_DecoderSurface *); struct va_pic_context* (*pf_new_surface_context)(vlc_va_t *, D3D_DecoderSurface *);
} va_pool_t; } va_pool_t;
int va_pool_Open(vlc_va_t *, va_pool_t *); 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 *, const 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(va_pool_t *, picture_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);
......
...@@ -32,8 +32,6 @@ ...@@ -32,8 +32,6 @@
DEFINE_GUID(GUID_CONTEXT_MUTEX, 0x472e8835, 0x3f8e, 0x4f93, 0xa0, 0xcb, 0x25, 0x79, 0x77, 0x6c, 0xed, 0x86); DEFINE_GUID(GUID_CONTEXT_MUTEX, 0x472e8835, 0x3f8e, 0x4f93, 0xa0, 0xcb, 0x25, 0x79, 0x77, 0x6c, 0xed, 0x86);
typedef struct vlc_va_surface_t vlc_va_surface_t;
/* owned by the vout for VLC_CODEC_D3D11_OPAQUE */ /* owned by the vout for VLC_CODEC_D3D11_OPAQUE */
struct picture_sys_t struct picture_sys_t
{ {
...@@ -50,13 +48,7 @@ struct picture_sys_t ...@@ -50,13 +48,7 @@ struct picture_sys_t
DXGI_FORMAT formatTexture; DXGI_FORMAT formatTexture;
}; };
/* owned by the hardware decoder */ #include "../codec/avcodec/va_surface.h"
struct va_pic_context
{
picture_context_t s;
vlc_va_surface_t *va_surface;
struct picture_sys_t picsys;
};
/* index to use for texture/resource that use a known DXGI format /* index to use for texture/resource that use a known DXGI format
* (ie not DXGI_FORMAT_UNKNWON) */ * (ie not DXGI_FORMAT_UNKNWON) */
......
...@@ -25,21 +25,13 @@ ...@@ -25,21 +25,13 @@
#include <vlc_picture.h> #include <vlc_picture.h>
typedef struct vlc_va_surface_t vlc_va_surface_t;
/* owned by the vout for VLC_CODEC_D3D9_OPAQUE */ /* owned by the vout for VLC_CODEC_D3D9_OPAQUE */
struct picture_sys_t struct picture_sys_t
{ {
LPDIRECT3DSURFACE9 surface; LPDIRECT3DSURFACE9 surface;
}; };
/* owned by the hardware decoder */ #include "../codec/avcodec/va_surface.h"
struct va_pic_context
{
picture_context_t s;
struct picture_sys_t picsys;
vlc_va_surface_t *va_surface;
};
static inline void AcquirePictureSys(picture_sys_t *p_sys) static inline void AcquirePictureSys(picture_sys_t *p_sys)
{ {
......
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