vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon Dec 24 16:18:09 2018 +0200| [9ca48ab2e06440fe442756b461f30ad90e46f784] | committer: Rémi Denis-Courmont
vdpau: factor output surface allocation > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9ca48ab2e06440fe442756b461f30ad90e46f784 --- modules/hw/vdpau/Makefile.am | 2 +- modules/hw/vdpau/display.c | 56 ++------------------------- modules/hw/vdpau/picture.c | 42 ++++++++++++++++++++ modules/hw/vdpau/vlc_vdpau.h | 3 ++ modules/video_output/Makefile.am | 2 +- modules/video_output/opengl/converter_vdpau.c | 41 +++----------------- 6 files changed, 56 insertions(+), 90 deletions(-) diff --git a/modules/hw/vdpau/Makefile.am b/modules/hw/vdpau/Makefile.am index 812f068df8..2d3c8c24a0 100644 --- a/modules/hw/vdpau/Makefile.am +++ b/modules/hw/vdpau/Makefile.am @@ -30,7 +30,7 @@ libvdpau_chroma_plugin_la_SOURCES = hw/vdpau/chroma.c hw/vdpau/picture.c libvdpau_chroma_plugin_la_CFLAGS = $(AM_CFLAGS) $(VDPAU_CFLAGS) libvdpau_chroma_plugin_la_LIBADD = libvlc_vdpau.la -libvdpau_display_plugin_la_SOURCES = hw/vdpau/display.c +libvdpau_display_plugin_la_SOURCES = hw/vdpau/display.c hw/vdpau/picture.c libvdpau_display_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/video_output/xcb libvdpau_display_plugin_la_CFLAGS = $(AM_CFLAGS) $(XCB_CFLAGS) $(VDPAU_CFLAGS) libvdpau_display_plugin_la_LIBADD = libvlc_vdpau.la libvlc_xcb_events.la \ diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c index b01809c548..25db2e28ae 100644 --- a/modules/hw/vdpau/display.c +++ b/modules/hw/vdpau/display.c @@ -70,53 +70,6 @@ struct vout_display_sys_t unsigned height; }; -static void pictureSys_DestroyVDPAU(vlc_vdp_output_surface_t *psys) -{ - vdp_output_surface_destroy(psys->vdp, psys->surface); - vdp_release_x11(psys->vdp); - free(psys); -} - -static void PictureDestroyVDPAU(picture_t *pic) -{ - pictureSys_DestroyVDPAU(pic->p_sys); -} - -static VdpStatus picture_NewVDPAU(vdp_t *vdp, VdpRGBAFormat rgb_fmt, - const video_format_t *restrict fmt, - picture_t **restrict picp) -{ - vlc_vdp_output_surface_t *psys = malloc(sizeof (*psys)); - if (unlikely(psys == NULL)) - return VDP_STATUS_RESOURCES; - - psys->vdp = vdp_hold_x11(vdp, &psys->device); - - VdpStatus err = vdp_output_surface_create(psys->vdp, psys->device, - rgb_fmt, fmt->i_visible_width, fmt->i_visible_height, - &psys->surface); - if (err != VDP_STATUS_OK) - { - vdp_release_x11(psys->vdp); - free(psys); - return err; - } - - picture_resource_t res = { - .p_sys = psys, - .pf_destroy = PictureDestroyVDPAU, - }; - - picture_t *pic = picture_NewFromResource(fmt, &res); - if (unlikely(pic == NULL)) - { - pictureSys_DestroyVDPAU(psys); - return VDP_STATUS_RESOURCES; - } - *picp = pic; - return VDP_STATUS_OK; -} - static picture_pool_t *PoolAlloc(vout_display_t *vd, unsigned requested_count) { vout_display_sys_t *sys = vd->sys; @@ -125,12 +78,11 @@ static picture_pool_t *PoolAlloc(vout_display_t *vd, unsigned requested_count) unsigned count = 0; while (count < requested_count) { - VdpStatus err = picture_NewVDPAU(sys->vdp, sys->rgb_fmt, &vd->fmt, - pics + count); - if (err != VDP_STATUS_OK) + pics[count] = vlc_vdp_output_surface_create(sys->vdp, sys->rgb_fmt, + &vd->fmt); + if (pics[count] == NULL) { - msg_Err(vd, "%s creation failure: %s", "output surface", - vdp_get_error_string(sys->vdp, err)); + msg_Err(vd, "%s creation failure", "output surface"); break; } count++; diff --git a/modules/hw/vdpau/picture.c b/modules/hw/vdpau/picture.c index d48d937505..be1940ab22 100644 --- a/modules/hw/vdpau/picture.c +++ b/modules/hw/vdpau/picture.c @@ -126,3 +126,45 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface, pic->context = &field->context; return VDP_STATUS_OK; } + +static void vlc_vdp_output_surface_destroy(picture_t *pic) +{ + vlc_vdp_output_surface_t *sys = pic->p_sys; + + vdp_output_surface_destroy(sys->vdp, sys->surface); + vdp_release_x11(sys->vdp); + free(sys); +} + +picture_t *vlc_vdp_output_surface_create(vdp_t *vdp, VdpRGBAFormat rgb_fmt, + const video_format_t *restrict fmt) +{ + vlc_vdp_output_surface_t *sys = malloc(sizeof (*sys)); + if (unlikely(sys == NULL)) + return NULL; + + sys->vdp = vdp_hold_x11(vdp, &sys->device); + + VdpStatus err = vdp_output_surface_create(vdp, sys->device, rgb_fmt, + fmt->i_visible_width, fmt->i_visible_height, &sys->surface); + if (err != VDP_STATUS_OK) + { +error: + vdp_release_x11(vdp); + free(sys); + return NULL; + } + + picture_resource_t res = { + .p_sys = sys, + .pf_destroy = vlc_vdp_output_surface_destroy, + }; + + picture_t *pic = picture_NewFromResource(fmt, &res); + if (unlikely(pic == NULL)) + { + vdp_output_surface_destroy(vdp, sys->surface); + goto error; + } + return pic; +} diff --git a/modules/hw/vdpau/vlc_vdpau.h b/modules/hw/vdpau/vlc_vdpau.h index 11070d2228..e29013620a 100644 --- a/modules/hw/vdpau/vlc_vdpau.h +++ b/modules/hw/vdpau/vlc_vdpau.h @@ -306,4 +306,7 @@ typedef struct vlc_vdp_output_surface void *gl_nv_surface; } vlc_vdp_output_surface_t; +picture_t *vlc_vdp_output_surface_create(vdp_t *vdp, VdpRGBAFormat rgb_fmt, + const video_format_t *restrict fmt); + #endif diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am index 8051b5e554..bd3363954e 100644 --- a/modules/video_output/Makefile.am +++ b/modules/video_output/Makefile.am @@ -95,7 +95,7 @@ libglconv_vaapi_drm_plugin_la_LIBADD = $(LIBVA_LIBS) $(LIBVA_EGL_LIBS) \ $(LIBVA_DRM_LIBS) libglconv_vdpau_plugin_la_SOURCES = video_output/opengl/converter_vdpau.c \ - video_output/opengl/converter.h hw/vdpau/vlc_vdpau.h + video_output/opengl/converter.h hw/vdpau/picture.c hw/vdpau/vlc_vdpau.h libglconv_vdpau_plugin_la_CFLAGS = $(AM_CFLAGS) $(VDPAU_CFLAGS) libglconv_vdpau_plugin_la_LIBADD = $(LIBDL) libvlc_vdpau.la $(X_LIBS) $(X_PRE_LIBS) -lX11 diff --git a/modules/video_output/opengl/converter_vdpau.c b/modules/video_output/opengl/converter_vdpau.c index 5671ea30b4..00275771b3 100644 --- a/modules/video_output/opengl/converter_vdpau.c +++ b/modules/video_output/opengl/converter_vdpau.c @@ -63,16 +63,6 @@ static PFNGLVDPAUSURFACEACCESSNVPROC _glVDPAUSurfaceAccessNV; static PFNGLVDPAUMAPSURFACESNVPROC _glVDPAUMapSurfacesNV; static PFNGLVDPAUUNMAPSURFACESNVPROC _glVDPAUUnmapSurfacesNV; -static void -pool_pic_destroy_cb(picture_t *pic) -{ - vlc_vdp_output_surface_t *p_sys = pic->p_sys; - - vdp_output_surface_destroy(p_sys->vdp, p_sys->surface); - vdp_release_x11(p_sys->vdp); - free(p_sys); -} - static picture_pool_t * tc_vdpau_gl_get_pool(opengl_tex_converter_t const *tc, unsigned int requested_count) @@ -83,36 +73,15 @@ tc_vdpau_gl_get_pool(opengl_tex_converter_t const *tc, unsigned int i; for (i = 0; i < requested_count; ++i) { - VdpOutputSurface surface; - - VdpStatus st; - if ((st = vdp_output_surface_create(priv->vdp, priv->vdp_device, - VDP_RGBA_FORMAT_B8G8R8A8, - tc->fmt.i_visible_width, - tc->fmt.i_visible_height, - &surface)) != VDP_STATUS_OK) + pics[i] = vlc_vdp_output_surface_create(priv->vdp, + VDP_RGBA_FORMAT_B8G8R8A8, + &tc->fmt); + if (pics[i] == NULL) goto error; - vlc_vdp_output_surface_t *picsys = malloc(sizeof (*picsys)); - if (!picsys) { - vdp_output_surface_destroy(priv->vdp, surface); - goto error; - } + vlc_vdp_output_surface_t *picsys = pics[i]->p_sys; - picsys->vdp = vdp_hold_x11(priv->vdp, NULL); - picsys->device = priv->vdp_device; - picsys->surface = surface; *(GLvdpauSurfaceNV *)&picsys->gl_nv_surface = 0; - - picture_resource_t rsc = { .p_sys = picsys, - .pf_destroy = pool_pic_destroy_cb }; - - pics[i] = picture_NewFromResource(&tc->fmt, &rsc); - if (!pics[i]) { - free(picsys); - vdp_output_surface_destroy(priv->vdp, surface); - goto error; - } } picture_pool_t *pool = picture_pool_New(requested_count, pics); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
