diff --git a/modules/codec/avcodec/va.c b/modules/codec/avcodec/va.c index a0c60775f5ad78c23cf2e4a1184c1d3930d0849b..9c540d3cb0c256e5df4de6ab0cad1c76881994ec 100644 --- a/modules/codec/avcodec/va.c +++ b/modules/codec/avcodec/va.c @@ -51,7 +51,7 @@ static vlc_va_conn_t vlc_va_conn = { NULL, 0, 0, 0, 0 }; /* */ -static vlc_va_conn_t *vlc_va_get_conn( void ) +vlc_va_conn_t *vlc_va_get_conn( void ) { return (vlc_va_conn_t *) &vlc_va_conn; } diff --git a/modules/codec/avcodec/va.h b/modules/codec/avcodec/va.h index a33ee7195c4cd9231bdf416d2415c6e4b5d68ca3..35f6553301273f0475fdfd0b2136a7667af61e7d 100644 --- a/modules/codec/avcodec/va.h +++ b/modules/codec/avcodec/va.h @@ -66,5 +66,12 @@ static inline void vlc_va_Delete(vlc_va_t *va) vlc_va_t *vlc_va_NewVaapi(vlc_object_t *obj, int codec_id); vlc_va_t *vlc_va_NewDxva2(vlc_object_t *log, int codec_id); +/* */ +typedef struct vlc_va_conn_t vlc_va_conn_t; +vlc_va_conn_t *vlc_va_get_conn( void ); + +vlc_va_conn_t *vlc_va_Initialize(const char *display_name); +void vlc_va_Terminate(vlc_va_conn_t *conn); + #endif diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c index b74806ce68c79bf1949aa9854cb4417ea83062ab..732701fd657728572a389e2d823da64a64d1ef8b 100644 --- a/modules/codec/avcodec/vaapi.c +++ b/modules/codec/avcodec/vaapi.c @@ -433,6 +433,8 @@ static int DisplayPicture( vlc_va_t *p_external, picture_t *p_picture, AVFrame * if( !p_picture->p_sys->surface ) return VLC_EGENERIC; + assert(p_picture->p_sys->subpicture == NULL); + return VLC_SUCCESS; } diff --git a/modules/codec/avcodec/vaapi.h b/modules/codec/avcodec/vaapi.h index 2f7f512eea2861ad55d2195e3f3d096d1006685c..1c0ea08c11e03a14b8dfbe47546a7138f458348b 100644 --- a/modules/codec/avcodec/vaapi.h +++ b/modules/codec/avcodec/vaapi.h @@ -18,7 +18,6 @@ ****************************************************************************/ #ifdef HAVE_AVCODEC_VAAPI -typedef struct vlc_va_conn_t vlc_va_conn_t; struct vlc_va_conn_t { Display *p_display_x11; @@ -28,9 +27,6 @@ struct vlc_va_conn_t int i_ref_count; /* for internal use only */ }; -vlc_va_conn_t *vlc_va_Initialize(const char *display_name); -void vlc_va_Terminate(vlc_va_conn_t *conn); - typedef struct { VASubpictureID i_id; /* VASubpictureIDs */ diff --git a/modules/codec/avcodec/vaapi_x11.c b/modules/codec/avcodec/vaapi_x11.c index 8cae3f8b53f55587e39453f43dee27160ac25b86..f5983bb2195a3d178cc1880d07407da5ab6a5961 100644 --- a/modules/codec/avcodec/vaapi_x11.c +++ b/modules/codec/avcodec/vaapi_x11.c @@ -693,6 +693,43 @@ static void PictureRelease(picture_t *picture) { if (picture->i_refcount > 0) picture->i_refcount--; + if (picture->p_sys) + { + vlc_va_conn_t *conn = vlc_va_get_conn(); + vlc_va_subpicture_t *subpicture = picture->p_sys->subpicture; + + VAStatus status; + const int i_sub = picture->p_sys->i_sub; + for (int i = 0; i < i_sub; i++) + { + if ((subpicture[i].i_surface != VA_INVALID_SURFACE) && + (subpicture[i].i_id != VA_INVALID_ID)) + { + status = vaDeassociateSubpicture(conn->p_display, + subpicture[i].i_id, &subpicture[i].i_surface, 1); + assert(status == VA_STATUS_SUCCESS); + } + + if (subpicture[i].i_id != VA_INVALID_ID) + { + status = vaDestroySubpicture(conn->p_display, subpicture[i].i_id); + assert(status == VA_STATUS_SUCCESS); + } + + if (subpicture[i].image.image_id != VA_INVALID_ID) + { + status = vaDestroyImage(conn->p_display, + subpicture[i].image.image_id); + assert(status == VA_STATUS_SUCCESS); + } + } + free(picture->p_sys->subpicture); + + /* */ + picture->p_sys->i_sub = 0; + picture->p_sys->surface = NULL; + picture->p_sys->subpicture = NULL; + } free(picture->p_sys); picture->p_sys = NULL; }