Commit 6fe1bf34 authored by Laurent Aimar's avatar Laurent Aimar Committed by Jean-Baptiste Kempf

Allocated mod16 D3D surfaces.

It seems necessary for ATI(?) dxva2 support.
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent edb14541
...@@ -230,6 +230,8 @@ typedef struct ...@@ -230,6 +230,8 @@ typedef struct
/* */ /* */
vlc_object_t *log; vlc_object_t *log;
int codec_id; int codec_id;
int width;
int height;
/* DLL */ /* DLL */
HINSTANCE hd3d9_dll; HINSTANCE hd3d9_dll;
...@@ -306,8 +308,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma, ...@@ -306,8 +308,7 @@ static int Setup(vlc_va_t *external, void **hw, vlc_fourcc_t *chroma,
{ {
vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external); vlc_va_dxva2_t *va = vlc_va_dxva2_Get(external);
if (va->surface_width == width && if (va->width == width && va->height == height && va->decoder)
va->surface_height == height)
goto ok; goto ok;
/* */ /* */
...@@ -378,7 +379,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) ...@@ -378,7 +379,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff)
lock.Pitch / 2, lock.Pitch / 2,
}; };
CopyFromYv12(picture, plane, pitch, CopyFromYv12(picture, plane, pitch,
va->surface_width, va->surface_height, va->width, va->height,
&va->surface_cache); &va->surface_cache);
} else { } else {
assert(va->render == MAKEFOURCC('N','V','1','2')); assert(va->render == MAKEFOURCC('N','V','1','2'));
...@@ -391,7 +392,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff) ...@@ -391,7 +392,7 @@ static int Extract(vlc_va_t *external, picture_t *picture, AVFrame *ff)
lock.Pitch, lock.Pitch,
}; };
CopyFromNv12(picture, plane, pitch, CopyFromNv12(picture, plane, pitch,
va->surface_width, va->surface_height, va->width, va->height,
&va->surface_cache); &va->surface_cache);
} }
...@@ -829,7 +830,12 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, ...@@ -829,7 +830,12 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
msg_Dbg(va->log, "DxCreateVideoDecoder id %d %dx%d", msg_Dbg(va->log, "DxCreateVideoDecoder id %d %dx%d",
codec_id, fmt->i_width, fmt->i_height); 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 */ /* 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) { switch (codec_id) {
case CODEC_ID_H264: case CODEC_ID_H264:
va->surface_count = 16 + 1; va->surface_count = 16 + 1;
...@@ -840,8 +846,8 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, ...@@ -840,8 +846,8 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
} }
LPDIRECT3DSURFACE9 surface_list[VA_DXVA2_MAX_SURFACE_COUNT]; LPDIRECT3DSURFACE9 surface_list[VA_DXVA2_MAX_SURFACE_COUNT];
if (FAILED(IDirectXVideoDecoderService_CreateSurface(va->vs, if (FAILED(IDirectXVideoDecoderService_CreateSurface(va->vs,
fmt->i_width, va->surface_width,
fmt->i_height, va->surface_height,
va->surface_count - 1, va->surface_count - 1,
va->render, va->render,
D3DPOOL_DEFAULT, D3DPOOL_DEFAULT,
...@@ -859,8 +865,6 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va, ...@@ -859,8 +865,6 @@ static int DxCreateVideoDecoder(vlc_va_dxva2_t *va,
surface->refcount = 0; surface->refcount = 0;
surface->order = 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)", msg_Dbg(va->log, "IDirectXVideoAccelerationService_CreateSurface succeed with %d surfaces (%dx%d)",
va->surface_count, fmt->i_width, fmt->i_height); va->surface_count, fmt->i_width, fmt->i_height);
......
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