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;
 }