[vlc-devel] [PATCH] dxva2: remove the internal filter to output YV12
Steve Lhomme
robux4 at videolabs.io
Wed May 17 13:45:18 CEST 2017
It won't be used anyway as it doesn't match the output of vlc_va_GetChroma().
---
modules/codec/avcodec/dxva2.c | 119 ++++++------------------------------------
1 file changed, 17 insertions(+), 102 deletions(-)
diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 31ca03185c..e3a6c5f1b3 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -128,9 +128,6 @@ struct vlc_va_sys_t
/* Video decoder */
DXVA2_ConfigPictureDecode cfg;
- /* Option conversion */
- filter_t *filter;
-
/* avcodec internals */
struct dxva_context hw;
};
@@ -157,66 +154,10 @@ static void DxDestroyVideoDecoder(vlc_va_t *);
static int DxResetVideoDecoder(vlc_va_t *);
static void SetupAVCodecContext(vlc_va_t *);
-static void DeleteFilter( filter_t * p_filter )
-{
- if( p_filter->p_module )
- module_unneed( p_filter, p_filter->p_module );
-
- es_format_Clean( &p_filter->fmt_in );
- es_format_Clean( &p_filter->fmt_out );
-
- vlc_object_release( p_filter );
-}
-
-static picture_t *video_new_buffer(filter_t *p_filter)
-{
- return p_filter->owner.sys;
-}
-
-static filter_t *CreateFilter( vlc_object_t *p_this, const es_format_t *p_fmt_in,
- vlc_fourcc_t src_chroma )
-{
- filter_t *p_filter;
-
- p_filter = vlc_object_create( p_this, sizeof(filter_t) );
- if (unlikely(p_filter == NULL))
- return NULL;
-
- p_filter->owner.video.buffer_new = (picture_t *(*)(filter_t *))video_new_buffer;
-
- vlc_fourcc_t fmt_out;
- switch (src_chroma)
- {
- case VLC_CODEC_D3D9_OPAQUE_10B:
- fmt_out = VLC_CODEC_P010;
- break;
- case VLC_CODEC_D3D9_OPAQUE:
- fmt_out = VLC_CODEC_YV12;
- break;
- }
-
- es_format_InitFromVideo( &p_filter->fmt_in, &p_fmt_in->video );
- es_format_InitFromVideo( &p_filter->fmt_out, &p_fmt_in->video );
- p_filter->fmt_in.i_codec = p_filter->fmt_in.video.i_chroma = src_chroma;
- p_filter->fmt_out.i_codec = p_filter->fmt_out.video.i_chroma = fmt_out;
- p_filter->p_module = module_need( p_filter, "video converter", NULL, false );
-
- if( !p_filter->p_module )
- {
- msg_Dbg( p_filter, "no video converter found" );
- DeleteFilter( p_filter );
- return NULL;
- }
-
- return p_filter;
-}
-
/* */
static void Setup(vlc_va_t *va, vlc_fourcc_t *chroma)
{
- vlc_va_sys_t *sys = va->sys;
-
- *chroma = sys->filter == NULL ? sys->i_chroma : VLC_CODEC_YV12;
+ *chroma = va->sys->i_chroma;
}
void SetupAVCodecContext(vlc_va_t *va)
@@ -237,39 +178,26 @@ static int Extract(vlc_va_t *va, picture_t *picture, uint8_t *data)
{
directx_sys_t *dx_sys = &va->sys->dx_sys;
LPDIRECT3DSURFACE9 d3d = (LPDIRECT3DSURFACE9)(uintptr_t)data;
- if ( picture->format.i_chroma == VLC_CODEC_D3D9_OPAQUE ||
- picture->format.i_chroma == VLC_CODEC_D3D9_OPAQUE_10B )
- {
- picture_sys_t *p_sys = picture->p_sys;
- LPDIRECT3DSURFACE9 output = p_sys->surface;
+ picture_sys_t *p_sys = picture->p_sys;
+ LPDIRECT3DSURFACE9 output = p_sys->surface;
- assert(d3d != output);
+ assert(d3d != output);
#ifndef NDEBUG
- LPDIRECT3DDEVICE9 srcDevice, dstDevice;
- IDirect3DSurface9_GetDevice(d3d, &srcDevice);
- IDirect3DSurface9_GetDevice(output, &dstDevice);
- assert(srcDevice == dstDevice);
+ LPDIRECT3DDEVICE9 srcDevice, dstDevice;
+ IDirect3DSurface9_GetDevice(d3d, &srcDevice);
+ IDirect3DSurface9_GetDevice(output, &dstDevice);
+ assert(srcDevice == dstDevice);
#endif
- HRESULT hr;
- RECT visibleSource;
- visibleSource.left = 0;
- visibleSource.top = 0;
- visibleSource.right = picture->format.i_visible_width;
- visibleSource.bottom = picture->format.i_visible_height;
- hr = IDirect3DDevice9_StretchRect( (IDirect3DDevice9*) dx_sys->d3ddev, d3d, &visibleSource, output, &visibleSource, D3DTEXF_NONE);
- if (FAILED(hr)) {
- msg_Err(va, "Failed to copy the hw surface to the decoder surface (hr=0x%0lx)", hr );
- return VLC_EGENERIC;
- }
- }
- else if (va->sys->filter != NULL) {
- va->sys->filter->owner.sys = picture;
- vlc_va_surface_t *surface = picture->context;
- picture_Hold( surface->p_pic );
- va->sys->filter->pf_video_filter( va->sys->filter, surface->p_pic );
- } else {
- msg_Err(va, "Unsupported output picture format %08X", picture->format.i_chroma );
+ HRESULT hr;
+ RECT visibleSource;
+ visibleSource.left = 0;
+ visibleSource.top = 0;
+ visibleSource.right = picture->format.i_visible_width;
+ visibleSource.bottom = picture->format.i_visible_height;
+ hr = IDirect3DDevice9_StretchRect( (IDirect3DDevice9*) dx_sys->d3ddev, d3d, &visibleSource, output, &visibleSource, D3DTEXF_NONE);
+ if (FAILED(hr)) {
+ msg_Err(va, "Failed to copy the hw surface to the decoder surface (hr=0x%0lx)", hr );
return VLC_EGENERIC;
}
@@ -303,12 +231,6 @@ static void Close(vlc_va_t *va, AVCodecContext *ctx)
(void) ctx;
- if (sys->filter)
- {
- DeleteFilter( sys->filter );
- sys->filter = NULL;
- }
-
directx_va_Close(va, &sys->dx_sys);
if (sys->hd3d9_dll)
@@ -386,13 +308,6 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
if (err!=VLC_SUCCESS)
goto error;
- if (p_sys == NULL)
- {
- sys->filter = CreateFilter( VLC_OBJECT(va), fmt, sys->i_chroma);
- if (sys->filter == NULL)
- goto error;
- }
-
err = directx_va_Setup(va, &sys->dx_sys, ctx);
if (err != VLC_SUCCESS)
goto error;
--
2.12.1
More information about the vlc-devel
mailing list