diff --git a/subprojects/gst-plugins-bad/sys/nvcodec/gstnvencoder.cpp b/subprojects/gst-plugins-bad/sys/nvcodec/gstnvencoder.cpp
index 67f1b9526d..0d1bbde4f4 100644
--- a/subprojects/gst-plugins-bad/sys/nvcodec/gstnvencoder.cpp
+++ b/subprojects/gst-plugins-bad/sys/nvcodec/gstnvencoder.cpp
@@ -963,7 +963,7 @@ gst_nv_encoder_thread_func (GstNvEncoder * self)
     status = gst_nv_enc_task_lock_bitstream (task, &bitstream);
     if (status != NV_ENC_SUCCESS) {
       gst_nv_enc_task_unref (task);
-      gst_video_encoder_finish_frame (encoder, frame);
+      gst_video_encoder_release_frame (encoder, frame);
       GST_ELEMENT_ERROR (self, STREAM, ENCODE, (NULL),
           ("Failed to lock bitstream, status: %" GST_NVENC_STATUS_FORMAT,
               GST_NVENC_STATUS_ARGS (status)));
@@ -974,6 +974,7 @@ gst_nv_encoder_thread_func (GstNvEncoder * self)
     if (priv->last_flow != GST_FLOW_OK) {
       gst_nv_enc_task_unlock_bitstream (task);
       gst_nv_enc_task_unref (task);
+      gst_video_encoder_release_frame (encoder, frame);
       continue;
     }
 
@@ -2167,14 +2168,14 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
   if (priv->last_flow != GST_FLOW_OK) {
     GST_INFO_OBJECT (self, "Last flow was %s",
         gst_flow_get_name (priv->last_flow));
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
 
     return priv->last_flow;
   }
 
   if (!priv->object && !gst_nv_encoder_init_session (self, in_buf)) {
     GST_ERROR_OBJECT (self, "Encoder object was not configured");
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
 
     return GST_FLOW_NOT_NEGOTIATED;
   }
@@ -2183,7 +2184,7 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
   switch (reconfig) {
     case GST_NV_ENCODER_RECONFIGURE_BITRATE:
       if (!gst_nv_encoder_reconfigure_session (self)) {
-        gst_video_encoder_finish_frame (encoder, frame);
+        gst_video_encoder_release_frame (encoder, frame);
         return GST_FLOW_NOT_NEGOTIATED;
       }
       break;
@@ -2191,7 +2192,7 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
     {
       gst_nv_encoder_drain (self, TRUE);
       if (!gst_nv_encoder_init_session (self, nullptr)) {
-        gst_video_encoder_finish_frame (encoder, frame);
+        gst_video_encoder_release_frame (encoder, frame);
         return GST_FLOW_NOT_NEGOTIATED;
       }
       break;
@@ -2210,14 +2211,14 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
   if (priv->last_flow != GST_FLOW_OK) {
     GST_INFO_OBJECT (self, "Last flow was %s",
         gst_flow_get_name (priv->last_flow));
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
 
     return priv->last_flow;
   }
 
   if (ret != GST_FLOW_OK) {
     GST_DEBUG_OBJECT (self, "AcquireTask returned %s", gst_flow_get_name (ret));
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
     return ret;
   }
 
@@ -2228,7 +2229,7 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
   if (ret != GST_FLOW_OK) {
     GST_ERROR_OBJECT (self, "Failed to upload frame");
     gst_nv_enc_task_unref (task);
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
 
     return ret;
   }
@@ -2243,7 +2244,7 @@ gst_nv_encoder_handle_frame (GstVideoEncoder * encoder,
       gst_nv_encoder_get_pic_struct (self, in_buf), task);
   if (status != NV_ENC_SUCCESS) {
     GST_ERROR_OBJECT (self, "Failed to encode frame");
-    gst_video_encoder_finish_frame (encoder, frame);
+    gst_video_encoder_release_frame (encoder, frame);
 
     return GST_FLOW_ERROR;
   }