diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index 5180eb87711d52458a6b1776a81ccb9fb0466c79..250b4e61e36fef7275bda521b20ecab4899e3f1f 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -593,6 +593,11 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
                                       "Error setting a HW handle");
     }
 
+    err = MFXJoinSession(parent_session, session);
+    if (err != MFX_ERR_NONE)
+        return ff_qsv_print_error(avctx, err,
+                                  "Error joining session");
+
     ret = qsv_load_plugins(session, load_plugins, avctx);
     if (ret < 0) {
         av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n");
diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
index 37805f2323af14f91101c08cf461b0dc18a7afb7..f32b46dcc0875614d03c05b029cc3487aa2ae319 100644
--- a/libavfilter/qsvvpp.c
+++ b/libavfilter/qsvvpp.c
@@ -515,6 +515,9 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
         if (ret != MFX_ERR_NONE)
             return AVERROR_UNKNOWN;
     }
+    ret = MFXJoinSession(device_hwctx->session, s->session);
+    if (ret != MFX_ERR_NONE)
+        return AVERROR_UNKNOWN;
 
     if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) {
         s->opaque_alloc.In.Surfaces   = s->surface_ptrs_in;