From d5a5026d7f4567d12481099e80b15061dacc9b96 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sat, 26 Jun 2010 21:55:20 +0200 Subject: [PATCH] Allocated mod16 D3D surfaces. It seems necessary for ATI(?) dxva2 support. --- modules/codec/avcodec/dxva2.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c index 50c1bd5f9a..dc8a2aed73 100644 --- a/modules/codec/avcodec/dxva2.c +++ b/modules/codec/avcodec/dxva2.c @@ -227,6 +227,8 @@ typedef struct /* */ vlc_object_t *log; int codec_id; + int width; + int height; /* DLL */ HINSTANCE hd3d9_dll; @@ -303,8 +305,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma, { vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external); - if (va->surface_width == width && - va->surface_height == height) + if (va->width == width && va->height == height && va->decoder) goto ok; /* */ @@ -375,7 +376,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) lock.Pitch / 2, }; CopyFromYv12(picture, plane, pitch, - va->surface_width, va->surface_height, + va->width, va->height, &va->surface_cache); } else { assert(va->render == MAKEFOURCC('N','V','1','2')); @@ -388,7 +389,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) lock.Pitch, }; CopyFromNv12(picture, plane, pitch, - va->surface_width, va->surface_height, + va->width, va->height, &va->surface_cache); } @@ -826,7 +827,12 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, msg_Dbg(va->log, "DxCreateVideoDecoder id %d %dx%d", codec_id, fmt->i_width, fmt->i_height); + va->width = fmt->i_width; + va->height = fmt->i_height; + /* Allocates all surfaces needed for the decoder */ + va->surface_width = (fmt->i_width + 15) & ~15; + va->surface_height = (fmt->i_height + 15) & ~15; switch (codec_id) { case CODEC_ID_H264: va->surface_count = 16 + 1; @@ -837,8 +843,8 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, } LPDIRECT3DSURFACE9 surface_list[VA_DXVA2_MAX_SURFACE_COUNT]; if (FAILED(IDirectXVideoDecoderService_CreateSurface(va->vs, - fmt->i_width, - fmt->i_height, + va->surface_width, + va->surface_height, va->surface_count - 1, va->render, D3DPOOL_DEFAULT, @@ -856,8 +862,6 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, surface->refcount = 0; surface->order = 0; } - va->surface_width = fmt->i_width; - va->surface_height = fmt->i_height; msg_Dbg(va->log, "IDirectXVideoAccelerationService_CreateSurface succeed with %d surfaces (%dx%d)", va->surface_count, fmt->i_width, fmt->i_height); -- 2.39.2