diff options
Diffstat (limited to 'tests/examples/overlay/qt-xoverlay.cpp')
-rw-r--r-- | tests/examples/overlay/qt-xoverlay.cpp | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/tests/examples/overlay/qt-xoverlay.cpp b/tests/examples/overlay/qt-xoverlay.cpp index a1ba7c37..7edfabb7 100644 --- a/tests/examples/overlay/qt-xoverlay.cpp +++ b/tests/examples/overlay/qt-xoverlay.cpp @@ -31,6 +31,53 @@ #include <QTimer> #include <QWidget> +/* slightly convoluted way to find a working video sink that's not a bin, + * one could use autovideosink from gst-plugins-good instead + */ +static GstElement * +find_video_sink (void) +{ + GstStateChangeReturn sret; + GstElement *sink; + + if ((sink = gst_element_factory_make ("xvimagesink", NULL))) { + sret = gst_element_set_state (sink, GST_STATE_READY); + if (sret == GST_STATE_CHANGE_SUCCESS) + return sink; + + gst_element_set_state (sink, GST_STATE_NULL); + } + gst_object_unref (sink); + + if ((sink = gst_element_factory_make ("ximagesink", NULL))) { + sret = gst_element_set_state (sink, GST_STATE_READY); + if (sret == GST_STATE_CHANGE_SUCCESS) + return sink; + + gst_element_set_state (sink, GST_STATE_NULL); + } + gst_object_unref (sink); + + if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") == 0 || + strcmp (DEFAULT_VIDEOSINK, "ximagesink") == 0) + return NULL; + + if ((sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL))) { + if (GST_IS_BIN (sink)) { + gst_object_unref (sink); + return NULL; + } + + sret = gst_element_set_state (sink, GST_STATE_READY); + if (sret == GST_STATE_CHANGE_SUCCESS) + return sink; + + gst_element_set_state (sink, GST_STATE_NULL); + } + gst_object_unref (sink); + return NULL; +} + int main(int argc, char *argv[]) { if (!g_thread_supported ()) @@ -44,7 +91,11 @@ int main(int argc, char *argv[]) GstElement *pipeline = gst_pipeline_new ("xvoverlay"); GstElement *src = gst_element_factory_make ("videotestsrc", NULL); - GstElement *sink = gst_element_factory_make ("xvimagesink", NULL); + GstElement *sink = find_video_sink (); + + if (sink == NULL) + g_error ("Couldn't find a working video sink."); + gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); gst_element_link (src, sink); @@ -52,6 +103,7 @@ int main(int argc, char *argv[]) QWidget window; window.resize(320, 240); + window.setWindowTitle("GstXOverlay Qt demo"); window.show(); WId xwinid = window.winId(); |