Commit c8674120 authored by Steve Lhomme's avatar Steve Lhomme

dxva: move the surface table allocation in each implementation

The helper functions never use it anyway.
parent 6ae3b9b4
......@@ -54,7 +54,6 @@ typedef picture_sys_d3d11_t VA_PICSYS;
#include "va_surface.h"
#define D3D_DecoderType ID3D11VideoDecoder
#define D3D_DecoderSurface ID3D11VideoDecoderOutputView
#include "directx_va.h"
static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
......@@ -121,6 +120,9 @@ struct vlc_va_sys_t
/* avcodec internals */
struct AVD3D11VAContext hw;
/* pool */
ID3D11VideoDecoderOutputView *hw_surface[MAX_SURFACE_COUNT];
ID3D11ShaderResourceView *renderSrc[MAX_SURFACE_COUNT * D3D11_MAX_SHADER_VIEW];
};
......@@ -143,7 +145,7 @@ static void SetupAVCodecContext(vlc_va_sys_t *sys)
sys->hw.decoder = dx_sys->decoder;
sys->hw.cfg = &sys->cfg;
sys->hw.surface_count = dx_sys->va_pool.surface_count;
sys->hw.surface = dx_sys->hw_surface;
sys->hw.surface = sys->hw_surface;
sys->hw.context_mutex = sys->d3d_dev.context_mutex;
if (IsEqualGUID(&dx_sys->input, &DXVA_Intel_H264_NoFGT_ClearVideo))
......@@ -214,8 +216,7 @@ done:
static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_index)
{
vlc_va_sys_t *sys = va->sys;
directx_sys_t *dx_sys = &sys->dx_sys;
ID3D11VideoDecoderOutputView *surface = dx_sys->hw_surface[surface_index];
ID3D11VideoDecoderOutputView *surface = sys->hw_surface[surface_index];
ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW];
ID3D11Resource *p_resource;
ID3D11VideoDecoderOutputView_GetResource(surface, &p_resource);
......@@ -734,7 +735,7 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id,
for (surface_idx = 0; surface_idx < surface_count; surface_idx++) {
picture_t *pic = decoder_NewPicture( (decoder_t*) vlc_object_parent(va) );
sys->extern_pics[surface_idx] = pic;
dx_sys->hw_surface[surface_idx] = NULL;
sys->hw_surface[surface_idx] = NULL;
if (pic==NULL)
{
msg_Warn(va, "not enough decoder pictures %d out of %d", surface_idx, surface_count);
......@@ -771,17 +772,17 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id,
D3D11_AllocateResourceView(va, sys->d3d_dev.d3ddevice, textureFmt, pic->p_sys->texture, pic->p_sys->slice_index, pic->p_sys->renderSrc);
dx_sys->hw_surface[surface_idx] = p_sys->decoder;
sys->hw_surface[surface_idx] = p_sys->decoder;
}
if (!dx_sys->can_extern_pool)
{
for (size_t i = 0; i < surface_idx; ++i)
{
if (dx_sys->hw_surface[i])
if (sys->hw_surface[i])
{
ID3D11VideoDecoderOutputView_Release(dx_sys->hw_surface[i]);
dx_sys->hw_surface[i] = NULL;
ID3D11VideoDecoderOutputView_Release(sys->hw_surface[i]);
sys->hw_surface[i] = NULL;
}
if (sys->extern_pics[i])
{
......@@ -830,7 +831,7 @@ static int DxCreateDecoderSurfaces(vlc_va_t *va, int codec_id,
hr = ID3D11VideoDevice_CreateVideoDecoderOutputView( sys->d3ddec,
(ID3D11Resource*) p_texture,
&viewDesc,
&dx_sys->hw_surface[surface_idx] );
&sys->hw_surface[surface_idx] );
if (FAILED(hr)) {
msg_Err(va, "CreateVideoDecoderOutputView %d failed. (hr=0x%lX)", surface_idx, hr);
ID3D11Texture2D_Release(p_texture);
......@@ -923,13 +924,13 @@ static void DxDestroySurfaces(vlc_va_sys_t *sys)
directx_sys_t *dx_sys = &sys->dx_sys;
if (dx_sys->va_pool.surface_count && !dx_sys->can_extern_pool) {
ID3D11Resource *p_texture;
ID3D11VideoDecoderOutputView_GetResource( dx_sys->hw_surface[0], &p_texture );
ID3D11VideoDecoderOutputView_GetResource( sys->hw_surface[0], &p_texture );
ID3D11Resource_Release(p_texture);
ID3D11Resource_Release(p_texture);
}
for (unsigned i = 0; i < dx_sys->va_pool.surface_count; i++)
{
ID3D11VideoDecoderOutputView_Release( dx_sys->hw_surface[i] );
ID3D11VideoDecoderOutputView_Release( sys->hw_surface[i] );
for (int j = 0; j < D3D11_MAX_SHADER_VIEW; j++)
{
if (sys->renderSrc[i*D3D11_MAX_SHADER_VIEW + j])
......
......@@ -36,7 +36,6 @@
#define COBJMACROS
#define D3D_DecoderType IUnknown
#define D3D_DecoderSurface IUnknown
#include "directx_va.h"
#include "avcodec.h"
......
......@@ -55,9 +55,6 @@ typedef struct
va_pool_t va_pool;
bool can_extern_pool;
/* for pre allocation */
D3D_DecoderSurface *hw_surface[MAX_SURFACE_COUNT];
/* Video service */
GUID input;
......
......@@ -41,7 +41,6 @@ typedef picture_sys_d3d9_t VA_PICSYS;
#include "va_surface.h"
#define D3D_DecoderType IDirectXVideoDecoder
#define D3D_DecoderSurface IDirect3DSurface9
#include "directx_va.h"
static int Open(vlc_va_t *, AVCodecContext *, enum PixelFormat,
......@@ -128,6 +127,9 @@ struct vlc_va_sys_t
DXVA2_ConfigPictureDecode cfg;
IDirectXVideoDecoderService *d3ddec;
/* pool */
IDirect3DSurface9 *hw_surface[MAX_SURFACE_COUNT];
/* avcodec internals */
struct dxva_context hw;
};
......@@ -151,7 +153,7 @@ static void SetupAVCodecContext(vlc_va_sys_t *sys)
sys->hw.decoder = dx_sys->decoder;
sys->hw.cfg = &sys->cfg;
sys->hw.surface_count = dx_sys->va_pool.surface_count;
sys->hw.surface = dx_sys->hw_surface;
sys->hw.surface = sys->hw_surface;
if (IsEqualGUID(&dx_sys->input, &DXVA_Intel_H264_NoFGT_ClearVideo))
sys->hw.workaround |= FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO;
......@@ -197,7 +199,7 @@ static struct va_pic_context *CreatePicContext(IDirect3DSurface9 *surface, IDire
static struct va_pic_context* NewSurfacePicContext(vlc_va_t *va, int surface_index)
{
directx_sys_t *dx_sys = &va->sys->dx_sys;
struct va_pic_context *pic_ctx = CreatePicContext(dx_sys->hw_surface[surface_index], dx_sys->decoder);
struct va_pic_context *pic_ctx = CreatePicContext(va->sys->hw_surface[surface_index], dx_sys->decoder);
if (unlikely(pic_ctx==NULL))
return NULL;
/* all the resources are acquired during surfaces init, and a second time in
......@@ -533,7 +535,7 @@ static int DxCreateVideoDecoder(vlc_va_t *va, int codec_id,
D3DPOOL_DEFAULT,
0,
DXVA2_VideoDecoderRenderTarget,
sys->hw_surface,
p_sys->hw_surface,
NULL);
if (FAILED(hr)) {
msg_Err(va, "IDirectXVideoAccelerationService_CreateSurface %d failed (hr=0x%lX)", surface_count - 1, hr);
......@@ -639,7 +641,7 @@ static int DxCreateVideoDecoder(vlc_va_t *va, int codec_id,
&sys->input,
&dsc,
&p_sys->cfg,
sys->hw_surface,
p_sys->hw_surface,
surface_count,
&decoder))) {
msg_Err(va, "IDirectXVideoDecoderService_CreateVideoDecoder failed");
......@@ -651,7 +653,7 @@ static int DxCreateVideoDecoder(vlc_va_t *va, int codec_id,
return VLC_SUCCESS;
error:
for (unsigned i = 0; i < surface_count; i++)
IDirect3DSurface9_Release( sys->hw_surface[i] );
IDirect3DSurface9_Release( p_sys->hw_surface[i] );
return VLC_EGENERIC;
}
......@@ -664,6 +666,6 @@ static void DxDestroyVideoDecoder(vlc_va_sys_t *sys)
IDirectXVideoDecoder_Release(dx_sys->decoder);
dx_sys->decoder = NULL;
for (unsigned i = 0; i < dx_sys->va_pool.surface_count; i++)
IDirect3DSurface9_Release(dx_sys->hw_surface[i]);
IDirect3DSurface9_Release(sys->hw_surface[i]);
}
}
......@@ -30,7 +30,6 @@
#include "../../video_chroma/dxgi_fmt.h"
#define D3D_DecoderType IUnknown
#define D3D_DecoderSurface IUnknown
#include "directx_va.h"
......
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