cudaconverter: Don't sync per conversion

Caller should take care of synchronization

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3629>
This commit is contained in:
Seungha Yang 2022-12-20 01:23:42 +09:00 committed by GStreamer Marge Bot
parent 8d14194fdd
commit 1cb47d549b
3 changed files with 19 additions and 7 deletions

View file

@ -2069,12 +2069,15 @@ ensure_fallback_buffer (GstCudaConverter * self, gint width_in_bytes,
static CUtexObject static CUtexObject
gst_cuda_converter_create_texture (GstCudaConverter * self, gst_cuda_converter_create_texture (GstCudaConverter * self,
CUdeviceptr src, gint width, gint height, gint stride, CUfilter_mode mode, CUdeviceptr src, gint width, gint height, gint stride, CUfilter_mode mode,
CUarray_format format, guint channles, gint plane, CUstream stream) CUarray_format format, guint channles, gint plane, CUstream stream,
gboolean * need_sync)
{ {
GstCudaConverterPrivate *priv = self->priv; GstCudaConverterPrivate *priv = self->priv;
CUresult ret; CUresult ret;
CUdeviceptr src_ptr; CUdeviceptr src_ptr;
*need_sync = FALSE;
src_ptr = src; src_ptr = src;
if (priv->texture_align > 0 && (src_ptr % priv->texture_align) != 0) { if (priv->texture_align > 0 && (src_ptr % priv->texture_align) != 0) {
@ -2096,12 +2099,14 @@ gst_cuda_converter_create_texture (GstCudaConverter * self,
* GST_VIDEO_INFO_COMP_PSTRIDE (&priv->in_info, plane), * GST_VIDEO_INFO_COMP_PSTRIDE (&priv->in_info, plane),
params.Height = GST_VIDEO_INFO_COMP_HEIGHT (&priv->in_info, plane); params.Height = GST_VIDEO_INFO_COMP_HEIGHT (&priv->in_info, plane);
ret = CuMemcpy2D (&params); ret = CuMemcpy2DAsync (&params, stream);
if (!gst_cuda_result (ret)) { if (!gst_cuda_result (ret)) {
GST_ERROR_OBJECT (self, "Couldn't copy to fallback buffer"); GST_ERROR_OBJECT (self, "Couldn't copy to fallback buffer");
return 0; return 0;
} }
*need_sync = TRUE;
src_ptr = priv->fallback_buffer[plane].ptr; src_ptr = priv->fallback_buffer[plane].ptr;
stride = priv->fallback_buffer[plane].stride; stride = priv->fallback_buffer[plane].stride;
} }
@ -2145,7 +2150,8 @@ gst_cuda_converter_unpack_rgb (GstCudaConverter * self,
gboolean gboolean
gst_cuda_converter_convert_frame (GstCudaConverter * converter, gst_cuda_converter_convert_frame (GstCudaConverter * converter,
GstVideoFrame * src_frame, GstVideoFrame * dst_frame, CUstream stream) GstVideoFrame * src_frame, GstVideoFrame * dst_frame, CUstream stream,
gboolean * synchronized)
{ {
GstCudaConverterPrivate *priv; GstCudaConverterPrivate *priv;
const TextureFormat *format; const TextureFormat *format;
@ -2159,6 +2165,7 @@ gst_cuda_converter_convert_frame (GstCudaConverter * converter,
gpointer args[] = { &texture[0], &texture[1], &texture[2], &texture[3], gpointer args[] = { &texture[0], &texture[1], &texture[2], &texture[3],
&dst[0], &dst[1], &dst[2], &dst[3], &stride[0], &stride[1] &dst[0], &dst[1], &dst[2], &dst[3], &stride[0], &stride[1]
}; };
gboolean need_sync = FALSE;
g_return_val_if_fail (GST_IS_CUDA_CONVERTER (converter), FALSE); g_return_val_if_fail (GST_IS_CUDA_CONVERTER (converter), FALSE);
g_return_val_if_fail (src_frame != NULL, FALSE); g_return_val_if_fail (src_frame != NULL, FALSE);
@ -2196,7 +2203,7 @@ gst_cuda_converter_convert_frame (GstCudaConverter * converter,
GST_VIDEO_FRAME_COMP_HEIGHT (src_frame, i), GST_VIDEO_FRAME_COMP_HEIGHT (src_frame, i),
GST_VIDEO_FRAME_PLANE_STRIDE (src_frame, i), GST_VIDEO_FRAME_PLANE_STRIDE (src_frame, i),
priv->filter_mode[i], format->array_format[i], format->channels[i], i, priv->filter_mode[i], format->array_format[i], format->channels[i], i,
stream); stream, &need_sync);
if (!texture[i]) { if (!texture[i]) {
GST_ERROR_OBJECT (converter, "Couldn't create texture %d", i); GST_ERROR_OBJECT (converter, "Couldn't create texture %d", i);
goto out; goto out;
@ -2223,8 +2230,12 @@ gst_cuda_converter_convert_frame (GstCudaConverter * converter,
goto out; goto out;
} }
if (need_sync)
CuStreamSynchronize (stream); CuStreamSynchronize (stream);
if (synchronized)
*synchronized = need_sync;
ret = TRUE; ret = TRUE;
out: out:

View file

@ -93,7 +93,8 @@ GstCudaConverter * gst_cuda_converter_new (const GstVideoInfo * in_info,
gboolean gst_cuda_converter_convert_frame (GstCudaConverter * converter, gboolean gst_cuda_converter_convert_frame (GstCudaConverter * converter,
GstVideoFrame * src_frame, GstVideoFrame * src_frame,
GstVideoFrame * dst_frame, GstVideoFrame * dst_frame,
CUstream cuda_stream); CUstream cuda_stream,
gboolean * synchronized);
G_END_DECLS G_END_DECLS

View file

@ -1380,7 +1380,7 @@ gst_cuda_base_convert_transform (GstBaseTransform * trans,
} }
if (!gst_cuda_converter_convert_frame (self->converter, &in_frame, &out_frame, if (!gst_cuda_converter_convert_frame (self->converter, &in_frame, &out_frame,
gst_cuda_stream_get_handle (btrans->stream))) { gst_cuda_stream_get_handle (btrans->stream), NULL)) {
GST_ERROR_OBJECT (self, "Failed to convert frame"); GST_ERROR_OBJECT (self, "Failed to convert frame");
ret = GST_FLOW_ERROR; ret = GST_FLOW_ERROR;
} }