nvcudaenc: Don't use default CUDA stream
[platform/upstream/gstreamer.git] / subprojects / gst-plugins-bad / sys / nvcodec / gstnvencoder.cpp
index 3b3e403..a5d4fa4 100644 (file)
@@ -58,6 +58,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_nv_encoder_debug);
 struct _GstNvEncoderPrivate
 {
   GstCudaContext *context;
+  CUstream cuda_stream;
+
 #ifdef GST_CUDA_HAS_D3D
   GstD3D11Device *device;
   GstD3D11Fence *fence;
@@ -243,6 +245,13 @@ gst_nv_encoder_reset (GstNvEncoder * self)
     priv->session = NULL;
   }
 
+  if (priv->context && priv->cuda_stream) {
+    gst_cuda_context_push (priv->context);
+    CuStreamDestroy (priv->cuda_stream);
+    gst_cuda_context_pop (nullptr);
+    priv->cuda_stream = nullptr;
+  }
+
   g_queue_clear (&priv->free_tasks);
   g_queue_clear (&priv->output_tasks);
 
@@ -1259,6 +1268,21 @@ gst_nv_encoder_init_session (GstNvEncoder * self, GstBuffer * in_buf)
     goto error;
   }
 
+  if (priv->selected_device_mode == GST_NV_ENCODER_DEVICE_CUDA &&
+      gst_nvenc_have_set_io_cuda_streams ()) {
+    CUresult cuda_ret = CuStreamCreate (&priv->cuda_stream, CU_STREAM_DEFAULT);
+
+    if (gst_cuda_result (cuda_ret)) {
+      status = NvEncSetIOCudaStreams (priv->session,
+          (NV_ENC_CUSTREAM_PTR) & priv->cuda_stream,
+          (NV_ENC_CUSTREAM_PTR) & priv->cuda_stream);
+      if (status != NV_ENC_SUCCESS) {
+        GST_WARNING_OBJECT (self, "NvEncSetIOCudaStreams failed, status: %"
+            GST_NVENC_STATUS_FORMAT, GST_NVENC_STATUS_ARGS (status));
+      }
+    }
+  }
+
   task_pool_size = gst_nv_encoder_calculate_task_pool_size (self,
       &priv->config);
   g_array_set_size (priv->task_pool, task_pool_size);