• Hardware Platform (Jetson AGX Orin Developer Kit)
• DeepStream Version - 6.2.0
• JetPack Version - 5.1.1-b56
• TensorRT Version - 8.5
• NVIDIA GPU Driver Version (valid for GPU only) - don’t know how to find this
• Issue Type( New requirement)
• How to reproduce the issue ? (./deepstream-test1-app dstest1_config.yml 2>err.txt)
• Requirement details( Direct video to a GTK window)
• Camera - Attached HD Pro Webcam C920
• Monitor - Attached MSI
Makefile changes:
CUDA_VER=11.4
PKGS:= gstreamer-1.0 gstreamer-video-1.0 gtk±3.0 glib-2.0
Code compiles without issue.
I modified deepstream-test1-app.c with:
//GTK - NEW
include <gst/video/videooverlay.h>
include <gtk/gtkx.h>
// GTK - NEW
GdkWindow *video_window_xwindow;
GtkWidget *window, *video_window;
gulong embed_xid;
// Standard GTK initialization - GTK New
gtk_init(&argc, &argv);
// GTK - NEW
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), “delete-event”, G_CALLBACK (gtk_window_close), (gpointer) pipeline);
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_window_set_title (GTK_WINDOW (window), “GstVideoOverlay Gtk+ demo”);
video_window = gtk_drawing_area_new();
gtk_container_add (GTK_CONTAINER (window), video_window);
gtk_container_set_border_width (GTK_CONTAINER (window), 2);
gtk_widget_show_all (window);
video_window_xwindow = gtk_widget_get_window (video_window);
embed_xid = GDK_WINDOW_XID (video_window_xwindow);
// When the next line is commented out the new window displays and is black.
// gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
// When the next line is included I get a Segmentation fault (core dump)
gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
debug:
$ export GST_DEBUG=“nv3dsink:9”
$ ./deepstream-test1-app dstest1_config.yml 2>err.txt
Added elements to bin
Segmentation fault (core dumped)
root@development-orin:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1# cat err.txt
0:00:00.200805696 4460 0xaaaaccd78cf0 TRACE nv3dsink gstnv3dsink.c:565:gst_nv3dsink_init:GstNv3dSink@0xaaaacd9cb580 init
0:00:00.203958602 4460 0xaaaaccd78cf0 DEBUG nv3dsink gstnv3dsink.c:340:gst_nv3dsink_get_caps: returning caps: video/x-raw, format=(string){ RGBA, BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, AYUV, Y444, I420, YV12, NV12, NV21, Y42B, Y41B, RGB, BGR, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:NVMM), format=(string){ RGBA, BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, AYUV, Y444, I420, YV12, NV12, NV21, Y42B, Y41B, RGB, BGR, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
0:00:00.204055340 4460 0xaaaaccd78cf0 DEBUG nv3dsink gstnv3dsink.c:340:gst_nv3dsink_get_caps: returning caps: video/x-raw, format=(string){ RGBA, BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, AYUV, Y444, I420, YV12, NV12, NV21, Y42B, Y41B, RGB, BGR, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:NVMM), format=(string){ RGBA, BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, AYUV, Y444, I420, YV12, NV12, NV21, Y42B, Y41B, RGB, BGR, RGB16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
0:00:00.206477484 4460 0xaaaaccd78cf0 DEBUG nv3dsink gstnv3dsink.c:96:gst_nv3dsink_set_window_handle: set_window_handle 50331655
$
Is there a way to stop the output to the Standard window and send to a new GTK window?
I have been able to do this with similar coding:
int main (int argc, char **argv)
{
GdkWindow *video_window_xwindow;
GtkWidget *window, *video_window;
gulong embed_xid;
GstStateChangeReturn sret;
gst_init (&argc, &argv);
gtk_init (&argc, &argv);
GstElement *pipeline,*videosrc,*filter,*vidconv,*transform,*sink;
pipeline = gst_pipeline_new (“xvoverlay”);
videosrc = gst_element_factory_make (“v4l2src”, NULL); g_assert(videosrc);
filter = gst_element_factory_make (“capsfilter”,NULL); g_assert(filter);
//Set CAPS
g_object_set (G_OBJECT (videosrc), “device”, “/dev/video0”, NULL);
GstCaps * vidxcaps = gst_caps_from_string(“video/x-raw,format=YUY2,width=640,height=480,framerate=30/1”);
g_object_set (filter, “caps”, vidxcaps, NULL);
/* Create remaining elements */
vidconv = gst_element_factory_make (“nvvidconv”, NULL); g_assert(vidconv);
transform = gst_element_factory_make (“nvegltransform”, NULL); g_assert(transform);
sink = gst_element_factory_make (“nveglglessink”, NULL); g_assert(sink);
//ADD
gst_bin_add_many (GST_BIN (pipeline), videosrc, filter, vidconv, transform, sink, NULL);
//LINK
g_assert(gst_element_link (videosrc, filter));
g_assert(gst_element_link (filter, vidconv)); // <<<<<< Filter placed between
g_assert(gst_element_link (vidconv, transform));
g_assert(gst_element_link (transform, sink));
/* prepare the ui */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), “delete-event”, G_CALLBACK (gtk_window_close), (gpointer) pipeline);
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_window_set_title (GTK_WINDOW (window), “GstVideoOverlay Gtk+ demo”);
video_window = gtk_drawing_area_new ();
gtk_container_add (GTK_CONTAINER (window), video_window);
gtk_container_set_border_width (GTK_CONTAINER (window), 2);
gtk_widget_show_all (window);
video_window_xwindow = gtk_widget_get_window (video_window);
embed_xid = GDK_WINDOW_XID (video_window_xwindow);
gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), embed_xid);
/* run the pipeline */
sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
if (sret == GST_STATE_CHANGE_FAILURE)
gst_element_set_state (pipeline, GST_STATE_NULL);
else
gtk_main ();
gst_object_unref (pipeline);
return 0;
}