summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2010-02-22 13:01:19 +0200
committerStefan Kost <ensonic@users.sf.net>2010-02-22 14:02:24 +0200
commit1b41c2696ddf204e5e05268ab54f01328514de97 (patch)
tree35d20a18a697f791739d1bdc88959be0e7f43791
parent236b707cd21865332be594d84ca1f64e19ef715b (diff)
examples: also add sink detection and set title to qt examples
Also set a title in the qt examples like it is now done in the gtk example. Fix the newly added find_video_sink in the gtk example and add similar function to the qt examples.
-rw-r--r--tests/examples/overlay/gtk-xoverlay.c45
-rw-r--r--tests/examples/overlay/qt-xoverlay.cpp54
-rw-r--r--tests/examples/overlay/qtgv-xoverlay.cpp42
3 files changed, 119 insertions, 22 deletions
diff --git a/tests/examples/overlay/gtk-xoverlay.c b/tests/examples/overlay/gtk-xoverlay.c
index 2bde191b..9a08c95f 100644
--- a/tests/examples/overlay/gtk-xoverlay.c
+++ b/tests/examples/overlay/gtk-xoverlay.c
@@ -42,44 +42,49 @@ window_closed (GtkWidget * widget, GdkEvent * event, gpointer user_data)
gtk_main_quit ();
}
-/* slightly convoluted way to find a working video sink that's not a bin */
+/* 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;
- sink = gst_element_factory_make ("xvimagesink", NULL);
- sret = gst_element_set_state (sink, GST_STATE_READY);
- if (sret == GST_STATE_CHANGE_SUCCESS)
- return 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_element_set_state (sink, GST_STATE_NULL);
+ }
gst_object_unref (sink);
- sink = gst_element_factory_make ("ximagesink", NULL);
- sret = gst_element_set_state (sink, GST_STATE_READY);
- if (sret == GST_STATE_CHANGE_SUCCESS)
- return 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_element_set_state (sink, GST_STATE_NULL);
+ }
gst_object_unref (sink);
if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") == 0 ||
strcmp (DEFAULT_VIDEOSINK, "ximagesink") == 0)
return NULL;
- sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL);
- if (GST_IS_BIN (sink)) {
- gst_object_unref (sink);
- 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;
+ 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_element_set_state (sink, GST_STATE_NULL);
+ }
gst_object_unref (sink);
return NULL;
}
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();
diff --git a/tests/examples/overlay/qtgv-xoverlay.cpp b/tests/examples/overlay/qtgv-xoverlay.cpp
index 74159c4b..69252864 100644
--- a/tests/examples/overlay/qtgv-xoverlay.cpp
+++ b/tests/examples/overlay/qtgv-xoverlay.cpp
@@ -32,9 +32,48 @@
SinkPipeline::SinkPipeline(QGraphicsView *parent) : QObject(parent)
{
+ GstStateChangeReturn sret;
+
pipeline = gst_pipeline_new ("xvoverlay");
src = gst_element_factory_make ("videotestsrc", NULL);
- sink = gst_element_factory_make ("xvimagesink", NULL);
+
+ if ((sink = gst_element_factory_make ("xvimagesink", NULL))) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ 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) {
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+
+ if (strcmp (DEFAULT_VIDEOSINK, "xvimagesink") != 0 &&
+ strcmp (DEFAULT_VIDEOSINK, "ximagesink") != 0) {
+
+ if ((sink = gst_element_factory_make (DEFAULT_VIDEOSINK, NULL))) {
+ if (!GST_IS_BIN (sink)) {
+ sret = gst_element_set_state (sink, GST_STATE_READY);
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+ sink = NULL;
+ }
+ } else {
+ gst_object_unref (sink);
+ sink = NULL;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ 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);
xwinid = parent->winId();
@@ -74,6 +113,7 @@ int main( int argc, char **argv )
QGraphicsView view( &scene );
view.resize(320, 240);
+ view.setWindowTitle("GstXOverlay Qt GraphicsView demo");
view.show();
gst_init (&argc, &argv);