From 05bfd277a8058648660db47f102a313565f1089d Mon Sep 17 00:00:00 2001 From: Matthew Waters Date: Tue, 29 Apr 2014 16:38:55 +1000 Subject: [PATCH] gl/examples: move to -bad - fix all the compiler errors - give them their own gl directory --- tests/examples/gl/Makefile.am | 26 ++ tests/examples/gl/clutter/.gitignore | 3 + tests/examples/gl/clutter/Makefile.am | 45 +++ tests/examples/gl/clutter/clutteractor.c | 178 ++++++++++ tests/examples/gl/clutter/clutteractortee.c | 231 +++++++++++++ tests/examples/gl/clutter/cluttershare.c | 383 +++++++++++++++++++++ tests/examples/gl/clutter/cluttershare.cbp | 76 ++++ tests/examples/gl/cocoa/Makefile.am | 4 + tests/examples/gl/cocoa/README | 9 + tests/examples/gl/cocoa/videooverlay/.gitignore | 1 + tests/examples/gl/cocoa/videooverlay/Makefile.am | 14 + tests/examples/gl/cocoa/videooverlay/main.m | 240 +++++++++++++ tests/examples/gl/generic/Makefile.am | 2 + tests/examples/gl/generic/README | 21 ++ tests/examples/gl/generic/cube/.gitignore | 1 + tests/examples/gl/generic/cube/Makefile.am | 8 + tests/examples/gl/generic/cube/cube.vcproj | 202 +++++++++++ tests/examples/gl/generic/cube/main.cpp | 248 +++++++++++++ tests/examples/gl/generic/cubeyuv/.gitignore | 1 + tests/examples/gl/generic/cubeyuv/Makefile.am | 8 + tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj | 202 +++++++++++ tests/examples/gl/generic/cubeyuv/main.cpp | 325 +++++++++++++++++ tests/examples/gl/generic/doublecube/.gitignore | 1 + tests/examples/gl/generic/doublecube/Makefile.am | 8 + .../gl/generic/doublecube/doublecube.vcproj | 202 +++++++++++ tests/examples/gl/generic/doublecube/main.cpp | 368 ++++++++++++++++++++ tests/examples/gl/generic/generic.sln | 38 ++ tests/examples/gl/generic/recordgraphic/.gitignore | 1 + .../examples/gl/generic/recordgraphic/Makefile.am | 8 + tests/examples/gl/generic/recordgraphic/main.cpp | 278 +++++++++++++++ .../gl/generic/recordgraphic/recordgraphic.vcproj | 202 +++++++++++ tests/examples/gl/gtk/Makefile.am | 12 + tests/examples/gl/gtk/README | 27 ++ .../gl/gtk/filternovideooverlay/.gitignore | 1 + .../gl/gtk/filternovideooverlay/Makefile.am | 18 + .../filternovideooverlay.vcproj | 202 +++++++++++ .../examples/gl/gtk/filternovideooverlay/main.cpp | 180 ++++++++++ .../examples/gl/gtk/filtervideooverlay/.gitignore | 1 + .../examples/gl/gtk/filtervideooverlay/Makefile.am | 10 + .../filtervideooverlay/filtervideooverlay.vcproj | 210 +++++++++++ tests/examples/gl/gtk/filtervideooverlay/main.cpp | 245 +++++++++++++ tests/examples/gl/gtk/fxtest/.gitignore | 2 + tests/examples/gl/gtk/fxtest/Makefile.am | 18 + tests/examples/gl/gtk/fxtest/fxtest.c | 262 ++++++++++++++ tests/examples/gl/gtk/fxtest/fxtest.vcproj | 210 +++++++++++ tests/examples/gl/gtk/fxtest/pixbufdrop.c | 325 +++++++++++++++++ tests/examples/gl/gtk/gstgtk.c | 71 ++++ tests/examples/gl/gtk/gstgtk.h | 34 ++ tests/examples/gl/gtk/gtk.sln | 50 +++ tests/examples/gl/gtk/gtkvideooverlay/.gitignore | 1 + tests/examples/gl/gtk/gtkvideooverlay/Makefile.am | 10 + .../gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj | 210 +++++++++++ tests/examples/gl/gtk/gtkvideooverlay/main.cpp | 230 +++++++++++++ tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj | 210 +++++++++++ .../examples/gl/gtk/switchvideooverlay/.gitignore | 1 + .../examples/gl/gtk/switchvideooverlay/Makefile.am | 10 + tests/examples/gl/gtk/switchvideooverlay/main.cpp | 246 +++++++++++++ .../switchvideooverlay/switchvideooverlay.vcproj | 210 +++++++++++ tests/examples/gl/qt/Makefile.am | 2 + tests/examples/gl/qt/README | 23 ++ .../examples/gl/qt/mousevideooverlay/gstthread.cpp | 67 ++++ tests/examples/gl/qt/mousevideooverlay/gstthread.h | 56 +++ tests/examples/gl/qt/mousevideooverlay/main.cpp | 39 +++ .../gl/qt/mousevideooverlay/mousevideooverlay.pri | 10 + .../gl/qt/mousevideooverlay/mousevideooverlay.pro | 54 +++ .../gl/qt/mousevideooverlay/mousevideooverlay.sln | 26 ++ .../qt/mousevideooverlay/mousevideooverlay.vcproj | 321 +++++++++++++++++ .../examples/gl/qt/mousevideooverlay/pipeline.cpp | 334 ++++++++++++++++++ tests/examples/gl/qt/mousevideooverlay/pipeline.h | 72 ++++ .../examples/gl/qt/mousevideooverlay/qrenderer.cpp | 58 ++++ tests/examples/gl/qt/mousevideooverlay/qrenderer.h | 48 +++ .../gl/qt/qglwidgetvideooverlay/gstthread.cpp | 62 ++++ .../gl/qt/qglwidgetvideooverlay/gstthread.h | 55 +++ .../examples/gl/qt/qglwidgetvideooverlay/main.cpp | 39 +++ .../gl/qt/qglwidgetvideooverlay/pipeline.cpp | 332 ++++++++++++++++++ .../gl/qt/qglwidgetvideooverlay/pipeline.h | 70 ++++ .../gl/qt/qglwidgetvideooverlay/qglrenderer.cpp | 52 +++ .../gl/qt/qglwidgetvideooverlay/qglrenderer.h | 45 +++ .../qglwidgetvideooverlay.pri | 10 + .../qglwidgetvideooverlay.pro | 55 +++ .../qglwidgetvideooverlay.sln | 26 ++ .../qglwidgetvideooverlay.vcproj | 320 +++++++++++++++++ tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h | 77 +++++ tests/examples/gl/qt/qglwtextureshare/README | 29 ++ .../examples/gl/qt/qglwtextureshare/cocoa_utils.mm | 26 ++ .../examples/gl/qt/qglwtextureshare/glcontextid.h | 65 ++++ .../examples/gl/qt/qglwtextureshare/gstthread.cpp | 66 ++++ tests/examples/gl/qt/qglwtextureshare/gstthread.h | 59 ++++ tests/examples/gl/qt/qglwtextureshare/main.cpp | 36 ++ .../gl/qt/qglwtextureshare/moc_gstthread.cpp | 109 ++++++ .../gl/qt/qglwtextureshare/moc_pipeline.cpp | 140 ++++++++ .../gl/qt/qglwtextureshare/moc_qglrenderer.cpp | 132 +++++++ tests/examples/gl/qt/qglwtextureshare/pipeline.cpp | 222 ++++++++++++ tests/examples/gl/qt/qglwtextureshare/pipeline.h | 70 ++++ .../gl/qt/qglwtextureshare/qglrenderer.cpp | 231 +++++++++++++ .../examples/gl/qt/qglwtextureshare/qglrenderer.h | 60 ++++ .../gl/qt/qglwtextureshare/qglwtextureshare | Bin 0 -> 989341 bytes .../gl/qt/qglwtextureshare/qglwtextureshare.pro | 83 +++++ .../examples/gl/qt/videooverlay/Debug/videooverlay | Bin 0 -> 165466 bytes .../GeneratedFiles/debug/moc_gstthread.cpp | 143 ++++++++ .../GeneratedFiles/debug/moc_pipeline.cpp | 143 ++++++++ .../GeneratedFiles/debug/moc_qrenderer.cpp | 150 ++++++++ tests/examples/gl/qt/videooverlay/videooverlay.cpp | 80 +++++ tests/examples/gl/qt/videooverlay/videooverlay.pri | 4 + tests/examples/gl/qt/videooverlay/videooverlay.sln | 26 ++ .../gl/qt/videooverlay/videooverlay.vcproj | 320 +++++++++++++++++ .../gl/qt/videooverlay/videovideooverlay.pro | 53 +++ tests/examples/gl/sdl/.gitignore | 1 + tests/examples/gl/sdl/Makefile.am | 15 + tests/examples/gl/sdl/sdl.sln | 20 ++ tests/examples/gl/sdl/sdlshare.c | 380 ++++++++++++++++++++ tests/examples/gl/sdl/sdlshare.vcproj | 199 +++++++++++ 112 files changed, 11455 insertions(+) create mode 100644 tests/examples/gl/Makefile.am create mode 100644 tests/examples/gl/clutter/.gitignore create mode 100644 tests/examples/gl/clutter/Makefile.am create mode 100644 tests/examples/gl/clutter/clutteractor.c create mode 100644 tests/examples/gl/clutter/clutteractortee.c create mode 100644 tests/examples/gl/clutter/cluttershare.c create mode 100644 tests/examples/gl/clutter/cluttershare.cbp create mode 100755 tests/examples/gl/cocoa/Makefile.am create mode 100644 tests/examples/gl/cocoa/README create mode 100644 tests/examples/gl/cocoa/videooverlay/.gitignore create mode 100755 tests/examples/gl/cocoa/videooverlay/Makefile.am create mode 100755 tests/examples/gl/cocoa/videooverlay/main.m create mode 100644 tests/examples/gl/generic/Makefile.am create mode 100644 tests/examples/gl/generic/README create mode 100644 tests/examples/gl/generic/cube/.gitignore create mode 100644 tests/examples/gl/generic/cube/Makefile.am create mode 100644 tests/examples/gl/generic/cube/cube.vcproj create mode 100644 tests/examples/gl/generic/cube/main.cpp create mode 100644 tests/examples/gl/generic/cubeyuv/.gitignore create mode 100644 tests/examples/gl/generic/cubeyuv/Makefile.am create mode 100644 tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj create mode 100644 tests/examples/gl/generic/cubeyuv/main.cpp create mode 100644 tests/examples/gl/generic/doublecube/.gitignore create mode 100644 tests/examples/gl/generic/doublecube/Makefile.am create mode 100644 tests/examples/gl/generic/doublecube/doublecube.vcproj create mode 100644 tests/examples/gl/generic/doublecube/main.cpp create mode 100644 tests/examples/gl/generic/generic.sln create mode 100644 tests/examples/gl/generic/recordgraphic/.gitignore create mode 100644 tests/examples/gl/generic/recordgraphic/Makefile.am create mode 100644 tests/examples/gl/generic/recordgraphic/main.cpp create mode 100644 tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj create mode 100644 tests/examples/gl/gtk/Makefile.am create mode 100644 tests/examples/gl/gtk/README create mode 100644 tests/examples/gl/gtk/filternovideooverlay/.gitignore create mode 100644 tests/examples/gl/gtk/filternovideooverlay/Makefile.am create mode 100644 tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj create mode 100644 tests/examples/gl/gtk/filternovideooverlay/main.cpp create mode 100644 tests/examples/gl/gtk/filtervideooverlay/.gitignore create mode 100644 tests/examples/gl/gtk/filtervideooverlay/Makefile.am create mode 100644 tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj create mode 100644 tests/examples/gl/gtk/filtervideooverlay/main.cpp create mode 100644 tests/examples/gl/gtk/fxtest/.gitignore create mode 100644 tests/examples/gl/gtk/fxtest/Makefile.am create mode 100644 tests/examples/gl/gtk/fxtest/fxtest.c create mode 100644 tests/examples/gl/gtk/fxtest/fxtest.vcproj create mode 100644 tests/examples/gl/gtk/fxtest/pixbufdrop.c create mode 100644 tests/examples/gl/gtk/gstgtk.c create mode 100644 tests/examples/gl/gtk/gstgtk.h create mode 100644 tests/examples/gl/gtk/gtk.sln create mode 100644 tests/examples/gl/gtk/gtkvideooverlay/.gitignore create mode 100644 tests/examples/gl/gtk/gtkvideooverlay/Makefile.am create mode 100644 tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj create mode 100644 tests/examples/gl/gtk/gtkvideooverlay/main.cpp create mode 100644 tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj create mode 100644 tests/examples/gl/gtk/switchvideooverlay/.gitignore create mode 100644 tests/examples/gl/gtk/switchvideooverlay/Makefile.am create mode 100644 tests/examples/gl/gtk/switchvideooverlay/main.cpp create mode 100644 tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj create mode 100644 tests/examples/gl/qt/Makefile.am create mode 100644 tests/examples/gl/qt/README create mode 100644 tests/examples/gl/qt/mousevideooverlay/gstthread.cpp create mode 100644 tests/examples/gl/qt/mousevideooverlay/gstthread.h create mode 100644 tests/examples/gl/qt/mousevideooverlay/main.cpp create mode 100644 tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri create mode 100644 tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro create mode 100644 tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln create mode 100644 tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj create mode 100644 tests/examples/gl/qt/mousevideooverlay/pipeline.cpp create mode 100644 tests/examples/gl/qt/mousevideooverlay/pipeline.h create mode 100644 tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp create mode 100644 tests/examples/gl/qt/mousevideooverlay/qrenderer.h create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln create mode 100644 tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj create mode 100644 tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h create mode 100644 tests/examples/gl/qt/qglwtextureshare/README create mode 100644 tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm create mode 100644 tests/examples/gl/qt/qglwtextureshare/glcontextid.h create mode 100644 tests/examples/gl/qt/qglwtextureshare/gstthread.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/gstthread.h create mode 100644 tests/examples/gl/qt/qglwtextureshare/main.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/pipeline.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/pipeline.h create mode 100644 tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp create mode 100644 tests/examples/gl/qt/qglwtextureshare/qglrenderer.h create mode 100755 tests/examples/gl/qt/qglwtextureshare/qglwtextureshare create mode 100644 tests/examples/gl/qt/qglwtextureshare/qglwtextureshare.pro create mode 100755 tests/examples/gl/qt/videooverlay/Debug/videooverlay create mode 100644 tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp create mode 100644 tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp create mode 100644 tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp create mode 100644 tests/examples/gl/qt/videooverlay/videooverlay.cpp create mode 100644 tests/examples/gl/qt/videooverlay/videooverlay.pri create mode 100644 tests/examples/gl/qt/videooverlay/videooverlay.sln create mode 100644 tests/examples/gl/qt/videooverlay/videooverlay.vcproj create mode 100644 tests/examples/gl/qt/videooverlay/videovideooverlay.pro create mode 100644 tests/examples/gl/sdl/.gitignore create mode 100644 tests/examples/gl/sdl/Makefile.am create mode 100644 tests/examples/gl/sdl/sdl.sln create mode 100644 tests/examples/gl/sdl/sdlshare.c create mode 100644 tests/examples/gl/sdl/sdlshare.vcproj diff --git a/tests/examples/gl/Makefile.am b/tests/examples/gl/Makefile.am new file mode 100644 index 0000000..8d7d9f7 --- /dev/null +++ b/tests/examples/gl/Makefile.am @@ -0,0 +1,26 @@ + +SUBDIRS = + +if USE_OPENGL + +if HAVE_WINDOW_COCOA +SUBDIRS += cocoa +else + +SUBDIRS += generic qt + +#if HAVE_CLUTTER +#SUBDIRS += clutter +#endif + +if HAVE_SDL +SUBDIRS += sdl +endif + +if HAVE_GTK3 +SUBDIRS += gtk +endif + +endif + +endif diff --git a/tests/examples/gl/clutter/.gitignore b/tests/examples/gl/clutter/.gitignore new file mode 100644 index 0000000..9b1eb53 --- /dev/null +++ b/tests/examples/gl/clutter/.gitignore @@ -0,0 +1,3 @@ +clutteractor +clutteractortee +cluttershare diff --git a/tests/examples/gl/clutter/Makefile.am b/tests/examples/gl/clutter/Makefile.am new file mode 100644 index 0000000..0383a6a --- /dev/null +++ b/tests/examples/gl/clutter/Makefile.am @@ -0,0 +1,45 @@ +noinst_PROGRAMS = ## + +#works on win32 and X +if HAVE_CLUTTER + +noinst_PROGRAMS += cluttershare + +cluttershare_SOURCES = cluttershare.c + +cluttershare_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CFLAGS) $(GL_CFLAGS) $(CLUTTER_CFLAGS) +cluttershare_LDADD=$(CLUTTER_LIBS) $(GST_PLUGINS_BASE_LIBS) \ + $(GST_LIBS) $(GL_LIBS) \ + -lgstvideo-$(GST_API_VERSION) $(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la + +endif + + +if HAVE_CLUTTER_GLX +if HAVE_CLUTTER_X11 +if HAVE_XCOMPOSITE + +noinst_PROGRAMS += clutteractor clutteractortee + +clutteractor_SOURCES = clutteractor.c + +clutteractor_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) $(CLUTTER_CFLAGS) \ + $(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS) +clutteractor_LDADD=$(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \ + $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION) + +clutteractortee_SOURCES = clutteractortee.c + +clutteractortee_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) $(CLUTTER_CFLAGS) \ + $(CLUTTER_GLX_CFLAGS) $(CLUTTER_X11_CFLAGS) $(XCOMPOSITE_CFLAGS) +clutteractortee_LDADD=$(CLUTTER_LIBS) $(CLUTTER_GLX_LIBS) $(CLUTTER_X11_LIBS) \ + $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) $(XCOMPOSITE_LIBS) -lgstvideo-$(GST_API_VERSION) + +endif +endif +endif diff --git a/tests/examples/gl/clutter/clutteractor.c b/tests/examples/gl/clutter/clutteractor.c new file mode 100644 index 0000000..44c97ba --- /dev/null +++ b/tests/examples/gl/clutter/clutteractor.c @@ -0,0 +1,178 @@ +/* + * GStreamer + * Copyright (C) 2008 Filippo Argiolas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CLUTTER_VERSION_MIN_REQUIRED CLUTTER_VERSION_1_8 + +#include +#include +#include +#include +#include +#include +#include + +#define W 320 +#define H 240 + +struct GstGLClutterActor_ +{ + Window win; + Window root; + ClutterActor *texture; + ClutterActor *stage; +}; + +typedef struct GstGLClutterActor_ GstGLClutterActor; + +static gboolean +create_actor (GstGLClutterActor * actor) +{ + //ClutterKnot knot[2]; + //ClutterTimeline *timeline; + ClutterAnimation *animation = NULL; + + actor->texture = g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, + "window", actor->win, "automatic-updates", TRUE, NULL); + clutter_container_add_actor (CLUTTER_CONTAINER (actor->stage), + actor->texture); + clutter_actor_set_scale (actor->texture, 0.2, 0.2); + clutter_actor_set_opacity (actor->texture, 0); + clutter_actor_show (actor->texture); + + //timeline = + // clutter_timeline_new (120 /* frames */ , 50 /* frames per second. */ ); + //clutter_timeline_set_loop (timeline, TRUE); + //clutter_timeline_start (timeline); + + /* Instead of our custom callback, + * we could use a standard callback. For instance, CLUTTER_ALPHA_SINE_INC. + */ + /*effect_template = + clutter_effect_template_new (timeline, CLUTTER_ALPHA_SINE_INC); */ + animation = + clutter_actor_animate (actor->texture, CLUTTER_LINEAR, 2400, + "x", 100.0, "y", 100.0, "opacity", 0, NULL); + + /* knot[0].x = -10; + knot[0].y = -10; + knot[1].x = 160; + knot[1].y = 120; */ + + // Move the actor along the path: + /* clutter_effect_path (effect_template, actor->texture, knot, + sizeof (knot) / sizeof (ClutterKnot), NULL, NULL); + clutter_effect_scale (effect_template, actor->texture, 1.0, 1.0, NULL, NULL); + clutter_effect_rotate (effect_template, actor->texture, + CLUTTER_Z_AXIS, 360.0, W / 2.0, H / 2.0, 0.0, + CLUTTER_ROTATE_CW, NULL, NULL); + clutter_effect_rotate (effect_template, actor->texture, + CLUTTER_X_AXIS, 360.0, 0.0, W / 4.0, 0.0, CLUTTER_ROTATE_CW, NULL, NULL); */ + + // Also change the actor's opacity while moving it along the path: + // (You would probably want to use a different ClutterEffectTemplate, + // so you could use a different alpha callback for this.) + //clutter_effect_fade (effect_template, actor->texture, 255, NULL, NULL); + + g_object_unref (animation); + //g_object_unref (timeline); + + return FALSE; +} + +static GstBusSyncReply +create_window (GstBus * bus, GstMessage * message, gpointer data) +{ + GstGLClutterActor *actor = (GstGLClutterActor *) data; + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_debug ("CREATING WINDOW"); + + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC + (message)), actor->win); + clutter_threads_add_idle ((GSourceFunc) create_actor, actor); + + gst_message_unref (message); + return GST_BUS_DROP; +} + +int +main (int argc, char *argv[]) +{ + GstPipeline *pipeline; + GstBus *bus; + ClutterActor *stage; + GstGLClutterActor *actor; + Display *disp; + Window stage_win; + ClutterInitError clutter_err = CLUTTER_INIT_ERROR_UNKNOWN; + + clutter_err = clutter_init (&argc, &argv); + if (clutter_err != CLUTTER_INIT_SUCCESS) + g_warning ("Failed to initalize clutter: %d\n", clutter_err); + + gst_init (&argc, &argv); + + disp = clutter_x11_get_default_display (); + if (!clutter_x11_has_composite_extension ()) { + g_error ("XComposite extension missing"); + } + + + stage = clutter_stage_get_default (); +// clutter_actor_set_size (CLUTTER_ACTOR (stage), W*3+2, H); + + stage_win = clutter_x11_get_stage_window (CLUTTER_STAGE (stage)); + + actor = g_new0 (GstGLClutterActor, 1); + actor->stage = stage; + actor->win = XCreateSimpleWindow (disp, stage_win, 0, 0, W, H, 0, 0, 0); + XCompositeRedirectWindow (disp, actor->win, CompositeRedirectManual); + XMapRaised (disp, actor->win); + XSync (disp, FALSE); + + pipeline = + GST_PIPELINE (gst_parse_launch + ("videotestsrc ! video/x-raw, width=320, height=240, framerate=(fraction)30/1 ! " + "gleffects effect=twirl ! glimagesink", NULL)); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, actor, + NULL); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); + + clutter_actor_show_all (stage); + + clutter_main (); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/gl/clutter/clutteractortee.c b/tests/examples/gl/clutter/clutteractortee.c new file mode 100644 index 0000000..a46f323 --- /dev/null +++ b/tests/examples/gl/clutter/clutteractortee.c @@ -0,0 +1,231 @@ +/* + * GStreamer + * Copyright (C) 2008 Filippo Argiolas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define GLIB_DISABLE_DEPRECATION_WARNINGS +#define CLUTTER_VERSION_MIN_REQUIRED CLUTTER_VERSION_1_8 + +#include +#include +#include +#include +#include +#include +#include + +#define ROWS 3 +#define COLS 3 +#define N_ACTORS ROWS*COLS +#define W 160 +#define H 120 + +struct GstGLClutterActor_ +{ + Window win; + Window root; + ClutterActor *texture; + ClutterActor *stage; +}; + +typedef struct GstGLClutterActor_ GstGLClutterActor; + +static gboolean +create_actor (GstGLClutterActor * actor) +{ + static gint xpos = 0; + static gint ypos = 0; + actor->texture = g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP, + "window", actor->win, "automatic-updates", TRUE, NULL); + clutter_container_add_actor (CLUTTER_CONTAINER (actor->stage), + actor->texture); + clutter_actor_set_position (actor->texture, xpos, ypos); + + if (xpos > (COLS - 1) * W) { + xpos = 0; + ypos += H + 1; + } else + xpos += W + 1; + clutter_actor_show (actor->texture); + + return FALSE; +} + +static GstBusSyncReply +create_window (GstBus * bus, GstMessage * message, gpointer data) +{ + GstGLClutterActor **actor = (GstGLClutterActor **) data; + static gint count = 0; + static GMutex mutex; + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_mutex_lock (&mutex); + + if (count < N_ACTORS) { + g_message ("adding actor %d", count); + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC + (message)), actor[count]->win); + clutter_threads_add_idle ((GSourceFunc) create_actor, actor[count]); + count++; + } + + g_mutex_unlock (&mutex); + + gst_message_unref (message); + return GST_BUS_DROP; +} + +#if 0 +void +apply_fx (GstElement * element, const gchar * fx) +{ + GEnumClass *p_class; + + /* from fxtest ;) */ + /* heeeellppppp!! */ + p_class = + G_PARAM_SPEC_ENUM (g_object_class_find_property (G_OBJECT_GET_CLASS + (G_OBJECT (data)), "effect") + )->enum_class; + + g_print ("setting: %s - %s\n", fx, g_enum_get_value_by_nick (p_class, + fx)->value_name); + g_object_set (G_OBJECT (element), "effect", g_enum_get_value_by_nick (p_class, + fx)->value, NULL); +} +#endif + +int +main (int argc, char *argv[]) +{ + GstPipeline *pipeline; + GstBus *bus; + + GstElement *srcbin; + GstElement *tee; + GstElement *queue[N_ACTORS], *sink[N_ACTORS]; + GstElement *upload[N_ACTORS]; +/* + GstElement *effect[N_ACTORS]; +*/ + ClutterActor *stage; + GstGLClutterActor *actor[N_ACTORS]; + Display *disp; + Window stage_win; + const gchar *desc; + gint i; + gint ok = FALSE; + ClutterInitError clutter_err = CLUTTER_INIT_ERROR_UNKNOWN; + + clutter_err = clutter_init (&argc, &argv); + if (clutter_err != CLUTTER_INIT_SUCCESS) + g_warning ("Failed to initalize clutter: %d\n", clutter_err); + + gst_init (&argc, &argv); + + disp = clutter_x11_get_default_display (); + if (!clutter_x11_has_composite_extension ()) { + g_error ("XComposite extension missing"); + } + + stage = clutter_stage_get_default (); + clutter_actor_set_size (CLUTTER_ACTOR (stage), + W * COLS + (COLS - 1), H * ROWS + (ROWS - 1)); + + stage_win = clutter_x11_get_stage_window (CLUTTER_STAGE (stage)); + XCompositeRedirectSubwindows (disp, stage_win, CompositeRedirectManual); + + for (i = 0; i < N_ACTORS; i++) { + actor[i] = g_new0 (GstGLClutterActor, 1); + actor[i]->stage = stage; + actor[i]->win = XCreateSimpleWindow (disp, stage_win, 0, 0, W, H, 0, 0, 0); + XMapRaised (disp, actor[i]->win); + XSync (disp, FALSE); + } +/* + desc = g_strdup_printf ("v4l2src ! " + "video/x-raw, width=640, height=480, framerate=30/1 ! " + "videoscale !" + "video/x-raw, width=%d, height=%d ! " + "identity", W, H); +*/ + desc = g_strdup_printf ("videotestsrc ! " + "video/x-raw, format=RGB, width=%d, height=%d !" "identity", W, H); + pipeline = GST_PIPELINE (gst_pipeline_new (NULL)); + + srcbin = gst_parse_bin_from_description (desc, TRUE, NULL); + if (!srcbin) + g_error ("Source bin creation failed"); + + tee = gst_element_factory_make ("tee", NULL); + + gst_bin_add_many (GST_BIN (pipeline), srcbin, tee, NULL); + + for (i = 0; i < N_ACTORS; i++) { + queue[i] = gst_element_factory_make ("queue", NULL); + upload[i] = gst_element_factory_make ("glupload", NULL); +/* effect[i] = gst_element_factory_make ("gleffects", NULL); */ + sink[i] = gst_element_factory_make ("glimagesink", NULL); +/* gst_bin_add_many (GST_BIN (pipeline), + queue[i], upload[i], effect[i], sink[i], NULL); */ + gst_bin_add_many (GST_BIN (pipeline), queue[i], upload[i], sink[i], NULL); + } + + gst_element_link_many (srcbin, tee, NULL); + + for (i = 0; i < N_ACTORS; i++) { + ok |= +// gst_element_link_many (tee, queue[i], upload[i], effect[i], sink[i], + gst_element_link_many (tee, queue[i], upload[i], sink[i], NULL); + } + + if (!ok) + g_error ("Failed to link one or more elements"); + +/* + for (i = 0; i < N_ACTORS; i++) { + g_message ("setting effect %d on %s", i + 1, + gst_element_get_name (effect[i])); + g_object_set (G_OBJECT (effect[i]), "effect", i + 1, NULL); + } +*/ + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, actor, + NULL); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); + + clutter_actor_show_all (stage); + + clutter_main (); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; +} diff --git a/tests/examples/gl/clutter/cluttershare.c b/tests/examples/gl/clutter/cluttershare.c new file mode 100644 index 0000000..d3f1b1e --- /dev/null +++ b/tests/examples/gl/clutter/cluttershare.c @@ -0,0 +1,383 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#define CLUTTER_VERSION_MIN_REQUIRED CLUTTER_VERSION_1_8 +#define CLUTTER_VERSION_MAX_ALLOWED CLUTTER_VERSION_1_10 +#define COGL_VERSION_MIN_REQUIRED COGL_VERSION_1_16 +#define COGL_VERSION_MAX_ALLOWED COGL_VERSION_1_18 +#include +#ifndef WIN32 +#include +#include +#endif + +#include +#include +#include +#include + +/* This example shows how to use textures that come from a + * gst-plugins-gl pipeline, into the clutter framework + * It requires at least clutter 0.8.6 + */ + +/* rotation */ +static void +on_new_frame (ClutterTimeline * timeline, gint msecs, gpointer data) +{ + ClutterActor *rect_actor = CLUTTER_ACTOR (data); + ClutterActor *texture_actor = + g_object_get_data (G_OBJECT (timeline), "texture_actor"); + + clutter_actor_set_rotation (rect_actor, CLUTTER_Z_AXIS, + 60.0 * (gdouble) msecs / 1000.0, clutter_actor_get_width (rect_actor) / 2, + clutter_actor_get_height (rect_actor) / 2, 0); + + clutter_actor_set_rotation (texture_actor, CLUTTER_Z_AXIS, + 60.0 * (gdouble) msecs / 1000.0, + clutter_actor_get_width (texture_actor) / 6, + clutter_actor_get_height (texture_actor) / 6, 0); +} + + +/* clutter scene */ +static ClutterActor * +setup_stage (ClutterStage * stage) +{ + ClutterTimeline *timeline = NULL; + ClutterActor *texture_actor = NULL; + ClutterColor rect_color = { 125, 50, 200, 255 }; + ClutterActor *rect_actor = NULL; + + /* texture actor */ + + texture_actor = clutter_texture_new (); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), texture_actor); + clutter_actor_set_position (texture_actor, 300, 170); + clutter_actor_set_scale (texture_actor, 0.6, 0.6); + clutter_actor_show (texture_actor); + g_object_set_data (G_OBJECT (texture_actor), "stage", stage); + + /* rectangle actor */ + + rect_actor = clutter_rectangle_new_with_color (&rect_color); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect_actor); + clutter_actor_set_size (rect_actor, 50, 50); + clutter_actor_set_position (rect_actor, 300, 300); + clutter_actor_show (rect_actor); + + /* timeline */ + + timeline = clutter_timeline_new (6000); + g_object_set_data (G_OBJECT (timeline), "texture_actor", texture_actor); + clutter_timeline_set_loop (timeline, TRUE); + clutter_timeline_start (timeline); + g_signal_connect (timeline, "new-frame", G_CALLBACK (on_new_frame), + rect_actor); + + return texture_actor; +} + +/* put a gst gl buffer in the texture actor */ +static gboolean +update_texture_actor (gpointer data) +{ + ClutterTexture *texture_actor = (ClutterTexture *) data; + GAsyncQueue *queue_input_buf = + g_object_get_data (G_OBJECT (texture_actor), "queue_input_buf"); + GAsyncQueue *queue_output_buf = + g_object_get_data (G_OBJECT (texture_actor), "queue_output_buf"); + GstBuffer *inbuf = g_async_queue_pop (queue_input_buf); + ClutterActor *stage = g_object_get_data (G_OBJECT (texture_actor), "stage"); + CoglHandle cogl_texture = 0; + GstVideoMeta *v_meta; + GstVideoInfo info; + GstVideoFrame frame; + guint tex_id; + + v_meta = gst_buffer_get_video_meta (inbuf); + if (!v_meta) { + g_warning ("Required Meta was not found on buffers"); + return FALSE; + } + + gst_video_info_set_format (&info, v_meta->format, v_meta->width, + v_meta->height); + + if (!gst_video_frame_map (&frame, &info, inbuf, GST_MAP_READ | GST_MAP_GL)) { + g_warning ("Failed to map video frame"); + return FALSE; + } + + if (!gst_is_gl_memory (frame.map[0].memory)) { + g_warning ("Input buffer does not have GLMemory"); + gst_video_frame_unmap (&frame); + return FALSE; + } + + tex_id = *(guint *) frame.data[0]; + + /* Create a cogl texture from the gst gl texture */ + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, tex_id); + if (glGetError () != GL_NO_ERROR) + g_debug ("failed to bind texture that comes from gst-gl\n"); + cogl_texture = cogl_texture_new_from_foreign (tex_id, + GL_TEXTURE_2D, v_meta->width, v_meta->height, 0, 0, + COGL_PIXEL_FORMAT_RGBA_8888); + glBindTexture (GL_TEXTURE_2D, 0); + + gst_video_frame_unmap (&frame); + + /* Previous cogl texture is replaced and so its ref counter discreases to 0. + * According to the source code, glDeleteTexture is not called when the previous + * ref counter of the previous cogl texture is reaching 0 because is_foreign is TRUE */ + clutter_texture_set_cogl_texture (CLUTTER_TEXTURE (texture_actor), + cogl_texture); + cogl_handle_unref (cogl_texture); + + /* we can now show the clutter scene if not yet visible */ + if (!CLUTTER_ACTOR_IS_VISIBLE (stage)) + clutter_actor_show_all (stage); + + /* push buffer so it can be unref later */ + g_async_queue_push (queue_output_buf, inbuf); + + return FALSE; +} + + +/* fakesink handoff callback */ +static void +on_gst_buffer (GstElement * element, GstBuffer * buf, GstPad * pad, + ClutterActor * texture_actor) +{ + GAsyncQueue *queue_input_buf = NULL; + GAsyncQueue *queue_output_buf = NULL; + + /* ref then push buffer to use it in clutter */ + gst_buffer_ref (buf); + queue_input_buf = + g_object_get_data (G_OBJECT (texture_actor), "queue_input_buf"); + g_async_queue_push (queue_input_buf, buf); + if (g_async_queue_length (queue_input_buf) > 2) + clutter_threads_add_idle_full (G_PRIORITY_HIGH, update_texture_actor, + texture_actor, NULL); + + /* pop then unref buffer we have finished to use in clutter */ + queue_output_buf = + g_object_get_data (G_OBJECT (texture_actor), "queue_output_buf"); + if (g_async_queue_length (queue_output_buf) > 2) { + GstBuffer *buf_old = g_async_queue_pop (queue_output_buf); + gst_buffer_unref (buf_old); + } +} + +/* gst bus signal watch callback */ +static void +end_stream_cb (GstBus * bus, GstMessage * msg, gpointer data) +{ + switch (GST_MESSAGE_TYPE (msg)) { + + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_print + ("For more information, try to run: GST_DEBUG=gldisplay:2 ./cluttershare\n"); + break; + + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) { + g_print ("Debug deails: %s\n", debug); + g_free (debug); + } + + break; + } + + default: + break; + } + + clutter_main_quit (); +} + +int +main (int argc, char *argv[]) +{ + ClutterInitError clutter_err = CLUTTER_INIT_ERROR_UNKNOWN; +#ifdef WIN32 + HGLRC clutter_gl_context = 0; + HDC clutter_dc = 0; +#else + Display *clutter_display = NULL; + Window clutter_win = 0; + GLXContext clutter_gl_context = NULL; +#endif + GstPipeline *pipeline = NULL; + GstBus *bus = NULL; + GstElement *glfilter = NULL; + GstState state = 0; + ClutterActor *stage = NULL; + ClutterActor *clutter_texture = NULL; + GAsyncQueue *queue_input_buf = NULL; + GAsyncQueue *queue_output_buf = NULL; + GstElement *fakesink = NULL; + + /* init gstreamer then clutter */ + + gst_init (&argc, &argv); + clutter_threads_init (); + clutter_err = clutter_init (&argc, &argv); + if (clutter_err != CLUTTER_INIT_SUCCESS) + g_warning ("Failed to initalize clutter: %d\n", clutter_err); + clutter_threads_enter (); + g_print ("clutter version: %s\n", CLUTTER_VERSION_S); + clutter_set_default_frame_rate (2); + + /* avoid to dispatch unecesary events */ + clutter_ungrab_keyboard (); + clutter_ungrab_pointer (); + + /* retrieve and turn off clutter opengl context */ + stage = clutter_stage_get_default (); + +#ifdef WIN32 + clutter_gl_context = wglGetCurrentContext (); + clutter_dc = wglGetCurrentDC (); + wglMakeCurrent (0, 0); +#else + clutter_display = clutter_x11_get_default_display (); + clutter_win = clutter_x11_get_stage_window (CLUTTER_STAGE (stage)); + clutter_gl_context = glXGetCurrentContext (); + glXMakeCurrent (clutter_display, None, 0); +#endif + + /* setup gstreamer pipeline */ + + pipeline = + GST_PIPELINE (gst_parse_launch + ("videotestsrc ! video/x-raw, width=320, height=240, framerate=(fraction)30/1 ! " + "gleffects effect=5 ! glfiltercube ! fakesink sync=1", NULL)); + + /* setup bus */ + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message::error", G_CALLBACK (end_stream_cb), NULL); + g_signal_connect (bus, "message::warning", G_CALLBACK (end_stream_cb), NULL); + g_signal_connect (bus, "message::eos", G_CALLBACK (end_stream_cb), NULL); + gst_object_unref (bus); + + /* clutter_gl_context is an external OpenGL context with which gst-plugins-gl want to share textures */ + glfilter = gst_bin_get_by_name (GST_BIN (pipeline), "glfiltercube0"); + g_object_set (G_OBJECT (glfilter), "external-opengl-context", + clutter_gl_context, NULL); + gst_object_unref (glfilter); + + /* NULL to PAUSED state pipeline to make sure the gst opengl context is created and + * shared with the clutter one */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); + state = GST_STATE_PAUSED; + if (gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL, + GST_CLOCK_TIME_NONE) != GST_STATE_CHANGE_SUCCESS) { + g_debug ("failed to pause pipeline\n"); + return -1; + } + + /* turn on back clutter opengl context */ +#ifdef WIN32 + wglMakeCurrent (clutter_dc, clutter_gl_context); +#else + glXMakeCurrent (clutter_display, clutter_win, clutter_gl_context); +#endif + + /* clutter stage */ + clutter_actor_set_size (stage, 640, 480); + clutter_actor_set_position (stage, 0, 0); + clutter_stage_set_title (CLUTTER_STAGE (stage), "clutter and gst-plugins-gl"); + clutter_texture = setup_stage (CLUTTER_STAGE (stage)); + + /* append a gst-gl texture to this queue when you do not need it no more */ + queue_input_buf = g_async_queue_new (); + queue_output_buf = g_async_queue_new (); + g_object_set_data (G_OBJECT (clutter_texture), "queue_input_buf", + queue_input_buf); + g_object_set_data (G_OBJECT (clutter_texture), "queue_output_buf", + queue_output_buf); + + /* set a callback to retrieve the gst gl textures */ + fakesink = gst_bin_get_by_name (GST_BIN (pipeline), "fakesink0"); + g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); + g_signal_connect (fakesink, "handoff", G_CALLBACK (on_gst_buffer), + clutter_texture); + gst_object_unref (fakesink); + + /* play gst */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); + + /* main loop */ + clutter_main (); + + /* before to deinitialize the gst-gl-opengl context, + * no shared context (here the clutter one) must be current + */ +#ifdef WIN32 + wglMakeCurrent (0, 0); +#else + glXMakeCurrent (clutter_display, None, 0); +#endif + + clutter_threads_leave (); + + /* stop and clean up the pipeline */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); + gst_object_unref (pipeline); + + /* make sure there is no pending gst gl buffer in the communication queues + * between clutter and gst-gl + */ + while (g_async_queue_length (queue_input_buf) > 0) { + GstBuffer *buf = g_async_queue_pop (queue_input_buf); + gst_buffer_unref (buf); + } + + while (g_async_queue_length (queue_output_buf) > 0) { + GstBuffer *buf = g_async_queue_pop (queue_output_buf); + gst_buffer_unref (buf); + } + + g_print ("END\n"); + + return 0; +} diff --git a/tests/examples/gl/clutter/cluttershare.cbp b/tests/examples/gl/clutter/cluttershare.cbp new file mode 100644 index 0000000..cb4907e --- /dev/null +++ b/tests/examples/gl/clutter/cluttershare.cbp @@ -0,0 +1,76 @@ + + + + + + diff --git a/tests/examples/gl/cocoa/Makefile.am b/tests/examples/gl/cocoa/Makefile.am new file mode 100755 index 0000000..716aa30 --- /dev/null +++ b/tests/examples/gl/cocoa/Makefile.am @@ -0,0 +1,4 @@ + +if HAVE_WINDOW_COCOA +SUBDIRS = videooverlay +endif diff --git a/tests/examples/gl/cocoa/README b/tests/examples/gl/cocoa/README new file mode 100644 index 0000000..74fe337 --- /dev/null +++ b/tests/examples/gl/cocoa/README @@ -0,0 +1,9 @@ +--- Description of the Cocoa examples --- + +- videooverlay: +Show how to use the videooverlay interface through Cocoa. +For now, the source is videotestsrc. (not yet a video file) + +--- How to build the Cocoa examples on GNUstep environnements --- + +make clean all -f GNUmakefile.gnustep diff --git a/tests/examples/gl/cocoa/videooverlay/.gitignore b/tests/examples/gl/cocoa/videooverlay/.gitignore new file mode 100644 index 0000000..c5ee310 --- /dev/null +++ b/tests/examples/gl/cocoa/videooverlay/.gitignore @@ -0,0 +1 @@ +videooverlay diff --git a/tests/examples/gl/cocoa/videooverlay/Makefile.am b/tests/examples/gl/cocoa/videooverlay/Makefile.am new file mode 100755 index 0000000..47dac61 --- /dev/null +++ b/tests/examples/gl/cocoa/videooverlay/Makefile.am @@ -0,0 +1,14 @@ +if HAVE_WINDOW_COCOA + +noinst_PROGRAMS = videooverlay + +videooverlay_SOURCES = main.m + +videooverlay_OBJCFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) -I/usr/local/include/gstreamer-${GST_API_VERSION} ${GL_OBJCFLAGS} +videooverlay_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) + +videooverlay_LIBTOOLFLAGS = --tag=OBJC + +endif diff --git a/tests/examples/gl/cocoa/videooverlay/main.m b/tests/examples/gl/cocoa/videooverlay/main.m new file mode 100755 index 0000000..8f959fe --- /dev/null +++ b/tests/examples/gl/cocoa/videooverlay/main.m @@ -0,0 +1,240 @@ +#include +#include +#include + +/* ============================================================= */ +/* */ +/* MainWindow */ +/* */ +/* ============================================================= */ + +@interface MainWindow: NSWindow { + GMainLoop *m_loop; + GstElement *m_pipeline; + gboolean m_isClosed; +} +- (id) initWithContentRect:(NSRect) contentRect Loop:(GMainLoop*)loop Pipeline:(GstElement*)pipeline; +- (GMainLoop*) loop; +- (GstElement*) pipeline; +- (gboolean) isClosed; +@end + +@implementation MainWindow + +- (id) initWithContentRect:(NSRect)contentRect Loop:(GMainLoop*)loop Pipeline:(GstElement*)pipeline +{ + m_loop = loop; + m_pipeline = pipeline; + m_isClosed = FALSE; + + self = [super initWithContentRect: contentRect + styleMask: (NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask) + backing: NSBackingStoreBuffered defer: NO screen: nil]; + + [self setReleasedWhenClosed:NO]; + [NSApp setDelegate:self]; + + [self setTitle:@"gst-plugins-gl implements videooverlay interface"]; + + return self; +} + +- (GMainLoop*) loop { + return m_loop; +} + +- (GstElement*) pipeline { + return m_pipeline; +} + +- (gboolean) isClosed { + return m_isClosed; +} + +- (void) customClose { + m_isClosed = TRUE; +} + +- (BOOL) windowShouldClose:(id)sender { + gst_element_send_event (m_pipeline, gst_event_new_eos ()); + return YES; +} + +- (void) applicationDidFinishLaunching: (NSNotification *) not { + [self makeMainWindow]; + [self center]; + [self orderFront:self]; +} + +- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app { + return NO; +} + +@end + + +/* ============================================================= */ +/* */ +/* gstreamer callbacks */ +/* */ +/* ============================================================= */ + + +static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, MainWindow* window) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_print ("setting window handle %lud\n", (gulong) window); + + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), (guintptr) window); + + gst_message_unref (message); + + return GST_BUS_DROP; +} + + +static void end_stream_cb(GstBus* bus, GstMessage* message, MainWindow* window) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + g_print ("end of stream\n"); + + gst_element_set_state ([window pipeline], GST_STATE_NULL); + gst_object_unref ([window pipeline]); + g_main_loop_quit ([window loop]); + + [window performSelectorOnMainThread:@selector(customClose) withObject:nil waitUntilDone:YES]; + + [pool release]; +} + +static gpointer thread_func (MainWindow* window) +{ +#ifdef GNUSTEP + GSRegisterCurrentThread(); +#endif + + g_main_loop_run ([window loop]); + +#ifdef GNUSTEP + GSUnregisterCurrentThread(); +#endif + return NULL; +} + + +/* ============================================================= */ +/* */ +/* application */ +/* */ +/* ============================================================= */ + +int main(int argc, char **argv) +{ + int width = 640; + int height = 480; + + GMainLoop *loop = NULL; + GstElement *pipeline = NULL; + + GstElement *videosrc = NULL; + GstElement *videosink = NULL; + GstCaps *caps=NULL; + gboolean ok=FALSE; + GstBus *bus=NULL; + GThread *loop_thread=NULL; + NSAutoreleasePool *pool=nil; + NSRect rect; + MainWindow *window=nil; + +#ifdef GNUSTEP + GstState state; +#endif + + g_print("app created\n"); + + gst_init (&argc, &argv); + + loop = g_main_loop_new (NULL, FALSE); + pipeline = gst_pipeline_new ("pipeline"); + + videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); + videosink = gst_element_factory_make ("glimagesink", "glimagesink"); + + g_object_set(G_OBJECT(videosrc), "num-buffers", 500, NULL); + + gst_bin_add_many (GST_BIN (pipeline), videosrc, videosink, NULL); + + caps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, width, + "height", G_TYPE_INT, height, + "framerate", GST_TYPE_FRACTION, 25, 1, + "format", G_TYPE_STRING, "I420", + NULL); + + ok = gst_element_link_filtered(videosrc, videosink, caps); + gst_caps_unref(caps); + if (!ok) + g_warning("could not link videosrc to videosink\n"); + +#ifdef GNUSTEP + gst_element_set_state (pipeline, GST_STATE_PAUSED); + state = GST_STATE_PAUSED; + gst_element_get_state (pipeline, &state, &state, GST_CLOCK_TIME_NONE); + g_print("pipeline paused\n"); + GSRegisterCurrentThread(); +#endif + + pool = [[NSAutoreleasePool alloc] init]; +#ifndef GNUSTEP + [NSApplication sharedApplication]; +#endif + + rect.origin.x = 0; rect.origin.y = 0; + rect.size.width = width; rect.size.height = height; + + window = [[MainWindow alloc] initWithContentRect:rect Loop:loop Pipeline:pipeline]; + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), window); + g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), window); + g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), window); + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, window, NULL); + gst_object_unref (bus); + + loop_thread = g_thread_new (NULL, + (GThreadFunc) thread_func, window); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + [window orderFront:window]; + +#ifndef GNUSTEP + while (![window isClosed]) { + NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate dateWithTimeIntervalSinceNow:1] + inMode:NSDefaultRunLoopMode dequeue:YES]; + if (event) + [NSApp sendEvent:event]; + } +#endif + + g_thread_join (loop_thread); + + [window release]; + + [pool release]; + +#ifdef GNUSTEP + GSUnregisterCurrentThread(); +#endif + + return 0; +} diff --git a/tests/examples/gl/generic/Makefile.am b/tests/examples/gl/generic/Makefile.am new file mode 100644 index 0000000..a334e12 --- /dev/null +++ b/tests/examples/gl/generic/Makefile.am @@ -0,0 +1,2 @@ + +SUBDIRS = cube cubeyuv doublecube recordgraphic diff --git a/tests/examples/gl/generic/README b/tests/examples/gl/generic/README new file mode 100644 index 0000000..a91d6bf --- /dev/null +++ b/tests/examples/gl/generic/README @@ -0,0 +1,21 @@ +--- Description of the generic (no GUI) examples --- + +- cube: +Show how to have a graphic FPS greater than the input video frame rate. +The source is the videotestsrc rgb. + +- cubeyuv: +Show how to have a graphic FPS greater than the input video frame rate. +The source is a local video file needed in argument. +The colorspace conversion is maded by the glupload element. + +- doublecube: +A local video source is displayed into two renderers. +The first one is a normal 2D screen, the second is a 3D cube. +We can visually check that the video is displayed at the same speed +in the two renderers. + +- recordgraphic: +Show how to use the glfilterapp to define the draw callback in a gstreamer client code. +The scene is recorded into an avi file using mpeg4 encoder. +The colorspace conversion is made by the gldownload element. diff --git a/tests/examples/gl/generic/cube/.gitignore b/tests/examples/gl/generic/cube/.gitignore new file mode 100644 index 0000000..3c088dd --- /dev/null +++ b/tests/examples/gl/generic/cube/.gitignore @@ -0,0 +1 @@ +cube diff --git a/tests/examples/gl/generic/cube/Makefile.am b/tests/examples/gl/generic/cube/Makefile.am new file mode 100644 index 0000000..41a5e2c --- /dev/null +++ b/tests/examples/gl/generic/cube/Makefile.am @@ -0,0 +1,8 @@ + +noinst_PROGRAMS = cube + +cube_SOURCES = main.cpp + +cube_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_CXXFLAGS) $(GL_CFLAGS) +cube_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_LIBS) $(GL_LIBS) + diff --git a/tests/examples/gl/generic/cube/cube.vcproj b/tests/examples/gl/generic/cube/cube.vcproj new file mode 100644 index 0000000..aefb6ad --- /dev/null +++ b/tests/examples/gl/generic/cube/cube.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/generic/cube/main.cpp b/tests/examples/gl/generic/cube/main.cpp new file mode 100644 index 0000000..b3b167c --- /dev/null +++ b/tests/examples/gl/generic/cube/main.cpp @@ -0,0 +1,248 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#if __WIN32__ || _WIN32 +# include +#endif +#include + +#include +#include + +static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop*)data; + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) + { + g_print ("Debug deails: %s\n", debug); + g_free (debug); + } + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +//client reshape callback +static void reshapeCallback (GLuint width, GLuint height, gpointer data) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + +//client draw callback + +static gboolean drawCallback (GLuint texture, GLuint width, GLuint height, gpointer data) +{ + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + std::cout << "GRPHIC FPS = " << nbFrames << std::endl; + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.3f; + yrot+=0.2f; + zrot+=0.4f; + + //return TRUE causes a postRedisplay + return TRUE; +} + + +//gst-launch-1.0 videotestsrc num_buffers=400 ! video/x-raw, width=320, height=240 ! +//glgraphicmaker ! glfiltercube ! video/x-raw, width=800, height=600 ! glimagesink +gint main (gint argc, gchar *argv[]) +{ + GstStateChangeReturn ret; + GstElement *pipeline, *videosrc, *glimagesink; + + GMainLoop *loop; + GstBus *bus; + + /* initialization */ + gst_init (&argc, &argv); + loop = g_main_loop_new (NULL, FALSE); + + /* create elements */ + pipeline = gst_pipeline_new ("pipeline"); + + /* watch for messages on the pipeline's bus (note that this will only + * work like this when a GLib main loop is running) */ + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, bus_call, loop); + gst_object_unref (bus); + + /* create elements */ + videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc0"); + glimagesink = gst_element_factory_make ("glimagesink", "glimagesink0"); + + + if (!videosrc || !glimagesink) + { + g_print ("one element could not be found \n"); + return -1; + } + + /* change video source caps */ + GstCaps *caps = gst_caps_new_simple("video/x-raw", + "format", G_TYPE_STRING, "RGB", + "width", G_TYPE_INT, 320, + "height", G_TYPE_INT, 240, + "framerate", GST_TYPE_FRACTION, 25, 1, + NULL) ; + + /* configure elements */ + g_object_set(G_OBJECT(videosrc), "num-buffers", 400, NULL); + g_object_set(G_OBJECT(glimagesink), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(glimagesink), "client-draw-callback", drawCallback, NULL); + g_object_set(G_OBJECT(glimagesink), "client-data", NULL, NULL); + + /* add elements */ + gst_bin_add_many (GST_BIN (pipeline), videosrc, glimagesink, NULL); + + /* link elements */ + gboolean link_ok = gst_element_link_filtered(videosrc, glimagesink, caps) ; + gst_caps_unref(caps) ; + if(!link_ok) + { + g_warning("Failed to link videosrc to glimagesink!\n") ; + return -1 ; + } + + /* run */ + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + + gst_message_parse_error (msg, &err, NULL); + g_print ("ERROR: %s\n", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return -1; + } + + g_main_loop_run (loop); + + /* clean up */ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; + +} diff --git a/tests/examples/gl/generic/cubeyuv/.gitignore b/tests/examples/gl/generic/cubeyuv/.gitignore new file mode 100644 index 0000000..bd5c0ce --- /dev/null +++ b/tests/examples/gl/generic/cubeyuv/.gitignore @@ -0,0 +1 @@ +cubeyuv diff --git a/tests/examples/gl/generic/cubeyuv/Makefile.am b/tests/examples/gl/generic/cubeyuv/Makefile.am new file mode 100644 index 0000000..0fe4fcd --- /dev/null +++ b/tests/examples/gl/generic/cubeyuv/Makefile.am @@ -0,0 +1,8 @@ + +noinst_PROGRAMS = cubeyuv + +cubeyuv_SOURCES = main.cpp + +cubeyuv_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_CXXFLAGS) $(GL_CFLAGS) +cubeyuv_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_LIBS) $(GL_LIBS) + diff --git a/tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj b/tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj new file mode 100644 index 0000000..1d20859 --- /dev/null +++ b/tests/examples/gl/generic/cubeyuv/cubeyuv.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/generic/cubeyuv/main.cpp b/tests/examples/gl/generic/cubeyuv/main.cpp new file mode 100644 index 0000000..6e17b6a --- /dev/null +++ b/tests/examples/gl/generic/cubeyuv/main.cpp @@ -0,0 +1,325 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#if __WIN32__ || _WIN32 +# include +#endif +#include + +#include +#include +#include + +static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop*)data; + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) + { + g_print ("Debug deails: %s\n", debug); + g_free (debug); + } + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + + +//display video framerate +static void identityCallback (GstElement *src, GstBuffer *buffer, GstElement* textoverlay) +{ + static GstClockTime last_timestamp = 0; + static gint nbFrames = 0 ; + + //display estimated video FPS + nbFrames++ ; + if (GST_BUFFER_TIMESTAMP(buffer) - last_timestamp >= 1000000000) + { + std::ostringstream oss ; + oss << "video framerate = " << nbFrames ; + std::string s(oss.str()) ; + g_object_set(G_OBJECT(textoverlay), "text", s.c_str(), NULL); + last_timestamp = GST_BUFFER_TIMESTAMP(buffer) ; + nbFrames = 0 ; + } +} + + +//client reshape callback +static void reshapeCallback (GLuint width, GLuint height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + + +//client draw callback +static gboolean drawCallback (GLuint texture, GLuint width, GLuint height) +{ + + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + std::cout << "GRPHIC FPS = " << nbFrames << std::endl; + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.03f; + yrot+=0.02f; + zrot+=0.04f; + + //return TRUE causes a postRedisplay + //so you have to return FALSE to synchronise to have a graphic FPS + //equals to the input video frame rate + + //Usually, we will not always return TRUE (or FALSE) + //For example, if you want a fixed graphic FPS equals to 60 + //then you have to use the timeclock to return TRUE or FALSE + //in order to increase or decrease the FPS in real time + //to reach the 60. + + return TRUE; +} + + +static void cb_new_pad (GstElement* decodebin, GstPad* pad, GstElement* identity) +{ + GstPad* identity_pad = gst_element_get_static_pad (identity, "sink"); + + //only link once + if (GST_PAD_IS_LINKED (identity_pad)) + { + gst_object_unref (identity_pad); + return; + } + + GstCaps* caps = gst_pad_get_current_caps (pad); + GstStructure* str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "video")) + { + gst_caps_unref (caps); + gst_object_unref (identity_pad); + return; + } + gst_caps_unref (caps); + + GstPadLinkReturn ret = gst_pad_link (pad, identity_pad); + if (ret != GST_PAD_LINK_OK) + g_warning ("Failed to link with decodebin!\n"); +} + + +gint main (gint argc, gchar *argv[]) +{ + if (argc != 2) + { + g_warning ("usage: cubeyuv.exe videolocation\n"); + return -1; + } + + std::string video_location(argv[1]); + + /* initialization */ + gst_init (&argc, &argv); + GMainLoop* loop = g_main_loop_new (NULL, FALSE); + + /* create elements */ + GstElement* pipeline = gst_pipeline_new ("pipeline"); + + /* watch for messages on the pipeline's bus (note that this will only + * work like this when a GLib main loop is running) */ + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, bus_call, loop); + gst_object_unref (bus); + + /* create elements */ + GstElement* videosrc = gst_element_factory_make ("filesrc", "filesrc0"); + GstElement* decodebin = gst_element_factory_make ("decodebin", "decodebin"); + GstElement* identity = gst_element_factory_make ("identity", "identity0"); + GstElement* textoverlay = gst_element_factory_make ("textoverlay", "textoverlay0"); + GstElement* glcolorscale = gst_element_factory_make ("glcolorscale", "glcolorscale0"); + GstElement* glimagesink = gst_element_factory_make ("glimagesink", "glimagesink0"); + + + if (!videosrc || !decodebin || !identity || !textoverlay || + !glcolorscale || !glimagesink) + { + g_print ("one element could not be found \n"); + return -1; + } + + GstCaps *outcaps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 640, + "height", G_TYPE_INT, 480, + NULL); + + /* configure elements */ + g_object_set(G_OBJECT(videosrc), "num-buffers", 800, NULL); + g_object_set(G_OBJECT(videosrc), "location", video_location.c_str(), NULL); + g_signal_connect(identity, "handoff", G_CALLBACK(identityCallback), textoverlay) ; + g_object_set(G_OBJECT(textoverlay), "font_desc", "Ahafoni CLM Bold 30", NULL); + g_object_set(G_OBJECT(glimagesink), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(glimagesink), "client-draw-callback", drawCallback, NULL); + + /* add elements */ + gst_bin_add_many (GST_BIN (pipeline), videosrc, decodebin, identity, + textoverlay, glcolorscale, glimagesink, NULL); + + /* link elements */ + gst_element_link_pads (videosrc, "src", decodebin, "sink"); + + g_signal_connect (decodebin, "pad-added", G_CALLBACK (cb_new_pad), identity); + + if (!gst_element_link_pads(identity, "src", textoverlay, "video_sink")) + { + g_print ("Failed to link identity to textoverlay!\n"); + return -1; + } + + gst_element_link (textoverlay, glcolorscale); + + gboolean link_ok = gst_element_link_filtered(glcolorscale, glimagesink, outcaps) ; + gst_caps_unref(outcaps) ; + if(!link_ok) + { + g_warning("Failed to link textoverlay to glimagesink!\n") ; + return -1 ; + } + + /* run */ + GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + + gst_message_parse_error (msg, &err, NULL); + g_print ("ERROR: %s\n", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return -1; + } + + g_main_loop_run (loop); + + /* clean up */ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; + +} + diff --git a/tests/examples/gl/generic/doublecube/.gitignore b/tests/examples/gl/generic/doublecube/.gitignore new file mode 100644 index 0000000..e9f4f13 --- /dev/null +++ b/tests/examples/gl/generic/doublecube/.gitignore @@ -0,0 +1 @@ +doublecube diff --git a/tests/examples/gl/generic/doublecube/Makefile.am b/tests/examples/gl/generic/doublecube/Makefile.am new file mode 100644 index 0000000..7a9184b --- /dev/null +++ b/tests/examples/gl/generic/doublecube/Makefile.am @@ -0,0 +1,8 @@ + +noinst_PROGRAMS = doublecube + +doublecube_SOURCES = main.cpp + +doublecube_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_CXXFLAGS) $(GL_CFLAGS) +doublecube_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_LIBS) $(GL_LIBS) + diff --git a/tests/examples/gl/generic/doublecube/doublecube.vcproj b/tests/examples/gl/generic/doublecube/doublecube.vcproj new file mode 100644 index 0000000..db0364b --- /dev/null +++ b/tests/examples/gl/generic/doublecube/doublecube.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/generic/doublecube/main.cpp b/tests/examples/gl/generic/doublecube/main.cpp new file mode 100644 index 0000000..4f28336 --- /dev/null +++ b/tests/examples/gl/generic/doublecube/main.cpp @@ -0,0 +1,368 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#if __WIN32__ || _WIN32 +# include +#endif +#include + +#include +#include +#include + +static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop*)data; + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) + { + g_print ("Debug details: %s\n", debug); + g_free (debug); + } + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + + +//display video framerate +static GstPadProbeReturn textoverlay_sink_pad_probe_cb (GstPad *pad, GstPadProbeInfo *info, GstElement* textoverlay) +{ + static GstClockTime last_timestamp = 0; + static gint nbFrames = 0 ; + + //display estimated video FPS + nbFrames++ ; + if (GST_BUFFER_TIMESTAMP(info->data) - last_timestamp >= 1000000000) + { + std::ostringstream oss ; + oss << "video framerate = " << nbFrames ; + std::string s(oss.str()) ; + g_object_set(G_OBJECT(textoverlay), "text", s.c_str(), NULL); + last_timestamp = GST_BUFFER_TIMESTAMP(info->data) ; + nbFrames = 0 ; + } + + return GST_PAD_PROBE_OK; +} + + +//client reshape callback +static void reshapeCallback (GLuint width, GLuint height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + + +//client draw callback +static gboolean drawCallback (GLuint texture, GLuint width, GLuint height) +{ + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + std::cout << "GRAPHIC FPS of the scene which contains the custom cube) = " << nbFrames << std::endl; + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.03f; + yrot+=0.02f; + zrot+=0.04f; + + //return TRUE causes a postRedisplay + //so you have to return FALSE to synchronise to have a graphic FPS + //equals to the input video frame rate + + //Usually, we will not always return TRUE (or FALSE) + //For example, if you want a fixed graphic FPS equals to 60 + //then you have to use the timeclock to return TRUE or FALSE + //in order to increase or decrease the FPS in real time + //to reach the 60. + + return TRUE; +} + + +static void cb_new_pad (GstElement* decodebin, GstPad* pad, GstElement* element) +{ + GstPad* element_pad = gst_element_get_static_pad (element, "sink"); + + //only link once + if (!element_pad || GST_PAD_IS_LINKED (element_pad)) + { + gst_object_unref (element_pad); + return; + } + + GstCaps* caps = gst_pad_get_current_caps (pad); + GstStructure* str = gst_caps_get_structure (caps, 0); + + GstCaps* caps2 = gst_pad_query_caps (element_pad, NULL); + gst_caps_unref (caps2); + + if (!g_strrstr (gst_structure_get_name (str), "video")) + { + gst_caps_unref (caps); + gst_object_unref (element_pad); + return; + } + gst_caps_unref (caps); + + GstPadLinkReturn ret = gst_pad_link (pad, element_pad); + if (ret != GST_PAD_LINK_OK) + g_warning ("Failed to link with decodebin %d!\n", ret); + gst_object_unref (element_pad); +} + + +gint main (gint argc, gchar *argv[]) +{ + + if (argc != 2) + { + g_warning ("usage: doublecube.exe videolocation\n"); + return -1; + } + + std::string video_location(argv[1]); + + /* initialization */ + gst_init (&argc, &argv); + GMainLoop* loop = g_main_loop_new (NULL, FALSE); + + /* create elements */ + GstElement* pipeline = gst_pipeline_new ("pipeline"); + + /* watch for messages on the pipeline's bus (note that this will only + * work like this when a GLib main loop is running) */ + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, bus_call, loop); + gst_object_unref (bus); + + /* create elements */ + GstElement* videosrc = gst_element_factory_make ("filesrc", "filesrc0"); + GstElement* decodebin = gst_element_factory_make ("decodebin", "decodebin0"); + GstElement* videoconvert = gst_element_factory_make ("videoscale", "videoconvert0"); + GstElement* textoverlay = gst_element_factory_make ("textoverlay", "textoverlay0"); //textoverlay required I420 + GstElement* tee = gst_element_factory_make ("tee", "tee0"); + + GstElement* queue0 = gst_element_factory_make ("queue", "queue0"); + GstElement* glimagesink0 = gst_element_factory_make ("glimagesink", "glimagesink0"); + + GstElement* queue1 = gst_element_factory_make ("queue", "queue1"); + GstElement* glfiltercube = gst_element_factory_make ("glfiltercube", "glfiltercube"); + GstElement* glimagesink1 = gst_element_factory_make ("glimagesink", "glimagesink1"); + + GstElement* queue2 = gst_element_factory_make ("queue", "queue2"); + GstElement* glimagesink2 = gst_element_factory_make ("glimagesink", "glimagesink2"); + + + if (!videosrc || !decodebin || !videoconvert || !textoverlay || !tee || + !queue0 || !glimagesink0 || + !queue1 || !glfiltercube || !glimagesink1 || + !queue2 || !glimagesink2) + { + g_warning ("one element could not be found \n"); + return -1; + } + + GstCaps* cubecaps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 600, + "height", G_TYPE_INT, 400, + NULL); + + /* configure elements */ + g_object_set(G_OBJECT(videosrc), "num-buffers", 1000, NULL); + g_object_set(G_OBJECT(videosrc), "location", video_location.c_str(), NULL); + g_object_set(G_OBJECT(textoverlay), "font_desc", "Ahafoni CLM Bold 30", NULL); + g_object_set(G_OBJECT(glimagesink0), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(glimagesink0), "client-draw-callback", drawCallback, NULL); + + /* add elements */ + gst_bin_add_many (GST_BIN (pipeline), videosrc, decodebin, videoconvert, textoverlay, tee, + queue0, glimagesink0, + queue1, glfiltercube, glimagesink1, + queue2, glimagesink2, NULL); + + GstPad* textoverlay_sink_pad = gst_element_get_static_pad (textoverlay, "video_sink"); + gst_pad_add_probe (textoverlay_sink_pad, GST_PAD_PROBE_TYPE_BUFFER, + (GstPadProbeCallback) textoverlay_sink_pad_probe_cb, (gpointer)textoverlay, NULL); + gst_object_unref (textoverlay_sink_pad); + + if (!gst_element_link_many(videoconvert, textoverlay, tee, NULL)) + { + g_print ("Failed to link videoconvert to tee!\n"); + return -1; + } + + if (!gst_element_link(videosrc, decodebin)) + { + g_print ("Failed to link videosrc to decodebin!\n"); + return -1; + } + + g_signal_connect (decodebin, "pad-added", G_CALLBACK (cb_new_pad), videoconvert); + + if (!gst_element_link_many(tee, queue0, NULL)) + { + g_warning ("Failed to link one or more elements bettween tee and queue0!\n"); + return -1; + } + + gboolean link_ok = gst_element_link_filtered(queue0, glimagesink0, cubecaps) ; + gst_caps_unref(cubecaps) ; + if(!link_ok) + { + g_warning("Failed to link queue0 to glimagesink0!\n") ; + return -1 ; + } + + if (!gst_element_link_many(tee, queue1, glfiltercube, glimagesink1, NULL)) + { + g_warning ("Failed to link one or more elements bettween tee and glimagesink1!\n"); + return -1; + } + + if (!gst_element_link_many(tee, queue2, glimagesink2, NULL)) + { + g_warning ("Failed to link one or more elements bettween tee and glimagesink2!\n"); + return -1; + } + + /* run */ + GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + + gst_message_parse_error (msg, &err, NULL); + g_print ("ERROR: %s\n", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return -1; + } + + g_main_loop_run (loop); + + /* clean up */ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; + +} + diff --git a/tests/examples/gl/generic/generic.sln b/tests/examples/gl/generic/generic.sln new file mode 100644 index 0000000..22e86f6 --- /dev/null +++ b/tests/examples/gl/generic/generic.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cube", "cube\cube.vcproj", "{DA41FBFF-E1DE-4DA1-BB96-C56C63D5CDBE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cubeyuv", "cubeyuv\cubeyuv.vcproj", "{6C94B86A-8E34-4163-840A-BFD5C80B1F2E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doublecube", "doublecube\doublecube.vcproj", "{4EC968E0-5B6C-418A-8A75-F390D56DFFE8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "recordgraphic", "recordgraphic\recordgraphic.vcproj", "{E9A5E91B-5F8B-4322-9531-00CCFCB29A2D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DA41FBFF-E1DE-4DA1-BB96-C56C63D5CDBE}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA41FBFF-E1DE-4DA1-BB96-C56C63D5CDBE}.Debug|Win32.Build.0 = Debug|Win32 + {DA41FBFF-E1DE-4DA1-BB96-C56C63D5CDBE}.Release|Win32.ActiveCfg = Release|Win32 + {DA41FBFF-E1DE-4DA1-BB96-C56C63D5CDBE}.Release|Win32.Build.0 = Release|Win32 + {6C94B86A-8E34-4163-840A-BFD5C80B1F2E}.Debug|Win32.ActiveCfg = Debug|Win32 + {6C94B86A-8E34-4163-840A-BFD5C80B1F2E}.Debug|Win32.Build.0 = Debug|Win32 + {6C94B86A-8E34-4163-840A-BFD5C80B1F2E}.Release|Win32.ActiveCfg = Release|Win32 + {6C94B86A-8E34-4163-840A-BFD5C80B1F2E}.Release|Win32.Build.0 = Release|Win32 + {4EC968E0-5B6C-418A-8A75-F390D56DFFE8}.Debug|Win32.ActiveCfg = Debug|Win32 + {4EC968E0-5B6C-418A-8A75-F390D56DFFE8}.Debug|Win32.Build.0 = Debug|Win32 + {4EC968E0-5B6C-418A-8A75-F390D56DFFE8}.Release|Win32.ActiveCfg = Release|Win32 + {4EC968E0-5B6C-418A-8A75-F390D56DFFE8}.Release|Win32.Build.0 = Release|Win32 + {E9A5E91B-5F8B-4322-9531-00CCFCB29A2D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E9A5E91B-5F8B-4322-9531-00CCFCB29A2D}.Debug|Win32.Build.0 = Debug|Win32 + {E9A5E91B-5F8B-4322-9531-00CCFCB29A2D}.Release|Win32.ActiveCfg = Release|Win32 + {E9A5E91B-5F8B-4322-9531-00CCFCB29A2D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/generic/recordgraphic/.gitignore b/tests/examples/gl/generic/recordgraphic/.gitignore new file mode 100644 index 0000000..8127d83 --- /dev/null +++ b/tests/examples/gl/generic/recordgraphic/.gitignore @@ -0,0 +1 @@ +recordgraphic diff --git a/tests/examples/gl/generic/recordgraphic/Makefile.am b/tests/examples/gl/generic/recordgraphic/Makefile.am new file mode 100644 index 0000000..4ee21ac --- /dev/null +++ b/tests/examples/gl/generic/recordgraphic/Makefile.am @@ -0,0 +1,8 @@ + +noinst_PROGRAMS = recordgraphic + +recordgraphic_SOURCES = main.cpp + +recordgraphic_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) $(GL_CFLAGS) +recordgraphic_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ $(GST_LIBS) $(GL_LIBS) + diff --git a/tests/examples/gl/generic/recordgraphic/main.cpp b/tests/examples/gl/generic/recordgraphic/main.cpp new file mode 100644 index 0000000..fd0ceb0 --- /dev/null +++ b/tests/examples/gl/generic/recordgraphic/main.cpp @@ -0,0 +1,278 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#if __WIN32__ || _WIN32 +# include +#endif +#include +#include + +#include +#include + +static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) +{ + GMainLoop *loop = (GMainLoop*)data; + + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_main_loop_quit (loop); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) + { + g_print ("Debug details: %s\n", debug); + g_free (debug); + } + + g_main_loop_quit (loop); + break; + } + default: + break; + } + + return TRUE; +} + +//client reshape callback +static void reshapeCallback (GLuint width, GLuint height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + + +//client draw callback +static gboolean drawCallback (GLuint width, GLuint height, GLuint texture, gpointer data) +{ + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + std::cout << "GRPHIC FPS = " << nbFrames << std::endl; + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + //cube + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.3f; + yrot+=0.2f; + zrot+=0.4f; + + //return TRUE causes a postRedisplay + return FALSE; +} + + +//equivalent command line: +//gst-launch-1.0 videotestsrc num_buffers=400 ! gleffects effect=0 ! +//avenc_mpeg4 ! avimux ! filesink location="record.avi" +// or +//gst-launch-1.0 videotestsrc num_buffers=400 ! gleffects effect=0 ! "video/x-raw, width=320, height=240" ! glfiltercube ! "video/x-raw, width=720, height=576" ! +//avenc_mpeg4 ! avimux ! filesink location="record.avi" +gint main (gint argc, gchar *argv[]) +{ + GstStateChangeReturn ret; + GstElement *pipeline, *videosrc, *glfilterapp, *avenc_mpeg4, *avimux, *filesink; + GMainLoop *loop; + GstBus *bus; + + /* initialization */ + gst_init (&argc, &argv); + loop = g_main_loop_new (NULL, FALSE); + + /* create elements */ + pipeline = gst_pipeline_new ("pipeline"); + + /* watch for messages on the pipeline's bus (note that this will only + * work like this when a GLib main loop is running) */ + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_watch (bus, bus_call, loop); + gst_object_unref (bus); + + /* create elements */ + videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc0"); + glfilterapp = gst_element_factory_make ("glfilterapp", "glfilterapp0"); + avenc_mpeg4 = gst_element_factory_make ("avenc_mpeg4", "avenc_mpeg40"); + avimux = gst_element_factory_make ("avimux", "avimux0"); + filesink = gst_element_factory_make ("filesink", "filesink0"); + + + if (!videosrc || !glfilterapp || !avenc_mpeg4 || !avimux || !filesink) + { + g_print ("one element could not be found \n"); + return -1; + } + + /* change video source caps */ + GstCaps *caps = gst_caps_new_simple("video/x-raw", + "format", G_TYPE_STRING, "UYVY", + "width", G_TYPE_INT, 320, + "height", G_TYPE_INT, 240, + "framerate", GST_TYPE_FRACTION, 25, 1, + NULL); + + /* change video source caps */ + GstCaps *outcaps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 640, + "height", G_TYPE_INT, 480, + NULL); + + /* configure elements */ + g_object_set(G_OBJECT(videosrc), "num-buffers", 400, NULL); + g_object_set(G_OBJECT(glfilterapp), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(glfilterapp), "client-draw-callback", drawCallback, NULL); + g_object_set(G_OBJECT(glfilterapp), "client-data", NULL, NULL); + g_object_set(G_OBJECT(filesink), "location", "record.avi", NULL); + + /* add elements */ + gst_bin_add_many (GST_BIN (pipeline), videosrc, glfilterapp, + avenc_mpeg4, avimux, filesink, NULL); + + /* link elements */ + gboolean link_ok = gst_element_link_filtered(videosrc, glfilterapp, caps) ; + gst_caps_unref(caps) ; + if(!link_ok) + { + g_warning("Failed to link videosrc to glfilterapp!\n") ; + return -1 ; + } + + link_ok = gst_element_link_filtered(glfilterapp, avenc_mpeg4, outcaps) ; + gst_caps_unref(outcaps) ; + if(!link_ok) + { + g_warning("Failed to link glfilterapp to avenc_mpeg4!\n") ; + return -1 ; + } + if (!gst_element_link_many(avenc_mpeg4, avimux, filesink, NULL)) + { + g_print ("Failed to link one or more elements!\n"); + return -1; + } + + + /* run */ + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + + gst_message_parse_error (msg, &err, NULL); + g_print ("ERROR: %s\n", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return -1; + } + + g_main_loop_run (loop); + + /* clean up */ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return 0; + +} diff --git a/tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj b/tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj new file mode 100644 index 0000000..66df375 --- /dev/null +++ b/tests/examples/gl/generic/recordgraphic/recordgraphic.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/Makefile.am b/tests/examples/gl/gtk/Makefile.am new file mode 100644 index 0000000..c64cd4a --- /dev/null +++ b/tests/examples/gl/gtk/Makefile.am @@ -0,0 +1,12 @@ + +SUBDIRS = . gtkvideooverlay filternovideooverlay filtervideooverlay fxtest switchvideooverlay + +noinst_LTLIBRARIES = libgstgtkhelper.la + +libgstgtkhelper_la_SOURCES = gstgtk.c gstgtk.h +libgstgtkhelper_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GTK3_CFLAGS) + +if HAVE_WINDOW_COCOA +libgstgtkhelper_la_CFLAGS += -x objective-c +endif + diff --git a/tests/examples/gl/gtk/README b/tests/examples/gl/gtk/README new file mode 100644 index 0000000..76595c6 --- /dev/null +++ b/tests/examples/gl/gtk/README @@ -0,0 +1,27 @@ +--- Description of the GTK examples --- + +- gtkvideooverlay: +Show how to use the videooverlay interface through GTK. +It's possible to switch bettween GST_STATE through four buttons. + +-filternovideooverlay: +A more complex pipeline is switched bettween the GST states +without using the videooverlay interface. + +-filtervideooverlay: +A more complex pipeline is switched bettween the GST states. +using the videooverlay interface. + +-fxtest: +switch bettween effects of the gleffects filter. + +-pixbufdrop: +drag and drop a png file and overlay it using alpha channel. +It uses gloverlay filter. + +-switchvideooverlay: +change the videooverlay window while the stream is playing. + +--- How to build the GTK examples --- + +Using autotools or using tests/examples/gtk/gtk.sln diff --git a/tests/examples/gl/gtk/filternovideooverlay/.gitignore b/tests/examples/gl/gtk/filternovideooverlay/.gitignore new file mode 100644 index 0000000..f6e4162 --- /dev/null +++ b/tests/examples/gl/gtk/filternovideooverlay/.gitignore @@ -0,0 +1 @@ +filternovideooverlay diff --git a/tests/examples/gl/gtk/filternovideooverlay/Makefile.am b/tests/examples/gl/gtk/filternovideooverlay/Makefile.am new file mode 100644 index 0000000..61526c5 --- /dev/null +++ b/tests/examples/gl/gtk/filternovideooverlay/Makefile.am @@ -0,0 +1,18 @@ +noinst_PROGRAMS = filternovideooverlay + +filternovideooverlay_SOURCES = main.cpp + +filternovideooverlay_CXXFLAGS= \ + -I$(top_srcdir)/gst-libs \ + -I$(top_builddir)/gst-libs \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_CXXFLAGS) \ + $(GL_CFLAGS) \ + $(GTK3_CFLAGS) + +filternovideooverlay_LDADD= \ + $(GTK3_LIBS) \ + $(GST_PLUGINS_BASE_LIBS) \ + $(GST_LIBS) \ + $(GL_LIBS) + diff --git a/tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj b/tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj new file mode 100644 index 0000000..473587b --- /dev/null +++ b/tests/examples/gl/gtk/filternovideooverlay/filternovideooverlay.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/filternovideooverlay/main.cpp b/tests/examples/gl/gtk/filternovideooverlay/main.cpp new file mode 100644 index 0000000..5b9257c --- /dev/null +++ b/tests/examples/gl/gtk/filternovideooverlay/main.cpp @@ -0,0 +1,180 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * Copyright (C) 2014 Matthew Waters + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + + +static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline) +{ + g_print("End of stream\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + +static void button_state_null_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("GST_STATE_NULL\n"); +} + + +static void button_state_ready_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_READY); + g_print ("GST_STATE_READY\n"); +} + + +static void button_state_paused_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + g_print ("GST_STATE_PAUSED\n"); +} + + +static void button_state_playing_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("GST_STATE_PLAYING\n"); +} + + +static gchar* slider_fps_cb (GtkScale* scale, gdouble value, GstElement* pipeline) +{ + //change the video frame rate dynamically + return g_strdup_printf ("video framerate: %0.*g", gtk_scale_get_digits (scale), value); +} + + + +gint main (gint argc, gchar *argv[]) +{ + gtk_init (&argc, &argv); + gst_init (&argc, &argv); + + GstElement* pipeline = gst_pipeline_new ("pipeline"); + + //window to control the states + GtkWidget* window_control = gtk_window_new (GTK_WINDOW_TOPLEVEL); + GdkGeometry geometry; + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window_control), window_control, &geometry, GDK_HINT_MIN_SIZE); + gtk_window_set_resizable (GTK_WINDOW (window_control), FALSE); + gtk_window_move (GTK_WINDOW (window_control), 10, 10); + GtkWidget* table = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window_control), table); + + //control state null + GtkWidget* button_state_null = gtk_button_new_with_label ("GST_STATE_NULL"); + g_signal_connect (G_OBJECT (button_state_null), "clicked", + G_CALLBACK (button_state_null_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_null, 0, 0, 1, 1); + gtk_widget_show (button_state_null); + + //control state ready + GtkWidget* button_state_ready = gtk_button_new_with_label ("GST_STATE_READY"); + g_signal_connect (G_OBJECT (button_state_ready), "clicked", + G_CALLBACK (button_state_ready_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_ready, 0, 1, 1, 1); + gtk_widget_show (button_state_ready); + + //control state paused + GtkWidget* button_state_paused = gtk_button_new_with_label ("GST_STATE_PAUSED"); + g_signal_connect (G_OBJECT (button_state_paused), "clicked", + G_CALLBACK (button_state_paused_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_paused, 0, 2, 1, 1); + gtk_widget_show (button_state_paused); + + //control state playing + GtkWidget* button_state_playing = gtk_button_new_with_label ("GST_STATE_PLAYING"); + g_signal_connect (G_OBJECT (button_state_playing), "clicked", + G_CALLBACK (button_state_playing_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_playing, 0, 3, 1, 1); + gtk_widget_show (button_state_playing); + + //change framerate + GtkWidget* slider_fps = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, + 1, 30, 2); + g_signal_connect (G_OBJECT (slider_fps), "format-value", + G_CALLBACK (slider_fps_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), slider_fps, 1, 0, 1, 3); + gtk_widget_show (slider_fps); + + gtk_widget_show (table); + gtk_widget_show (window_control); + + GstElement* videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); + GstElement* glfilterlaplacian = gst_element_factory_make ("glfilterblur", "glfilterblur"); + GstElement* glfiltercube = gst_element_factory_make ("glfiltercube", "glfiltercube"); + GstElement* videosink = gst_element_factory_make ("glimagesink", "glimagesink"); + + GstCaps *caps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 640, + "height", G_TYPE_INT, 480, + "framerate", GST_TYPE_FRACTION, 25, 1, + "format", G_TYPE_STRING, "YV12", + NULL) ; + + gst_bin_add_many (GST_BIN (pipeline), videosrc, glfiltercube, glfilterlaplacian, videosink, NULL); + + gboolean link_ok = gst_element_link_filtered(videosrc, glfiltercube, caps) ; + gst_caps_unref(caps) ; + if(!link_ok) + { + g_warning("Failed to link videosrc to glfiltercube!\n") ; + return -1; + } + + if(!gst_element_link_many(glfiltercube, glfilterlaplacian, videosink, NULL)) + { + g_warning("Failed to link glfiltercube to videosink!\n") ; + return -1; + } + + //set window id on this event + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), pipeline); + gst_object_unref (bus); + + //start + GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + return -1; + } + + gtk_main(); + + return 0; +} + diff --git a/tests/examples/gl/gtk/filtervideooverlay/.gitignore b/tests/examples/gl/gtk/filtervideooverlay/.gitignore new file mode 100644 index 0000000..c5e1611 --- /dev/null +++ b/tests/examples/gl/gtk/filtervideooverlay/.gitignore @@ -0,0 +1 @@ +filtervideooverlay diff --git a/tests/examples/gl/gtk/filtervideooverlay/Makefile.am b/tests/examples/gl/gtk/filtervideooverlay/Makefile.am new file mode 100644 index 0000000..4d7f129 --- /dev/null +++ b/tests/examples/gl/gtk/filtervideooverlay/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = filtervideooverlay + +filtervideooverlay_SOURCES = main.cpp + +filtervideooverlay_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \ + $(GL_CFLAGS) $(GTK3_CFLAGS) +filtervideooverlay_LDADD=../libgstgtkhelper.la \ + $(GTK3_LIBS) $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) + diff --git a/tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj b/tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj new file mode 100644 index 0000000..564daa9 --- /dev/null +++ b/tests/examples/gl/gtk/filtervideooverlay/filtervideooverlay.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/filtervideooverlay/main.cpp b/tests/examples/gl/gtk/filtervideooverlay/main.cpp new file mode 100644 index 0000000..8ca402d --- /dev/null +++ b/tests/examples/gl/gtk/filtervideooverlay/main.cpp @@ -0,0 +1,245 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include "../gstgtk.h" + + +static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, GtkWidget* widget) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_print ("setting window handle %p\n", widget); + + gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), widget); + + gst_message_unref (message); + + return GST_BUS_DROP; +} + + +static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline) +{ + g_print("End of stream\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + + +static gboolean expose_cb(GtkWidget* widget, cairo_t *cr, GstElement* videosink) +{ + gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink)); + return FALSE; +} + + +static void destroy_cb(GtkWidget* widget, GdkEvent* event, GstElement* pipeline) +{ + g_print("Close\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + + +static void button_state_null_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("GST_STATE_NULL\n"); +} + + +static void button_state_ready_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_READY); + g_print ("GST_STATE_READY\n"); +} + + +static void button_state_paused_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + g_print ("GST_STATE_PAUSED\n"); +} + + +static void button_state_playing_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("GST_STATE_PLAYING\n"); +} + + +static gchar* slider_fps_cb (GtkScale* scale, gdouble value, GstElement* pipeline) +{ + //change the video frame rate dynamically + return g_strdup_printf ("video framerate: %0.*g", gtk_scale_get_digits (scale), value); +} + + + +gint main (gint argc, gchar *argv[]) +{ + gtk_init (&argc, &argv); + gst_init (&argc, &argv); + + GstElement* pipeline = gst_pipeline_new ("pipeline"); + + //window that contains an area where the video is drawn + GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request (window, 640, 480); + gtk_window_move (GTK_WINDOW (window), 300, 10); + gtk_window_set_title (GTK_WINDOW (window), "glimagesink implement the gstvideooverlay interface"); + GdkGeometry geometry; + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window), window, &geometry, GDK_HINT_MIN_SIZE); + + //window to control the states + GtkWidget* window_control = gtk_window_new (GTK_WINDOW_TOPLEVEL); + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window_control), window_control, &geometry, GDK_HINT_MIN_SIZE); + gtk_window_set_resizable (GTK_WINDOW (window_control), FALSE); + gtk_window_move (GTK_WINDOW (window_control), 10, 10); + GtkWidget* grid = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window_control), grid); + + //control state null + GtkWidget* button_state_null = gtk_button_new_with_label ("GST_STATE_NULL"); + g_signal_connect (G_OBJECT (button_state_null), "clicked", + G_CALLBACK (button_state_null_cb), pipeline); + gtk_grid_attach (GTK_GRID (grid), button_state_null, 0, 1, 1, 1); + gtk_widget_show (button_state_null); + + //control state ready + GtkWidget* button_state_ready = gtk_button_new_with_label ("GST_STATE_READY"); + g_signal_connect (G_OBJECT (button_state_ready), "clicked", + G_CALLBACK (button_state_ready_cb), pipeline); + gtk_grid_attach (GTK_GRID (grid), button_state_ready, 0, 2, 1, 1); + gtk_widget_show (button_state_ready); + + //control state paused + GtkWidget* button_state_paused = gtk_button_new_with_label ("GST_STATE_PAUSED"); + g_signal_connect (G_OBJECT (button_state_paused), "clicked", + G_CALLBACK (button_state_paused_cb), pipeline); + gtk_grid_attach (GTK_GRID (grid), button_state_paused, 0, 3, 1, 1); + gtk_widget_show (button_state_paused); + + //control state playing + GtkWidget* button_state_playing = gtk_button_new_with_label ("GST_STATE_PLAYING"); + g_signal_connect (G_OBJECT (button_state_playing), "clicked", + G_CALLBACK (button_state_playing_cb), pipeline); + gtk_grid_attach (GTK_GRID (grid), button_state_playing, 0, 4, 1, 1); + gtk_widget_show (button_state_playing); + + //change framerate + GtkWidget* slider_fps = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, 1, 30, 2); + g_signal_connect (G_OBJECT (slider_fps), "format-value", + G_CALLBACK (slider_fps_cb), pipeline); + gtk_grid_attach (GTK_GRID (grid), slider_fps, 1, 0, 1, 5); + gtk_widget_show (slider_fps); + + gtk_widget_show (grid); + gtk_widget_show (window_control); + + //configure the pipeline + g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(destroy_cb), pipeline); + + GstElement* videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); + GstElement* glfiltercube = gst_element_factory_make ("glfiltercube", "glfiltercube"); + GstElement* glfilterlaplacian = gst_element_factory_make ("glfilterlaplacian", "glfilterlaplacian"); + GstElement* videosink = gst_element_factory_make ("glimagesink", "glimagesink"); + + GstCaps *caps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 640, + "height", G_TYPE_INT, 480, + "framerate", GST_TYPE_FRACTION, 25, 1, + "format", G_TYPE_STRING, "AYUV", + NULL) ; + + gst_bin_add_many (GST_BIN (pipeline), videosrc, glfiltercube, glfilterlaplacian, videosink, NULL); + + gboolean link_ok = gst_element_link_filtered(videosrc, glfiltercube, caps) ; + gst_caps_unref(caps) ; + if(!link_ok) + { + g_warning("Failed to link videosrc to glfiltercube!\n") ; + return -1; + } + + if(!gst_element_link_many(glfiltercube, glfilterlaplacian, videosink, NULL)) + { + g_warning("Failed to link glfiltercube to videosink!\n") ; + return -1; + } + + //area where the video is drawn + GtkWidget* area = gtk_drawing_area_new(); + gtk_container_add (GTK_CONTAINER (window), area); + + gtk_widget_realize(area); + + //set window id on this event + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, area, NULL); + gst_bus_add_signal_watch (bus); + g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), pipeline); + gst_object_unref (bus); + + //needed when being in GST_STATE_READY, GST_STATE_PAUSED + //or resizing/obscuring the window + g_signal_connect(area, "draw", G_CALLBACK(expose_cb), videosink); + + //start + GstStateChangeReturn ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + g_print ("Failed to start up pipeline!\n"); + return -1; + } + + gtk_widget_show_all (window); + + gtk_main(); + + return 0; +} + diff --git a/tests/examples/gl/gtk/fxtest/.gitignore b/tests/examples/gl/gtk/fxtest/.gitignore new file mode 100644 index 0000000..c355697 --- /dev/null +++ b/tests/examples/gl/gtk/fxtest/.gitignore @@ -0,0 +1,2 @@ +fxtest +pixbufdrop diff --git a/tests/examples/gl/gtk/fxtest/Makefile.am b/tests/examples/gl/gtk/fxtest/Makefile.am new file mode 100644 index 0000000..c5e5d1a --- /dev/null +++ b/tests/examples/gl/gtk/fxtest/Makefile.am @@ -0,0 +1,18 @@ +noinst_PROGRAMS = fxtest +noinst_PROGRAMS += pixbufdrop + +fxtest_SOURCES = fxtest.c + +fxtest_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) $(GTK3_CFLAGS) +fxtest_LDADD=../libgstgtkhelper.la \ + $(GTK3_LIBS) $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) + +pixbufdrop_SOURCES = pixbufdrop.c + +pixbufdrop_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) $(GTK3_CFLAGS) +pixbufdrop_LDADD=../libgstgtkhelper.la \ + $(GTK3_LIBS) $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) diff --git a/tests/examples/gl/gtk/fxtest/fxtest.c b/tests/examples/gl/gtk/fxtest/fxtest.c new file mode 100644 index 0000000..a9b41c1 --- /dev/null +++ b/tests/examples/gl/gtk/fxtest/fxtest.c @@ -0,0 +1,262 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Filippo Argiolas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include +#include +#include + +#include "../gstgtk.h" + +#include + + +/* TODO: use video overlay in the proper way (like suggested in docs, see gtkvideooverlay example) */ +static gboolean +expose_cb (GtkWidget * widget, gpointer data) +{ + GstVideoOverlay *overlay = + GST_VIDEO_OVERLAY (gst_bin_get_by_interface (GST_BIN (data), + GST_TYPE_VIDEO_OVERLAY)); + + gst_video_overlay_set_gtk_window (overlay, widget); + + return FALSE; +} + +static void +destroy_cb (GtkWidget * widget, GdkEvent * event, GstElement * pipeline) +{ + g_message ("destroy callback"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + gtk_main_quit (); +} + +static gboolean +apply_fx (GtkWidget * widget, gpointer data) +{ + gchar *fx; + GEnumClass *p_class; + +/* heeeellppppp!! */ + p_class = + G_PARAM_SPEC_ENUM (g_object_class_find_property (G_OBJECT_GET_CLASS + (G_OBJECT (data)), "effect") + )->enum_class; + + fx = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget)); + g_print ("setting: %s - %s\n", fx, g_enum_get_value_by_nick (p_class, + fx)->value_name); + g_object_set (G_OBJECT (data), "effect", g_enum_get_value_by_nick (p_class, + fx)->value, NULL); + return FALSE; +} + +static gboolean +play_cb (GtkWidget * widget, gpointer data) +{ + g_message ("playing"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_PLAYING); + return FALSE; +} + +static gboolean +null_cb (GtkWidget * widget, gpointer data) +{ + g_message ("nulling"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_NULL); + return FALSE; +} + +static gboolean +ready_cb (GtkWidget * widget, gpointer data) +{ + g_message ("readying"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_READY); + return FALSE; +} + +static gboolean +pause_cb (GtkWidget * widget, gpointer data) +{ + g_message ("pausing"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_PAUSED); + return FALSE; +} + +gint +main (gint argc, gchar * argv[]) +{ + GstStateChangeReturn ret; + GstElement *pipeline; + GstElement *filter, *sink; + GstElement *sourcebin; + GError *error = NULL; + + GtkWidget *window; + GtkWidget *screen; + GtkWidget *vbox, *combo; + GtkWidget *hbox; + GtkWidget *play, *pause, *null, *ready; + + gchar **source_desc_array = NULL; + gchar *source_desc = NULL; + + GOptionContext *context; + GOptionEntry options[] = { + {"source-bin", 's', 0, G_OPTION_ARG_STRING_ARRAY, &source_desc_array, + "Use a custom source bin description (gst-launch style)", NULL} + , + {NULL} + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, options, NULL); + g_option_context_add_group (context, gst_init_get_option_group ()); + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_print ("Inizialization error: %s\n", GST_STR_NULL (error->message)); + return -1; + } + g_option_context_free (context); + + if (source_desc_array != NULL) { + source_desc = g_strjoinv (" ", source_desc_array); + g_strfreev (source_desc_array); + } + if (source_desc == NULL) { + source_desc = + g_strdup + ("videotestsrc ! video/x-raw, width=352, height=288 ! identity"); + } + + sourcebin = + gst_parse_bin_from_description (g_strdup (source_desc), TRUE, &error); + g_free (source_desc); + if (error) { + g_print ("Error while parsing source bin description: %s\n", + GST_STR_NULL (error->message)); + return -1; + } + + g_set_application_name ("gst-gl-effects test app"); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width (GTK_CONTAINER (window), 3); + + pipeline = gst_pipeline_new ("pipeline"); + + filter = gst_element_factory_make ("gleffects", "flt"); + sink = gst_element_factory_make ("glimagesink", "glsink"); + + gst_bin_add_many (GST_BIN (pipeline), sourcebin, filter, sink, NULL); + + if (!gst_element_link_many (sourcebin, filter, sink, NULL)) { + g_print ("Failed to link one or more elements!\n"); + return -1; + } + + g_signal_connect (G_OBJECT (window), "delete-event", + G_CALLBACK (destroy_cb), pipeline); + g_signal_connect (G_OBJECT (window), "destroy-event", + G_CALLBACK (destroy_cb), pipeline); + + screen = gtk_drawing_area_new (); + + gtk_widget_set_size_request (screen, 640, 480); // 500 x 376 + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + + gtk_box_pack_start (GTK_BOX (vbox), screen, TRUE, TRUE, 0); + + combo = gtk_combo_box_text_new (); + + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "identity"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "mirror"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "squeeze"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "stretch"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "fisheye"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "twirl"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "bulge"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "tunnel"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "square"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "heat"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "xpro"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "lumaxpro"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "sepia"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "xray"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "sin"); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "glow"); + + g_signal_connect (G_OBJECT (combo), "changed", G_CALLBACK (apply_fx), filter); + + gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, FALSE, 0); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + + play = gtk_button_new_with_label ("PLAY"); + + g_signal_connect (G_OBJECT (play), "clicked", G_CALLBACK (play_cb), pipeline); + + pause = gtk_button_new_with_label ("PAUSE"); + + g_signal_connect (G_OBJECT (pause), "clicked", + G_CALLBACK (pause_cb), pipeline); + + null = gtk_button_new_with_label ("NULL"); + + g_signal_connect (G_OBJECT (null), "clicked", G_CALLBACK (null_cb), pipeline); + + ready = gtk_button_new_with_label ("READY"); + + g_signal_connect (G_OBJECT (ready), "clicked", + G_CALLBACK (ready_cb), pipeline); + + gtk_box_pack_start (GTK_BOX (hbox), null, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), ready, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), play, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), pause, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + gtk_container_add (GTK_CONTAINER (window), vbox); + + g_signal_connect (screen, "realize", G_CALLBACK (expose_cb), pipeline); + + ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) { + g_print ("Failed to start up pipeline!\n"); + return -1; + } + + gtk_widget_show_all (GTK_WIDGET (window)); + + gtk_main (); + + return 0; +} diff --git a/tests/examples/gl/gtk/fxtest/fxtest.vcproj b/tests/examples/gl/gtk/fxtest/fxtest.vcproj new file mode 100644 index 0000000..05a2de0 --- /dev/null +++ b/tests/examples/gl/gtk/fxtest/fxtest.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/fxtest/pixbufdrop.c b/tests/examples/gl/gtk/fxtest/pixbufdrop.c new file mode 100644 index 0000000..4b26c3e --- /dev/null +++ b/tests/examples/gl/gtk/fxtest/pixbufdrop.c @@ -0,0 +1,325 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Filippo Argiolas + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define GLIB_DISABLE_DEPRECATION_WARNINGS + +#include +#include +#include +#include + +#include "../gstgtk.h" + +#include + +static gint delay = 0; +static gint saveddelay = 0; +static gint method = 1; + +struct _SourceData +{ + gpointer data; + gpointer nick; + gpointer value; +}; +typedef struct _SourceData SourceData; + +static GstBusSyncReply +create_window (GstBus * bus, GstMessage * message, GtkWidget * widget) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC + (message)), widget); + + gst_message_unref (message); + + return GST_BUS_DROP; +} + +static void +message_cb (GstBus * bus, GstMessage * message, GstElement * pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + gtk_main_quit (); +} + +static gboolean +expose_cb (GtkWidget * widget, cairo_t * cr, GstElement * videosink) +{ + gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink)); + return FALSE; +} + +static void +destroy_cb (GtkWidget * widget, GdkEvent * event, GstElement * pipeline) +{ + g_message ("destroy callback"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + gtk_main_quit (); +} + +static gboolean +play_cb (GtkWidget * widget, gpointer data) +{ + g_message ("playing"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_PLAYING); + return FALSE; +} + +static gboolean +null_cb (GtkWidget * widget, gpointer data) +{ + g_message ("nulling"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_NULL); + return FALSE; +} + +static gboolean +ready_cb (GtkWidget * widget, gpointer data) +{ + g_message ("readying"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_READY); + return FALSE; +} + +static gboolean +pause_cb (GtkWidget * widget, gpointer data) +{ + g_message ("pausing"); + gst_element_set_state (GST_ELEMENT (data), GST_STATE_PAUSED); + return FALSE; +} + +static gboolean +set_location_delayed (gpointer data) +{ + SourceData *sdata = (SourceData *) data; + delay--; + g_print ("%d\n", delay); + if (delay > 0) { + return TRUE; + } + g_object_set (G_OBJECT (sdata->data), sdata->nick, sdata->value, NULL); + delay = saveddelay; + return FALSE; +} + +static void +on_drag_data_received (GtkWidget * widget, + GdkDragContext * context, int x, int y, + GtkSelectionData * seldata, guint inf, guint time, gpointer data) +{ + SourceData *userdata = g_new0 (SourceData, 1); +#ifdef G_OS_WIN32 + gchar *filename = + g_filename_from_uri ((const gchar *) seldata->data, NULL, NULL); +#else + GdkPixbufFormat *format; + gchar **uris = gtk_selection_data_get_uris (seldata); + gchar *filename = NULL; + + g_return_if_fail (uris != NULL); + filename = g_filename_from_uri (uris[0], NULL, NULL); + g_return_if_fail (filename != NULL); + format = gdk_pixbuf_get_file_info (filename, NULL, NULL); + g_return_if_fail (format); + g_print ("received %s image: %s\n", filename, + gdk_pixbuf_format_get_name (format)); +#endif + + userdata->nick = (gchar *) "location"; + userdata->value = g_strdup (filename); + userdata->data = data; + saveddelay = delay; + if (delay > 0) { + g_print ("%d\n", delay); + g_timeout_add_seconds (1, set_location_delayed, userdata); + } else + g_object_set (G_OBJECT (userdata->data), userdata->nick, userdata->value, + NULL); + g_free (filename); +} + + +gint +main (gint argc, gchar * argv[]) +{ + GstElement *pipeline; + GstElement *filter, *sink; + GstElement *sourcebin; + GstBus *bus; + GError *error = NULL; + + GtkWidget *window; + GtkWidget *screen; + GtkWidget *vbox; + GtkWidget *hbox; + GtkWidget *play, *pause, *null, *ready; + + gchar **source_desc_array = NULL; + gchar *source_desc = NULL; + + GOptionContext *context; + GOptionEntry options[] = { + {"source-bin", 's', 0, G_OPTION_ARG_STRING_ARRAY, &source_desc_array, + "Use a custom source bin description (gst-launch style)", NULL} + , + {"method", 'm', 0, G_OPTION_ARG_INT, &method, + "1 for gstdifferencematte, 2 for gloverlay", "M"} + , + {"delay", 'd', 0, G_OPTION_ARG_INT, &delay, + "Wait N seconds before to send the image to gstreamer (useful with differencematte)", + "N"} + , + {NULL} + }; + + context = g_option_context_new (NULL); + g_option_context_add_main_entries (context, options, NULL); + g_option_context_add_group (context, gst_init_get_option_group ()); + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_print ("Inizialization error: %s\n", GST_STR_NULL (error->message)); + return -1; + } + g_option_context_free (context); + + if (source_desc_array != NULL) { + source_desc = g_strjoinv (" ", source_desc_array); + g_strfreev (source_desc_array); + } + if (source_desc == NULL) { + source_desc = + g_strdup + ("videotestsrc ! video/x-raw, width=352, height=288 ! identity"); + } + + sourcebin = + gst_parse_bin_from_description (g_strdup (source_desc), TRUE, &error); + g_free (source_desc); + if (error) { + g_print ("Error while parsing source bin description: %s\n", + GST_STR_NULL (error->message)); + return -1; + } + + g_set_application_name ("gst-gl-effects test app"); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_container_set_border_width (GTK_CONTAINER (window), 3); + + pipeline = gst_pipeline_new ("pipeline"); + + if (method == 2) { + filter = gst_element_factory_make ("gloverlay", "flt"); + } else { + filter = gst_element_factory_make ("gldifferencematte", "flt"); + } + sink = gst_element_factory_make ("glimagesink", "glsink"); + + gst_bin_add_many (GST_BIN (pipeline), sourcebin, filter, sink, NULL); + + if (!gst_element_link_many (sourcebin, filter, sink, NULL)) { + g_print ("Failed to link one or more elements!\n"); + return -1; + } + + g_signal_connect (G_OBJECT (window), "delete-event", + G_CALLBACK (destroy_cb), pipeline); + g_signal_connect (G_OBJECT (window), "destroy-event", + G_CALLBACK (destroy_cb), pipeline); + + screen = gtk_drawing_area_new (); + + gtk_widget_set_size_request (screen, 640, 480); // 500 x 376 + + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); + + gtk_box_pack_start (GTK_BOX (vbox), screen, TRUE, TRUE, 0); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + + play = gtk_button_new_with_label ("PLAY"); + + g_signal_connect (G_OBJECT (play), "clicked", G_CALLBACK (play_cb), pipeline); + + pause = gtk_button_new_with_label ("PAUSE"); + + g_signal_connect (G_OBJECT (pause), "clicked", + G_CALLBACK (pause_cb), pipeline); + + null = gtk_button_new_with_label ("NULL"); + + g_signal_connect (G_OBJECT (null), "clicked", G_CALLBACK (null_cb), pipeline); + + ready = gtk_button_new_with_label ("READY"); + + g_signal_connect (G_OBJECT (ready), "clicked", + G_CALLBACK (ready_cb), pipeline); + + gtk_box_pack_start (GTK_BOX (hbox), null, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), ready, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), play, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), pause, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + + gtk_container_add (GTK_CONTAINER (window), vbox); + + gtk_widget_realize (screen); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, screen, + NULL); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message::error", G_CALLBACK (message_cb), pipeline); + g_signal_connect (bus, "message::warning", G_CALLBACK (message_cb), pipeline); + g_signal_connect (bus, "message::eos", G_CALLBACK (message_cb), pipeline); + gst_object_unref (bus); + g_signal_connect (screen, "draw", G_CALLBACK (expose_cb), sink); + + gtk_drag_dest_set (screen, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); + gtk_drag_dest_add_uri_targets (screen); + + g_signal_connect (screen, "drag-data-received", + G_CALLBACK (on_drag_data_received), filter); + + gtk_widget_show_all (GTK_WIDGET (window)); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + gtk_main (); + + return 0; +} diff --git a/tests/examples/gl/gtk/gstgtk.c b/tests/examples/gl/gtk/gstgtk.c new file mode 100644 index 0000000..b13304c --- /dev/null +++ b/tests/examples/gl/gtk/gstgtk.c @@ -0,0 +1,71 @@ +/* + * GStreamer + * Copyright (C) 2009 David A. Schleef + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstgtk.h" + +#if GST_GL_HAVE_WINDOW_WIN32 && defined(GDK_WINDOWING_WIN32) +#include +#endif +#if GST_GL_HAVE_WINDOW_X11 && defined(GDK_WINDOWING_X11) +#include +#include +#endif +#if GST_GL_HAVE_WINDOW_COCOA && defined(GDK_WINDOWING_QUARTZ) +#include +#endif + + +void +gst_video_overlay_set_gtk_window (GstVideoOverlay * videooverlay, + GtkWidget * widget) +{ + GdkWindow *window; + GdkDisplay *display; + const gchar *user_choice = g_getenv ("GST_GL_WINDOW"); + + window = gtk_widget_get_window (widget); + display = gdk_window_get_display (window); + +#if GST_GL_HAVE_WINDOW_WIN32 && defined(GDK_WINDOWING_WIN32) + if (GDK_IS_WIN32_DISPLAY (display) && (!user_choice + || g_strcmp0 (user_choice, "win32") == 0)) { + gst_video_overlay_set_window_handle (videooverlay, + (guintptr) GDK_WINDOW_HWND (window)); + } else +#endif +#if GST_GL_HAVE_WINDOW_COCOA && defined(GDK_WINDOWING_QUARTZ) + if (GDK_IS_QUARTZ_DISPLAY (display) && (!user_choice + || g_strcmp0 (user_choice, "cocoa") == 0)) { + gst_video_overlay_set_window_handle (videooverlay, (guintptr) + gdk_quartz_window_get_nswindow (window)); + } else +#endif +#if GST_GL_HAVE_WINDOW_X11 && defined(GDK_WINDOWING_X11) + if (GDK_IS_X11_DISPLAY (display) && (!user_choice + || g_strcmp0 (user_choice, "x11") == 0)) { + gst_video_overlay_set_window_handle (videooverlay, GDK_WINDOW_XID (window)); + } else +#endif + g_error ("Unsupported Gtk+ backend"); +} diff --git a/tests/examples/gl/gtk/gstgtk.h b/tests/examples/gl/gtk/gstgtk.h new file mode 100644 index 0000000..4ef147f --- /dev/null +++ b/tests/examples/gl/gtk/gstgtk.h @@ -0,0 +1,34 @@ +/* + * GStreamer + * Copyright (C) 2009 David A. Schleef + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_GTK_H__ +#define __GST_GTK_H__ + +#include +#include + +G_BEGIN_DECLS + +void gst_video_overlay_set_gtk_window (GstVideoOverlay *videooverlay, GtkWidget *window); + +G_END_DECLS + +#endif + diff --git a/tests/examples/gl/gtk/gtk.sln b/tests/examples/gl/gtk/gtk.sln new file mode 100644 index 0000000..5bf66dc --- /dev/null +++ b/tests/examples/gl/gtk/gtk.sln @@ -0,0 +1,50 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "filtervideooverlay", "filtervideooverlay\filtervideooverlay.vcproj", "{F9CC027E-CC9F-4B34-AA8F-58852EC32CD0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtkvideooverlay", "gtkvideooverlay\gtkvideooverlay.vcproj", "{E83070C2-58E4-48AE-AEB3-A4580EDE1212}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fxtest", "fxtest\fxtest.vcproj", "{59075FDD-68CD-4F1A-948B-46D142800798}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pixbufdrop", "pixbufdrop\pixbufdrop.vcproj", "{09F68B62-1D4C-4C24-A6AD-AA76A9F3237C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "filternovideooverlay", "filternovideooverlay\filternovideooverlay.vcproj", "{F41F3034-3E0B-4630-8D1E-35E14C606863}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "switchvideooverlay", "switchvideooverlay\switchvideooverlay.vcproj", "{BA78B4B4-3268-483E-9676-911E29FD2C69}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F9CC027E-CC9F-4B34-AA8F-58852EC32CD0}.Debug|Win32.ActiveCfg = Debug|Win32 + {F9CC027E-CC9F-4B34-AA8F-58852EC32CD0}.Debug|Win32.Build.0 = Debug|Win32 + {F9CC027E-CC9F-4B34-AA8F-58852EC32CD0}.Release|Win32.ActiveCfg = Release|Win32 + {F9CC027E-CC9F-4B34-AA8F-58852EC32CD0}.Release|Win32.Build.0 = Release|Win32 + {E83070C2-58E4-48AE-AEB3-A4580EDE1212}.Debug|Win32.ActiveCfg = Debug|Win32 + {E83070C2-58E4-48AE-AEB3-A4580EDE1212}.Debug|Win32.Build.0 = Debug|Win32 + {E83070C2-58E4-48AE-AEB3-A4580EDE1212}.Release|Win32.ActiveCfg = Release|Win32 + {E83070C2-58E4-48AE-AEB3-A4580EDE1212}.Release|Win32.Build.0 = Release|Win32 + {59075FDD-68CD-4F1A-948B-46D142800798}.Debug|Win32.ActiveCfg = Debug|Win32 + {59075FDD-68CD-4F1A-948B-46D142800798}.Debug|Win32.Build.0 = Debug|Win32 + {59075FDD-68CD-4F1A-948B-46D142800798}.Release|Win32.ActiveCfg = Release|Win32 + {59075FDD-68CD-4F1A-948B-46D142800798}.Release|Win32.Build.0 = Release|Win32 + {09F68B62-1D4C-4C24-A6AD-AA76A9F3237C}.Debug|Win32.ActiveCfg = Debug|Win32 + {09F68B62-1D4C-4C24-A6AD-AA76A9F3237C}.Debug|Win32.Build.0 = Debug|Win32 + {09F68B62-1D4C-4C24-A6AD-AA76A9F3237C}.Release|Win32.ActiveCfg = Release|Win32 + {09F68B62-1D4C-4C24-A6AD-AA76A9F3237C}.Release|Win32.Build.0 = Release|Win32 + {F41F3034-3E0B-4630-8D1E-35E14C606863}.Debug|Win32.ActiveCfg = Debug|Win32 + {F41F3034-3E0B-4630-8D1E-35E14C606863}.Debug|Win32.Build.0 = Debug|Win32 + {F41F3034-3E0B-4630-8D1E-35E14C606863}.Release|Win32.ActiveCfg = Release|Win32 + {F41F3034-3E0B-4630-8D1E-35E14C606863}.Release|Win32.Build.0 = Release|Win32 + {BA78B4B4-3268-483E-9676-911E29FD2C69}.Debug|Win32.ActiveCfg = Debug|Win32 + {BA78B4B4-3268-483E-9676-911E29FD2C69}.Debug|Win32.Build.0 = Debug|Win32 + {BA78B4B4-3268-483E-9676-911E29FD2C69}.Release|Win32.ActiveCfg = Release|Win32 + {BA78B4B4-3268-483E-9676-911E29FD2C69}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/gtk/gtkvideooverlay/.gitignore b/tests/examples/gl/gtk/gtkvideooverlay/.gitignore new file mode 100644 index 0000000..e4c3e3f --- /dev/null +++ b/tests/examples/gl/gtk/gtkvideooverlay/.gitignore @@ -0,0 +1 @@ +gtkvideooverlay diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am b/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am new file mode 100644 index 0000000..c9dba8a --- /dev/null +++ b/tests/examples/gl/gtk/gtkvideooverlay/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = gtkvideooverlay + +gtkvideooverlay_SOURCES = main.cpp + +gtkvideooverlay_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \ + $(GL_CFLAGS) $(GTK3_CFLAGS) +gtkvideooverlay_LDADD=../libgstgtkhelper.la \ + $(GTK3_LIBS) $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) + diff --git a/tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj b/tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj new file mode 100644 index 0000000..f818fc6 --- /dev/null +++ b/tests/examples/gl/gtk/gtkvideooverlay/gtkvideooverlay.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/gtkvideooverlay/main.cpp b/tests/examples/gl/gtk/gtkvideooverlay/main.cpp new file mode 100644 index 0000000..7024cfc --- /dev/null +++ b/tests/examples/gl/gtk/gtkvideooverlay/main.cpp @@ -0,0 +1,230 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include "../gstgtk.h" + + +static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, GtkWidget* widget) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_print ("setting window handle\n"); + + //do not call gdk_window_ensure_native for the first time here because + //we are in a different thread than the main thread + //(and the main thread the onne) + gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), widget); + + gst_message_unref (message); + + return GST_BUS_DROP; +} + + +static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline) +{ + g_print("End of stream\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + +static gboolean draw_cb(GtkWidget* widget, cairo_t *cr, GstElement* videosink) +{ + g_print ("draw_cb\n"); + gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink)); + return FALSE; +} + + +static void destroy_cb(GtkWidget* widget, GdkEvent* event, GstElement* pipeline) +{ + g_print("Close\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + + +static void button_state_null_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("GST_STATE_NULL\n"); +} + + +static void button_state_ready_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_READY); + g_print ("GST_STATE_READY\n"); +} + + +static void button_state_paused_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + g_print ("GST_STATE_PAUSED\n"); +} + + +static void button_state_playing_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("GST_STATE_PLAYING\n"); +} + + +static gchar* slider_fps_cb (GtkScale* scale, gdouble value, GstElement* pipeline) +{ + //change the video frame rate dynamically + return g_strdup_printf ("video framerate: %0.*g", gtk_scale_get_digits (scale), value); +} + + + +gint main (gint argc, gchar *argv[]) +{ + GtkWidget *area; + gst_init (&argc, &argv); + gtk_init (&argc, &argv); + + GstElement* pipeline = gst_pipeline_new ("pipeline"); + GstElement* videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); + GstElement* videosink = gst_element_factory_make ("glimagesink", "glimagesink"); + + gst_bin_add_many (GST_BIN (pipeline), videosrc, videosink, NULL); + + gboolean link_ok = gst_element_link_many(videosrc, videosink, NULL) ; + if(!link_ok) + { + g_warning("Failed to link an element!\n") ; + return -1; + } + + //set window id on this event + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), pipeline); + + gst_element_set_state(pipeline, GST_STATE_READY); + + area = gtk_drawing_area_new(); + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, area, NULL); + gst_object_unref (bus); + + //window that contains an area where the video is drawn + GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request (window, 640, 480); + gtk_window_move (GTK_WINDOW (window), 300, 10); + gtk_window_set_title (GTK_WINDOW (window), "glimagesink implement the gstvideooverlay interface"); + GdkGeometry geometry; + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window), window, &geometry, GDK_HINT_MIN_SIZE); + + //window to control the states + GtkWidget* window_control = gtk_window_new (GTK_WINDOW_TOPLEVEL); + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window_control), window_control, &geometry, GDK_HINT_MIN_SIZE); + gtk_window_set_resizable (GTK_WINDOW (window_control), FALSE); + gtk_window_move (GTK_WINDOW (window_control), 10, 10); + GtkWidget* table = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window_control), table); + + //control state null + GtkWidget* button_state_null = gtk_button_new_with_label ("GST_STATE_NULL"); + g_signal_connect (G_OBJECT (button_state_null), "clicked", + G_CALLBACK (button_state_null_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_null, 0, 0, 1, 1); + gtk_widget_show (button_state_null); + + //control state ready + GtkWidget* button_state_ready = gtk_button_new_with_label ("GST_STATE_READY"); + g_signal_connect (G_OBJECT (button_state_ready), "clicked", + G_CALLBACK (button_state_ready_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_ready, 0, 1, 1, 1); + gtk_widget_show (button_state_ready); + + //control state paused + GtkWidget* button_state_paused = gtk_button_new_with_label ("GST_STATE_PAUSED"); + g_signal_connect (G_OBJECT (button_state_paused), "clicked", + G_CALLBACK (button_state_paused_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_paused, 0, 2, 1, 1); + gtk_widget_show (button_state_paused); + + //control state playing + GtkWidget* button_state_playing = gtk_button_new_with_label ("GST_STATE_PLAYING"); + g_signal_connect (G_OBJECT (button_state_playing), "clicked", + G_CALLBACK (button_state_playing_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_playing, 0, 3, 1, 1); + gtk_widget_show (button_state_playing); + + //change framerate + GtkWidget* slider_fps = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, + 1, 30, 2); + g_signal_connect (G_OBJECT (slider_fps), "format-value", + G_CALLBACK (slider_fps_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), slider_fps, 1, 0, 1, 4); + gtk_widget_show (slider_fps); + + gtk_widget_show (table); + gtk_widget_show (window_control); + + //configure the pipeline + g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(destroy_cb), pipeline); + + //area where the video is drawn + gtk_container_add (GTK_CONTAINER (window), area); + + gtk_widget_realize(area); + + //needed when being in GST_STATE_READY, GST_STATE_PAUSED + //or resizing/obscuring the window + g_signal_connect(area, "draw", G_CALLBACK(draw_cb), videosink); + + gtk_widget_show_all (window); + + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + gtk_main(); + + return 0; +} + diff --git a/tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj b/tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj new file mode 100644 index 0000000..d38ecc7 --- /dev/null +++ b/tests/examples/gl/gtk/pixbufdrop/pixbufdrop.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/gtk/switchvideooverlay/.gitignore b/tests/examples/gl/gtk/switchvideooverlay/.gitignore new file mode 100644 index 0000000..64c6de4 --- /dev/null +++ b/tests/examples/gl/gtk/switchvideooverlay/.gitignore @@ -0,0 +1 @@ +switchvideooverlay diff --git a/tests/examples/gl/gtk/switchvideooverlay/Makefile.am b/tests/examples/gl/gtk/switchvideooverlay/Makefile.am new file mode 100644 index 0000000..12e25e7 --- /dev/null +++ b/tests/examples/gl/gtk/switchvideooverlay/Makefile.am @@ -0,0 +1,10 @@ +noinst_PROGRAMS = switchvideooverlay + +switchvideooverlay_SOURCES = main.cpp + +switchvideooverlay_CXXFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CXXFLAGS) \ + $(GL_CFLAGS) $(GTK3_CFLAGS) +switchvideooverlay_LDADD=../libgstgtkhelper.la \ + $(GTK3_LIBS) $(GST_PLUGINS_GL_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \ + $(GL_LIBS) -lgstvideo-$(GST_API_VERSION) + diff --git a/tests/examples/gl/gtk/switchvideooverlay/main.cpp b/tests/examples/gl/gtk/switchvideooverlay/main.cpp new file mode 100644 index 0000000..440d5ce --- /dev/null +++ b/tests/examples/gl/gtk/switchvideooverlay/main.cpp @@ -0,0 +1,246 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include "../gstgtk.h" + + +static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, GtkWidget* widget) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + g_print ("setting window handle %p\n", widget); + + gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), widget); + + gst_message_unref (message); + + return GST_BUS_DROP; +} + + +static void end_stream_cb(GstBus* bus, GstMessage* message, GstElement* pipeline) +{ + g_print("End of stream\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + + +static gboolean expose_cb(GtkWidget* widget, cairo_t *cr, GstElement* videosink) +{ + g_print ("expose %p\n", widget); + g_print ("event mask: 0x%x, button_press 0x%x\n", gtk_widget_get_events (widget), GDK_BUTTON_PRESS_MASK); + gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink)); + return FALSE; +} + +static gboolean on_click_drawing_area(GtkWidget* widget, GdkEventButton* event, GstElement* videosink) +{ + g_print ("switch the drawing area %p\n", widget); + gst_video_overlay_set_gtk_window (GST_VIDEO_OVERLAY (videosink), widget); + gst_video_overlay_expose (GST_VIDEO_OVERLAY (videosink)); + return FALSE; +} + + +static void destroy_cb(GtkWidget* widget, GdkEvent* event, GstElement* pipeline) +{ + g_print("Close\n"); + + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref(pipeline); + + gtk_main_quit(); +} + + +static void button_state_null_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_NULL); + g_print ("GST_STATE_NULL\n"); +} + + +static void button_state_ready_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_READY); + g_print ("GST_STATE_READY\n"); +} + + +static void button_state_paused_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PAUSED); + g_print ("GST_STATE_PAUSED\n"); +} + + +static void button_state_playing_cb(GtkWidget* widget, GstElement* pipeline) +{ + gst_element_set_state (pipeline, GST_STATE_PLAYING); + g_print ("GST_STATE_PLAYING\n"); +} + +static void area_realize_cb(GtkWidget* widget, gpointer data) +{ + g_print ("realize %p\n", widget); + if (!gdk_window_ensure_native (gtk_widget_get_window (widget))) + g_error ("Failed to create native window!"); + + //avoid flickering when resizing or obscuring the main window + gtk_widget_set_app_paintable(widget, TRUE); + gtk_widget_set_double_buffered(widget, FALSE); +} + + +gint main (gint argc, gchar *argv[]) +{ + gtk_init (&argc, &argv); + gst_init (&argc, &argv); + + GstElement* pipeline = gst_pipeline_new ("pipeline"); + + //window that contains several ares where the video is drawn + GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request (window, 640, 240); + gtk_window_move (GTK_WINDOW (window), 300, 10); + gtk_window_set_title (GTK_WINDOW (window), "click on left, right or outside the main window to switch the drawing area"); + GdkGeometry geometry; + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window), window, &geometry, GDK_HINT_MIN_SIZE); + + //window to control the states + GtkWidget* window_control = gtk_window_new (GTK_WINDOW_TOPLEVEL); + geometry.min_width = 1; + geometry.min_height = 1; + geometry.max_width = -1; + geometry.max_height = -1; + gtk_window_set_geometry_hints (GTK_WINDOW (window_control), window_control, &geometry, GDK_HINT_MIN_SIZE); + gtk_window_set_resizable (GTK_WINDOW (window_control), FALSE); + gtk_window_move (GTK_WINDOW (window_control), 10, 10); + GtkWidget* table = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window_control), table); + + //control state null + GtkWidget* button_state_null = gtk_button_new_with_label ("GST_STATE_NULL"); + g_signal_connect (G_OBJECT (button_state_null), "clicked", + G_CALLBACK (button_state_null_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_null, 0, 0, 1, 1); + gtk_widget_show (button_state_null); + + //control state ready + GtkWidget* button_state_ready = gtk_button_new_with_label ("GST_STATE_READY"); + g_signal_connect (G_OBJECT (button_state_ready), "clicked", + G_CALLBACK (button_state_ready_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_ready, 0, 1, 1, 1); + gtk_widget_show (button_state_ready); + + //control state paused + GtkWidget* button_state_paused = gtk_button_new_with_label ("GST_STATE_PAUSED"); + g_signal_connect (G_OBJECT (button_state_paused), "clicked", + G_CALLBACK (button_state_paused_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_paused, 0, 2, 1, 1); + gtk_widget_show (button_state_paused); + + //control state playing + GtkWidget* button_state_playing = gtk_button_new_with_label ("GST_STATE_PLAYING"); + g_signal_connect (G_OBJECT (button_state_playing), "clicked", + G_CALLBACK (button_state_playing_cb), pipeline); + gtk_grid_attach (GTK_GRID (table), button_state_playing, 0, 3, 1, 1); + gtk_widget_show (button_state_playing); + + gtk_widget_show (table); + gtk_widget_show (window_control); + + //configure the pipeline + g_signal_connect(G_OBJECT(window), "delete-event", G_CALLBACK(destroy_cb), pipeline); + + GstElement* videosrc = gst_element_factory_make ("videotestsrc", "videotestsrc"); + GstElement* videosink = gst_element_factory_make ("glimagesink", "glimagesink"); + + gst_bin_add_many (GST_BIN (pipeline), videosrc, videosink, NULL); + + gboolean link_ok = gst_element_link_many(videosrc, videosink, NULL); + if(!link_ok) + { + g_warning("Failed to link videosrc to videosink!\n") ; + return -1; + } + + //areas where the video is drawn + GtkWidget* table_areas = gtk_grid_new (); + gtk_container_add (GTK_CONTAINER (window), table_areas); + GtkWidget* area_top_left = gtk_drawing_area_new(); + gtk_widget_add_events(area_top_left, GDK_BUTTON_PRESS_MASK); + gtk_widget_set_size_request (area_top_left, 320, 240); + gtk_grid_attach (GTK_GRID (table_areas), area_top_left, 0, 0, 1, 1); + GtkWidget* area_top_right = gtk_drawing_area_new(); + gtk_widget_add_events(area_top_right, GDK_BUTTON_PRESS_MASK); + gtk_widget_set_size_request (area_top_right, 320, 240); + gtk_grid_attach (GTK_GRID (table_areas), area_top_right, 1, 0, 1, 1); + + //set window id on this event + g_signal_connect(area_top_left, "realize", G_CALLBACK(area_realize_cb), NULL); + g_signal_connect(area_top_right, "realize", G_CALLBACK(area_realize_cb), NULL); + + gtk_widget_realize(area_top_left); + gtk_widget_realize(area_top_right); + + GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, area_top_right, NULL); + gst_bus_add_signal_watch (bus); + g_signal_connect(bus, "message::error", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::warning", G_CALLBACK(end_stream_cb), pipeline); + g_signal_connect(bus, "message::eos", G_CALLBACK(end_stream_cb), pipeline); + gst_object_unref (bus); + + //needed when being in GST_STATE_READY, GST_STATE_PAUSED + //or resizing/obscuring the window + g_signal_connect(area_top_left, "draw", G_CALLBACK(expose_cb), videosink); + g_signal_connect(area_top_right, "draw", G_CALLBACK(expose_cb), videosink); + + //switch the drawing area + g_signal_connect(area_top_left, "button-press-event", G_CALLBACK(on_click_drawing_area), videosink); + g_signal_connect(area_top_right, "button-press-event", G_CALLBACK(on_click_drawing_area), videosink); + + gtk_widget_show_all (window); + + gst_element_set_state(pipeline, GST_STATE_PLAYING); + + gtk_main(); + + return 0; +} + diff --git a/tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj b/tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj new file mode 100644 index 0000000..8e48bbe --- /dev/null +++ b/tests/examples/gl/gtk/switchvideooverlay/switchvideooverlay.vcproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/qt/Makefile.am b/tests/examples/gl/qt/Makefile.am new file mode 100644 index 0000000..629415b --- /dev/null +++ b/tests/examples/gl/qt/Makefile.am @@ -0,0 +1,2 @@ + +#SUBDIRS = videooverlay qglwidgetvideooverlay mousevideooverlay diff --git a/tests/examples/gl/qt/README b/tests/examples/gl/qt/README new file mode 100644 index 0000000..aa843d6 --- /dev/null +++ b/tests/examples/gl/qt/README @@ -0,0 +1,23 @@ +--- Description of the Qt examples --- + +- mousevideooverlay: +Show how to use the videooverlay interface through Qt. +The cube is rotating when moving the mouse (+ click maintained) + +- qglvideooverlay: +Show how to use the videooverlay interface through Qt. +The cube is rotating automatically into a QGLWidget + +- videovdieooverlay: +Show how to use the videooverlay interface through Qt. +The video is displayed as normal 2D scene. +The window is dynamically resized to have the same size as the original video. + +--- How to build the Qt examples --- + +sudo apt-get install g++ +sudo apt-get install libqt4-dev +cd qglvideooverlay +qmake +make +./debug/qglvideooverlay diff --git a/tests/examples/gl/qt/mousevideooverlay/gstthread.cpp b/tests/examples/gl/qt/mousevideooverlay/gstthread.cpp new file mode 100644 index 0000000..ce14a47 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/gstthread.cpp @@ -0,0 +1,67 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstthread.h" + +GstThread::GstThread(const WId winId, const QString videoLocation, QObject *parent): + QThread(parent), + m_winId(winId), + m_videoLocation(videoLocation) +{ +} + +GstThread::~GstThread() +{ +} + +void GstThread::exposeRequested() +{ + m_pipeline->exposeRequested(); +} + +void GstThread::onMouseMove() +{ + m_pipeline->rotateRequested(); +} + +void GstThread::show() +{ + emit showRequested(); +} + +void GstThread::stop() +{ + m_pipeline->stop(); +} + +void GstThread::run() +{ + m_pipeline = new Pipeline(m_winId, m_videoLocation); + connect(m_pipeline, SIGNAL(showRequested()), this, SLOT(show())); + m_pipeline->start(); //it runs the gmainloop on win32 + +#ifndef WIN32 + //works like the gmainloop on linux (GstEvent are handled) + connect(m_pipeline, SIGNAL(stopRequested()), this, SLOT(quit())); + exec(); +#endif + + m_pipeline->unconfigure(); +} diff --git a/tests/examples/gl/qt/mousevideooverlay/gstthread.h b/tests/examples/gl/qt/mousevideooverlay/gstthread.h new file mode 100644 index 0000000..74f1322 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/gstthread.h @@ -0,0 +1,56 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef GSTTHREAD_H +#define GSTTHREAD_H + +#include +#include + +#include "pipeline.h" + +class GstThread : public QThread +{ + Q_OBJECT + +public: + GstThread(const WId winId, const QString videoLocation, QObject *parent = 0); + ~GstThread(); + +public slots: + void exposeRequested(); + void onMouseMove(); + void show(); + void stop(); + +signals: + void showRequested(); + +protected: + void run(); + +private: + const WId m_winId; + const QString m_videoLocation; + Pipeline* m_pipeline; + +}; + +#endif diff --git a/tests/examples/gl/qt/mousevideooverlay/main.cpp b/tests/examples/gl/qt/mousevideooverlay/main.cpp new file mode 100644 index 0000000..0cec1b9 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/main.cpp @@ -0,0 +1,39 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include "qrenderer.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); + + QString videolcoation = QFileDialog::getOpenFileName(0, "Select a video file", + ".", "Format (*.avi *.mkv *.ogg *.asf *.mov)"); + + if (videolcoation.isEmpty()) + return -1; + + QRenderer w(videolcoation); + w.setWindowTitle("glimagesink implements the gstvideooverlay interface"); + + return a.exec(); +} diff --git a/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri new file mode 100644 index 0000000..75b23cd --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pri @@ -0,0 +1,10 @@ +#Header files +HEADERS += ./gstthread.h \ + ./pipeline.h \ + ./qrenderer.h + +#Source files +SOURCES += ./gstthread.cpp \ + ./main.cpp \ + ./pipeline.cpp \ + ./qrenderer.cpp diff --git a/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro new file mode 100644 index 0000000..efd69cd --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.pro @@ -0,0 +1,54 @@ +TEMPLATE = app +TARGET = mousevideooverlay +DESTDIR = ./debug +CONFIG += debug gui widget +DEFINES += UNICODE + +win32 { +DEFINES += WIN32 +INCLUDEPATH += ./GeneratedFiles \ + ./GeneratedFiles/Debug \ + C:/gstreamer/include \ + C:/gstreamer/include/libxml2 \ + C:/gstreamer/include/glib-2.0 \ + C:/gstreamer/lib/glib-2.0/include \ + C:/gstreamer/include/gstreamer-1.0 +LIBS += -L"C:/gstreamer/lib" \ + -L"C:/gstreamer/bin" \ + -lgstreamer-1.0 \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 \ + -lopengl32 \ + -lglu32 +} + +unix { +DEFINES += UNIX +INCLUDEPATH += GeneratedFiles \ + GeneratedFiles/Debug \ + /usr/include/gstreamer-1.0 \ + /usr/local/include/gstreamer-1.0 \ + /usr/include/glib-2.0 \ + /usr/lib/glib-2.0/include \ + /usr/include/libxml2 +LIBS += -lgstreamer-video \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 \ + -lGLU \ + -lGL +} + +DEPENDPATH += . +MOC_DIR += ./GeneratedFiles/debug +OBJECTS_DIR += debug +UI_DIR += ./GeneratedFiles +RCC_DIR += ./GeneratedFiles + +#Include file(s) +include(mousevideooverlay.pri) diff --git a/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln new file mode 100644 index 0000000..8d310d8 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mousevideooverlay", "mousevideooverlay.vcproj", "{E94F8CAA-628F-4872-8E73-AD56D34899CB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E94F8CAA-628F-4872-8E73-AD56D34899CB}.Debug|Win32.ActiveCfg = Debug|Win32 + {E94F8CAA-628F-4872-8E73-AD56D34899CB}.Debug|Win32.Build.0 = Debug|Win32 + {E94F8CAA-628F-4872-8E73-AD56D34899CB}.Release|Win32.ActiveCfg = Release|Win32 + {E94F8CAA-628F-4872-8E73-AD56D34899CB}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj new file mode 100644 index 0000000..e4b7b18 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/mousevideooverlay.vcproj @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/qt/mousevideooverlay/pipeline.cpp b/tests/examples/gl/qt/mousevideooverlay/pipeline.cpp new file mode 100644 index 0000000..9f8cc76 --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/pipeline.cpp @@ -0,0 +1,334 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include "pipeline.h" + +Pipeline::Pipeline(const WId id, const QString videoLocation): + m_winId(id), + m_videoLocation(videoLocation), + m_loop(NULL), + m_bus(NULL), + m_pipeline(NULL), + m_glimagesink(NULL) +{ + create(); +} + +Pipeline::~Pipeline() +{ +} + +void Pipeline::create() +{ + qDebug("Loading video: %s", m_videoLocation.toAscii().data()); + + gst_init (NULL, NULL); + +#ifdef WIN32 + m_loop = g_main_loop_new (NULL, FALSE); +#endif + m_pipeline = gst_pipeline_new ("pipeline"); + + m_bus = gst_pipeline_get_bus (GST_PIPELINE (m_pipeline)); + gst_bus_add_watch (m_bus, (GstBusFunc) bus_call, this); + gst_bus_set_sync_handler (m_bus, (GstBusSyncHandler) create_window, this); + gst_object_unref (m_bus); + + GstElement* videosrc = gst_element_factory_make ("filesrc", "filesrc0"); + GstElement* decodebin = gst_element_factory_make ("decodebin", "decodebin0"); + m_glimagesink = gst_element_factory_make ("glimagesink", "sink0"); + + if (!videosrc || !decodebin || !m_glimagesink ) + { + qDebug ("one element could not be found"); + return; + } + + g_object_set(G_OBJECT(videosrc), "num-buffers", 800, NULL); + g_object_set(G_OBJECT(videosrc), "location", m_videoLocation.toAscii().data(), NULL); + g_object_set(G_OBJECT(m_glimagesink), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(m_glimagesink), "client-draw-callback", drawCallback, NULL); + + gst_bin_add_many (GST_BIN (m_pipeline), videosrc, decodebin, m_glimagesink, NULL); + + gst_element_link_pads (videosrc, "src", decodebin, "sink"); + + g_signal_connect (decodebin, "new-decoded-pad", G_CALLBACK (cb_new_pad), this); +} + +void Pipeline::start() +{ + GstStateChangeReturn ret = gst_element_set_state (m_pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + qDebug ("Failed to start up pipeline!"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (m_bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + gst_message_parse_error (msg, &err, NULL); + qDebug ("ERROR: %s", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return; + } + +#ifdef WIN32 + g_main_loop_run(m_loop); +#endif +} + +//we don't want a thread safe stop in this example +void Pipeline::stop() +{ +#ifdef WIN32 + g_main_loop_quit(m_loop); +#else + emit stopRequested(); +#endif +} + +void Pipeline::unconfigure() const +{ + gst_element_set_state (m_pipeline, GST_STATE_NULL); + gst_object_unref (m_pipeline); +} + +void Pipeline::show() +{ + emit showRequested(); +} + +//redraw the current frame in the drawable +void Pipeline::doExpose() const +{ + if (m_pipeline && m_glimagesink) + gst_video_overlay_expose (GST_VIDEO_OVERLAY (m_glimagesink)); +} + +//post message to g_main_loop in order to call expose +//in the gt thread +void Pipeline::exposeRequested() +{ + g_idle_add(cb_expose, this); +} + +//rotate the cube +void Pipeline::doRotate() +{ + m_xrot += 3.0f; + m_yrot += 2.0f; + m_zrot += 4.0f; +} + +//post message to g_main_loop in order to call rotate +//in the gt thread +void Pipeline::rotateRequested() +{ + g_idle_add(cb_rotate, this); +} + +//----------------------------------------------------------------------- +//----------------------------- static members -------------------------- +//----------------------------------------------------------------------- + +float Pipeline::m_xrot = 0; +float Pipeline::m_yrot = 0; +float Pipeline::m_zrot = 0; + +//client reshape callback +void Pipeline::reshapeCallback (uint width, uint height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + +//client draw callback +gboolean Pipeline::drawCallback (uint texture, uint width, uint height) +{ + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + qDebug ("GRPHIC FPS = %d", nbFrames); + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(m_xrot,1.0f,0.0f,0.0f); + glRotatef(m_yrot,0.0f,1.0f,0.0f); + glRotatef(m_zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + //return TRUE causes a postRedisplay + return FALSE; +} + +gboolean Pipeline::bus_call (GstBus *bus, GstMessage *msg, Pipeline* p) +{ + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + qDebug ("End-of-stream"); + p->stop(); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + gst_message_parse_error (msg, &err, &debug); + qDebug ("Error: %s", err->message); + g_error_free (err); + if (debug) + { + qDebug ("Debug deails: %s", debug); + g_free (debug); + } + p->stop(); + break; + } + default: + break; + } + + return TRUE; +} + +void Pipeline::cb_new_pad (GstElement* decodebin, GstPad* pad, gboolean last, Pipeline* p) +{ + GstElement* glimagesink = p->getVideoSink(); + GstPad* glpad = gst_element_get_pad (glimagesink, "sink"); + + //only link once + if (GST_PAD_IS_LINKED (glpad)) + { + gst_object_unref (glpad); + return; + } + + GstCaps* caps = gst_pad_get_caps (pad); + GstStructure* str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "video")) + { + gst_caps_unref (caps); + gst_object_unref (glpad); + return; + } + gst_caps_unref (caps); + + GstPadLinkReturn ret = gst_pad_link (pad, glpad); + if (ret != GST_PAD_LINK_OK) + g_warning ("Failed to link with decodebin!\n"); + + p->show(); +} + +gboolean Pipeline::cb_expose (gpointer data) +{ + ((Pipeline*)data)->doExpose(); + return FALSE; +} + +gboolean Pipeline::cb_rotate (gpointer data) +{ + ((Pipeline*)data)->doRotate(); + return FALSE; +} + +GstBusSyncReply Pipeline::create_window (GstBus* bus, GstMessage* message, const Pipeline* p) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + qDebug ("setting window handle"); + + //Passing 0 as the window_handle will tell the overlay to stop using that window and create an internal one. + //In the directdrawsink's gst_video_overlay_set_window_handle implementation, window_handle (parameter 2) is casted to HWND before it used. + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), (guintptr)p->winId()); + + gst_message_unref (message); + + return GST_BUS_DROP; +} diff --git a/tests/examples/gl/qt/mousevideooverlay/pipeline.h b/tests/examples/gl/qt/mousevideooverlay/pipeline.h new file mode 100644 index 0000000..5cdadaf --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/pipeline.h @@ -0,0 +1,72 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef PIPELINE_H +#define PIPELINE_H + +#include +#include +//#include + +class Pipeline : public QObject +{ + Q_OBJECT + +public: + Pipeline(const WId windId, const QString videoLocation); + ~Pipeline(); + void start(); + void exposeRequested(); + void rotateRequested(); + void stop(); + void unconfigure() const; + void show(); + GstElement* getVideoSink() { return m_glimagesink; } ; + +signals: + void showRequested(); + void stopRequested(); + +private: + const WId m_winId; + const QString m_videoLocation; + GMainLoop* m_loop; + GstBus* m_bus; + GstElement* m_pipeline; + GstElement* m_glimagesink; + static float m_xrot; + static float m_yrot; + static float m_zrot; + + void create(); + WId winId() const { return m_winId; } + void doExpose() const; + void doRotate(); + + static void reshapeCallback (uint width, uint height); + static gboolean drawCallback (uint texture, uint width, uint height); + static gboolean bus_call (GstBus *bus, GstMessage *msg, Pipeline* p); + static void cb_new_pad (GstElement* decodebin, GstPad* pad, gboolean last, Pipeline* p); + static gboolean cb_expose (gpointer data); + static gboolean cb_rotate (gpointer data); + static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, const Pipeline* pipeline); +}; + +#endif diff --git a/tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp b/tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp new file mode 100644 index 0000000..54e94fc --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/qrenderer.cpp @@ -0,0 +1,58 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "qrenderer.h" + +QRenderer::QRenderer(const QString videoLocation, QWidget *parent, Qt::WFlags flags) + : QWidget(parent, flags), + m_gt(winId(), videoLocation) +{ + setAttribute(Qt::WA_NoSystemBackground); + setVisible(false); + move(20, 10); + resize(640, 480); + + QObject::connect(&m_gt, SIGNAL(finished()), this, SLOT(close())); + QObject::connect(this, SIGNAL(exposeRequested()), &m_gt, SLOT(exposeRequested())); + QObject::connect(this, SIGNAL(closeRequested()), &m_gt, SLOT(stop()), Qt::DirectConnection); + QObject::connect(&m_gt, SIGNAL(showRequested()), this, SLOT(show())); + QObject::connect(this, SIGNAL(mouseMoved()), &m_gt, SLOT(onMouseMove())); + m_gt.start(); +} + +QRenderer::~QRenderer() +{ +} + +void QRenderer::paintEvent(QPaintEvent* event) +{ + emit exposeRequested(); +} + +void QRenderer::mouseMoveEvent(QMouseEvent* event) +{ + emit mouseMoved(); +} + +void QRenderer::closeEvent(QCloseEvent* event) +{ + emit closeRequested(); + m_gt.wait(); +} diff --git a/tests/examples/gl/qt/mousevideooverlay/qrenderer.h b/tests/examples/gl/qt/mousevideooverlay/qrenderer.h new file mode 100644 index 0000000..771876d --- /dev/null +++ b/tests/examples/gl/qt/mousevideooverlay/qrenderer.h @@ -0,0 +1,48 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef QRENDERER_H +#define QRENDERER_H + +#include +#include +#include "gstthread.h" + +class QRenderer : public QWidget +{ + Q_OBJECT + +public: + QRenderer(const QString videoLocation, QWidget *parent = 0, Qt::WFlags flags = 0); + ~QRenderer(); + void paintEvent(QPaintEvent* event); + void mouseMoveEvent(QMouseEvent* event); + void closeEvent (QCloseEvent* event); + +signals: + void exposeRequested(); + void closeRequested(); + void mouseMoved(); + +private: + GstThread m_gt; +}; + +#endif // QRENDERER_H diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp b/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp new file mode 100644 index 0000000..a31f8d6 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.cpp @@ -0,0 +1,62 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "gstthread.h" + +GstThread::GstThread(const WId winId, const QString videoLocation, QObject *parent): + QThread(parent), + m_winId(winId), + m_videoLocation(videoLocation) +{ +} + +GstThread::~GstThread() +{ +} + +void GstThread::exposeRequested() +{ + m_pipeline->exposeRequested(); +} + +void GstThread::show() +{ + emit showRequested(); +} + +void GstThread::stop() +{ + m_pipeline->stop(); +} + +void GstThread::run() +{ + m_pipeline = new Pipeline(m_winId, m_videoLocation); + connect(m_pipeline, SIGNAL(showRequested()), this, SLOT(show())); + m_pipeline->start(); //it runs the gmainloop on win32 + +#ifndef WIN32 + //works like the gmainloop on linux (GstEvent are handled) + connect(m_pipeline, SIGNAL(stopRequested()), this, SLOT(quit())); + exec(); +#endif + + m_pipeline->unconfigure(); +} diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h b/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h new file mode 100644 index 0000000..676b987 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/gstthread.h @@ -0,0 +1,55 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef GSTTHREAD_H +#define GSTTHREAD_H + +#include +#include + +#include "pipeline.h" + +class GstThread : public QThread +{ + Q_OBJECT + +public: + GstThread(const WId winId, const QString videoLocation, QObject *parent = 0); + ~GstThread(); + +public slots: + void exposeRequested(); + void show(); + void stop(); + +signals: + void showRequested(); + +protected: + void run(); + +private: + const WId m_winId; + const QString m_videoLocation; + Pipeline* m_pipeline; + +}; + +#endif diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp b/tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp new file mode 100644 index 0000000..fa54a6b --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/main.cpp @@ -0,0 +1,39 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include "qglrenderer.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); + + QString videolcoation = QFileDialog::getOpenFileName(0, "Select a video file", + ".", "Format (*.avi *.mkv *.ogg *.asf *.mov)"); + + if (videolcoation.isEmpty()) + return -1; + + QGLRenderer w(videolcoation); + w.setWindowTitle("glimagesink implements the gstvideooverlay interface"); + + return a.exec(); +} diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp b/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp new file mode 100644 index 0000000..617524a --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.cpp @@ -0,0 +1,332 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include "pipeline.h" + +Pipeline::Pipeline(const WId id, const QString videoLocation): + m_winId(id), + m_videoLocation(videoLocation), + m_loop(NULL), + m_bus(NULL), + m_pipeline(NULL), + m_glupload(NULL), + m_glimagesink(NULL) +{ + create(); +} + +Pipeline::~Pipeline() +{ +} + +void Pipeline::create() +{ + qDebug("Loading video: %s", m_videoLocation.toAscii().data()); + + gst_init (NULL, NULL); + +#ifdef WIN32 + m_loop = g_main_loop_new (NULL, FALSE); +#endif + m_pipeline = gst_pipeline_new ("pipeline"); + + m_bus = gst_pipeline_get_bus (GST_PIPELINE (m_pipeline)); + gst_bus_add_watch (m_bus, (GstBusFunc) bus_call, this); + gst_bus_set_sync_handler (m_bus, (GstBusSyncHandler) create_window, this); + gst_object_unref (m_bus); + + GstElement* videosrc = gst_element_factory_make ("filesrc", "filesrc0"); + GstElement* decodebin = gst_element_factory_make ("decodebin", "decodebin0"); + m_glupload = gst_element_factory_make ("glupload", "glupload0"); + m_glimagesink = gst_element_factory_make ("glimagesink", "sink0"); + + if (!videosrc || !decodebin || !m_glupload || !m_glimagesink ) + { + qDebug ("one element could not be found"); + return; + } + + GstCaps *outcaps = gst_caps_new_simple("video/x-raw", + "width", G_TYPE_INT, 800, + "height", G_TYPE_INT, 600, + NULL) ; + + g_object_set(G_OBJECT(videosrc), "num-buffers", 800, NULL); + g_object_set(G_OBJECT(videosrc), "location", m_videoLocation.toAscii().data(), NULL); + g_object_set(G_OBJECT(m_glimagesink), "client-reshape-callback", reshapeCallback, NULL); + g_object_set(G_OBJECT(m_glimagesink), "client-draw-callback", drawCallback, NULL); + + gst_bin_add_many (GST_BIN (m_pipeline), videosrc, decodebin, m_glupload, m_glimagesink, NULL); + + gboolean link_ok = gst_element_link_filtered(m_glupload, m_glimagesink, outcaps) ; + gst_caps_unref(outcaps) ; + if(!link_ok) + { + qDebug("Failed to link glupload to glimagesink!\n") ; + return; + } + + gst_element_link_pads (videosrc, "src", decodebin, "sink"); + + g_signal_connect (decodebin, "new-decoded-pad", G_CALLBACK (cb_new_pad), this); +} + +void Pipeline::start() +{ + GstStateChangeReturn ret = gst_element_set_state (m_pipeline, GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + qDebug ("Failed to start up pipeline!"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll (m_bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + gst_message_parse_error (msg, &err, NULL); + qDebug ("ERROR: %s", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return; + } + +#ifdef WIN32 + g_main_loop_run(m_loop); +#endif +} + +//we don't want a thread safe stop in this example +void Pipeline::stop() +{ +#ifdef WIN32 + g_main_loop_quit(m_loop); +#else + emit stopRequested(); +#endif +} + +void Pipeline::unconfigure() const +{ + gst_element_set_state (m_pipeline, GST_STATE_NULL); + gst_object_unref (m_pipeline); +} + +void Pipeline::show() +{ + emit showRequested(); +} + +//redraw the current frame in the drawable +void Pipeline::doExpose() const +{ + if (m_pipeline && m_glimagesink) + gst_video_overlay_expose (GST_VIDEO_OVERLAY (m_glimagesink)); +} + +//post message to g_main_loop in order to call expose +//in the gt thread +void Pipeline::exposeRequested() +{ + g_idle_add(cb_expose, this); +} + + +//----------------------------------------------------------------------- +//----------------------------- static members -------------------------- +//----------------------------------------------------------------------- + +//client reshape callback +void Pipeline::reshapeCallback (uint width, uint height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, (gfloat)width/(gfloat)height, 0.1, 100); + glMatrixMode(GL_MODELVIEW); +} + +//client draw callback +gboolean Pipeline::drawCallback (uint texture, uint width, uint height) +{ + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + static GTimeVal current_time; + static glong last_sec = current_time.tv_sec; + static gint nbFrames = 0; + + g_get_current_time (¤t_time); + nbFrames++ ; + + if ((current_time.tv_sec - last_sec) >= 1) + { + qDebug ("GRPHIC FPS = %d", nbFrames); + nbFrames = 0; + last_sec = current_time.tv_sec; + } + + glEnable(GL_DEPTH_TEST); + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f((gfloat)width,(gfloat)height); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f((gfloat)width, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, (gfloat)height); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f((gfloat)width, (gfloat)height); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.03f; + yrot+=0.02f; + zrot+=0.04f; + + //return TRUE causes a postRedisplay + return TRUE; +} + +gboolean Pipeline::bus_call (GstBus *bus, GstMessage *msg, Pipeline* p) +{ + switch (GST_MESSAGE_TYPE (msg)) + { + case GST_MESSAGE_EOS: + qDebug ("End-of-stream"); + p->stop(); + break; + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + gst_message_parse_error (msg, &err, &debug); + qDebug ("Error: %s", err->message); + g_error_free (err); + if (debug) + { + qDebug ("Debug deails: %s", debug); + g_free (debug); + } + p->stop(); + break; + } + default: + break; + } + + return TRUE; +} + +void Pipeline::cb_new_pad (GstElement* decodebin, GstPad* pad, gboolean last, Pipeline* p) +{ + GstElement* glupload = p->getVideoSink(); + GstPad* glpad = gst_element_get_pad (glupload, "sink"); + + //only link once + if (GST_PAD_IS_LINKED (glpad)) + { + gst_object_unref (glpad); + return; + } + + GstCaps* caps = gst_pad_get_caps (pad); + GstStructure* str = gst_caps_get_structure (caps, 0); + if (!g_strrstr (gst_structure_get_name (str), "video")) + { + gst_caps_unref (caps); + gst_object_unref (glpad); + return; + } + gst_caps_unref (caps); + + GstPadLinkReturn ret = gst_pad_link (pad, glpad); + if (ret != GST_PAD_LINK_OK) + g_warning ("Failed to link with decodebin!\n"); + + p->show(); +} + +gboolean Pipeline::cb_expose (gpointer data) +{ + ((Pipeline*)data)->doExpose(); + return FALSE; +} + +GstBusSyncReply Pipeline::create_window (GstBus* bus, GstMessage* message, const Pipeline* p) +{ + // ignore anything but 'prepare-window-handle' element messages + if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT) + return GST_BUS_PASS; + + if (!gst_is_video_overlay_prepare_window_handle_message (message)) + return GST_BUS_PASS; + + qDebug ("setting window handle"); + + //Passing 0 as the window_handle will tell the overlay to stop using that window and create an internal one. + //In the directdrawsink's gst_video_overlay_set_window_handle implementation, window_handle (parameter 2) is casted to HWND before it used. + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message)), (guintptr)p->winId()); + + gst_message_unref (message); + + return GST_BUS_DROP; +} diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h b/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h new file mode 100644 index 0000000..51c48fc --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/pipeline.h @@ -0,0 +1,70 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef PIPELINE_H +#define PIPELINE_H + +#include +#include +//#include + +class Pipeline : public QObject +{ + Q_OBJECT + +public: + Pipeline(const WId windId, const QString videoLocation); + ~Pipeline(); + void start(); + void exposeRequested(); + void stop(); + void unconfigure() const; + void show(); + GstElement* getVideoSink() { return m_glupload; } ; + +signals: + void showRequested(); + void stopRequested(); + +private: + const WId m_winId; + const QString m_videoLocation; + GMainLoop* m_loop; + GstBus* m_bus; + GstElement* m_pipeline; + GstElement* m_glupload; + GstElement* m_glimagesink; + static float m_xrot; + static float m_yrot; + static float m_zrot; + + void create(); + WId winId() const { return m_winId; } + void doExpose() const; + + static void reshapeCallback (uint width, uint height); + static gboolean drawCallback (uint texture, uint width, uint height); + static gboolean bus_call (GstBus *bus, GstMessage *msg, Pipeline* p); + static void cb_new_pad (GstElement* decodebin, GstPad* pad, gboolean last, Pipeline* p); + static gboolean cb_expose (gpointer data); + static GstBusSyncReply create_window (GstBus* bus, GstMessage* message, const Pipeline* pipeline); +}; + +#endif diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp b/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp new file mode 100644 index 0000000..a54625e --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.cpp @@ -0,0 +1,52 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "qglrenderer.h" + +QGLRenderer::QGLRenderer(const QString videoLocation, QWidget *parent) + : QGLWidget(parent), + m_gt(winId(), videoLocation) +{ + setAttribute(Qt::WA_NoSystemBackground); + setVisible(false); + move(20, 10); + resize(640, 480); + + QObject::connect(&m_gt, SIGNAL(finished()), this, SLOT(close())); + QObject::connect(this, SIGNAL(exposeRequested()), &m_gt, SLOT(exposeRequested())); + QObject::connect(this, SIGNAL(closeRequested()), &m_gt, SLOT(stop()), Qt::DirectConnection); + QObject::connect(&m_gt, SIGNAL(showRequested()), this, SLOT(show())); + m_gt.start(); +} + +QGLRenderer::~QGLRenderer() +{ +} + +void QGLRenderer::paintEvent(QPaintEvent* event) +{ + emit exposeRequested(); +} + +void QGLRenderer::closeEvent(QCloseEvent* event) +{ + emit closeRequested(); + m_gt.wait(); +} diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h b/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h new file mode 100644 index 0000000..aaf0d02 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglrenderer.h @@ -0,0 +1,45 @@ +/* + * GStreamer + * Copyright (C) 2008-2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef QGLRENDERER_H +#define QGLRENDERER_H + +#include +#include "gstthread.h" + +class QGLRenderer : public QGLWidget +{ + Q_OBJECT + +public: + QGLRenderer(const QString videoLocation, QWidget *parent = 0); + ~QGLRenderer(); + void paintEvent(QPaintEvent* event); + void closeEvent (QCloseEvent* event); + +signals: + void exposeRequested(); + void closeRequested(); + +private: + GstThread m_gt; +}; + +#endif // QGLRENDERER_H diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri new file mode 100644 index 0000000..772d1d4 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pri @@ -0,0 +1,10 @@ +#Header files +HEADERS += ./gstthread.h \ + ./pipeline.h \ + ./qglrenderer.h + +#Source files +SOURCES += ./gstthread.cpp \ + ./main.cpp \ + ./pipeline.cpp \ + ./qglrenderer.cpp diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro new file mode 100644 index 0000000..2fa56e8 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.pro @@ -0,0 +1,55 @@ +TEMPLATE = app +TARGET = qglwidgetvideooverlay +DESTDIR = ./debug +QT += opengl +CONFIG += debug +DEFINES += UNICODE QT_THREAD_SUPPORT QT_CORE_LIB QT_GUI_LIB + +win32 { +DEFINES += WIN32 +INCLUDEPATH += ./GeneratedFiles \ + ./GeneratedFiles/Debug \ + C:/gstreamer/include \ + C:/gstreamer/include/libxml2 \ + C:/gstreamer/include/glib-2.0 \ + C:/gstreamer/lib/glib-2.0/include \ + C:/gstreamer/include/gstreamer-1.0 +LIBS += -L"C:/gstreamer/lib" \ + -L"C:/gstreamer/bin" \ + -lgstreamer-1.0 \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 \ + -lopengl32 \ + -lglu32 +} + +unix { +DEFINES += UNIX +INCLUDEPATH += GeneratedFiles \ + GeneratedFiles/Debug \ + /usr/include/gstreamer-1.0 \ + /usr/local/include/gstreamer-1.0 \ + /usr/include/glib-2.0 \ + /usr/lib/glib-2.0/include \ + /usr/include/libxml2 +LIBS += -lgstreamer-1.0 \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 \ + -lGLU \ + -lGL +} + +DEPENDPATH += . +MOC_DIR += ./GeneratedFiles/debug +OBJECTS_DIR += debug +UI_DIR += ./GeneratedFiles +RCC_DIR += ./GeneratedFiles + +#Include file(s) +include(qglwidgetvideooverlay.pri) diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln new file mode 100644 index 0000000..3842be0 --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qglwidgetvideooverlay", "qglwidgetvideooverlay.vcproj", "{F40D2D98-281E-465F-B63F-2D473E1C2616}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F40D2D98-281E-465F-B63F-2D473E1C2616}.Debug|Win32.ActiveCfg = Debug|Win32 + {F40D2D98-281E-465F-B63F-2D473E1C2616}.Debug|Win32.Build.0 = Debug|Win32 + {F40D2D98-281E-465F-B63F-2D473E1C2616}.Release|Win32.ActiveCfg = Release|Win32 + {F40D2D98-281E-465F-B63F-2D473E1C2616}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj new file mode 100644 index 0000000..4abca4b --- /dev/null +++ b/tests/examples/gl/qt/qglwidgetvideooverlay/qglwidgetvideooverlay.vcproj @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h b/tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h new file mode 100644 index 0000000..4582bcb --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/AsyncQueue.h @@ -0,0 +1,77 @@ +/* + * GStreamer + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __ASYNCQUEUE_H +#define __ASYNCQUEUE_H + +#include +#include +#include + +/** + * This is the thread safe implementation of the Queue. It can be + * used in classical producers/consumers multithreaded scenario. The + * template parameter is the class which can be put/get to/from the + * queue. + */ +template +class AsyncQueue +{ +public: + AsyncQueue() : waitingReaders(0) {} + + int size() + { + QMutexLocker locker(&mutex); + return this->buffer.size(); + } + + void put(const T& item) + { + QMutexLocker locker(&mutex); + this->buffer.push_back(item); + if(this->waitingReaders) + this->bufferIsNotEmpty.wakeOne(); + } + + T get() + { + QMutexLocker locker(&mutex); + while(this->buffer.size() == 0) + { + ++(this->waitingReaders); + this->bufferIsNotEmpty.wait(&mutex); + --(this->waitingReaders); + } + T item = this->buffer.front(); + this->buffer.pop_front(); + return item; + } + +private: + typedef QList Container; + QMutex mutex; + QWaitCondition bufferIsNotEmpty; + Container buffer; + short waitingReaders; +}; + + +#endif // __ASYNCQUEUE_H diff --git a/tests/examples/gl/qt/qglwtextureshare/README b/tests/examples/gl/qt/qglwtextureshare/README new file mode 100644 index 0000000..305847c --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/README @@ -0,0 +1,29 @@ +This example illustrates how to integrate Gstreamer GL plugin with +Qt. In particular it uses glupload with fakesink elements to create +texture with decoded video frame. This texture is shared with +QGLWidget derived class, which paints a cube with video texture on +each face. + +To compile the example, include and library paths might be adjusted in +.pro file according to your installation of the gstreamer and +corresponding development files. Most probably, the adjustments will +be necessary on Windows. + +To run the example simply start executable file after compilation. If +there is no command line arguments provided, then videotestsrc element +will be used to generate video. The following pipeline will be created +in this case: + +videotestsrc ! video/x-raw, width=640, height=480, framerate=(fraction)30/1 ! glupload ! fakesink sync=1 + +It is also possible to provide the video file name as a first command +line parameter, i.e. ./qglwtextureshare myvideo.ogv . In this case, +the following pipeline will be executed: + +filesrc location=myvideo.ogv ! decodebin2 ! glupload ! fakesink sync=1 + +I would appreciate any feedback and improvement suggestions for this +example. + +Have fun :-) +Andrey Nechypurenko (andreynech@gmail.com) diff --git a/tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm b/tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm new file mode 100644 index 0000000..9b1e78b --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/cocoa_utils.mm @@ -0,0 +1,26 @@ +/* + * GStreamer + * Copyright (C) 2010 Julien Isorce + * Copyright (C) 2010 Nuno Santos + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#import +void *qt_current_nsopengl_context() +{ + return [NSOpenGLContext currentContext]; +} diff --git a/tests/examples/gl/qt/qglwtextureshare/glcontextid.h b/tests/examples/gl/qt/qglwtextureshare/glcontextid.h new file mode 100644 index 0000000..c6a240c --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/glcontextid.h @@ -0,0 +1,65 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * Copyright (C) 2010 Nuno Santos + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GLCONTEXTID_H +#define __GLCONTEXTID_H + +#include + +#if defined(GST_GL_HAVE_PLATFORM_WGL) + #define WIN32_LEAN_AND_MEAN + #include + #include + #include +#elif defined (GST_GL_HAVE_PLATFORM_COCOA) + #include + class NSOpenGLContext; +#else + #include + #include + #include + #include +#endif + + +#if defined(GST_GL_HAVE_PLATFORM_WGL) + typedef struct _tagGLContextID + { + HGLRC contextId; + HDC dc; + } GLContextID; +#elif defined(GST_GL_HAVE_PLATFORM_COCOA) + typedef struct _tagGLContextID + { + NSOpenGLContext* contextId; + } GLContextID; +#elif defined(GST_GL_HAVE_PLATFORM_GLX) + typedef struct _tagGLContextID + { + GLXContext contextId; + Display *display; + Window wnd; + } GLContextID; +#endif + +#endif // __GLCONTEXTID_H + diff --git a/tests/examples/gl/qt/qglwtextureshare/gstthread.cpp b/tests/examples/gl/qt/qglwtextureshare/gstthread.cpp new file mode 100644 index 0000000..2a1ff69 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/gstthread.cpp @@ -0,0 +1,66 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "pipeline.h" +#include "gstthread.h" + + +GstThread::GstThread(GstGLContext *context, + const QString &videoLocation, + const char *renderer_slot, + QObject *parent): + QThread(parent), + m_videoLocation(videoLocation) +{ + this->context = context; + m_pipeline = new Pipeline(this->context, m_videoLocation, this); + QObject::connect(m_pipeline, SIGNAL(newFrameReady()), this->parent(), renderer_slot, Qt::QueuedConnection); +} + +GstThread::~GstThread() +{ +} + +void GstThread::stop() +{ + if(m_pipeline) + m_pipeline->stop(); +} + +void GstThread::run() +{ + qDebug("Starting gst pipeline"); + m_pipeline->start(); //it runs the gmainloop on win32 + +#ifndef Q_WS_WIN + //works like the gmainloop on linux (GstEvent are handled) + connect(m_pipeline, SIGNAL(stopRequested()), this, SLOT(quit())); + exec(); +#endif + + m_pipeline->unconfigure(); + + m_pipeline = NULL; + // This is not a memory leak. Pipeline will be deleted + // when the parent object (this) will be destroyed. + // We set m_pipeline to NULL to prevent further attempts + // to stop already stopped pipeline +} diff --git a/tests/examples/gl/qt/qglwtextureshare/gstthread.h b/tests/examples/gl/qt/qglwtextureshare/gstthread.h new file mode 100644 index 0000000..918859e --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/gstthread.h @@ -0,0 +1,59 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef GSTTHREAD_H +#define GSTTHREAD_H + +#include + +#include + +#include "glcontextid.h" + +class Pipeline; + +class GstThread : public QThread +{ + Q_OBJECT + +public: + GstThread(GstGLContext *context, + const QString &videoLocation, + const char *renderer_slot, + QObject *parent = 0); + + ~GstThread(); + + Pipeline *getPipeline() {return this->m_pipeline;} + +public Q_SLOTS: + void stop(); + +protected: + void run(); + +private: + GstGLContext *context; + const QString m_videoLocation; + Pipeline* m_pipeline; +}; + +#endif diff --git a/tests/examples/gl/qt/qglwtextureshare/main.cpp b/tests/examples/gl/qt/qglwtextureshare/main.cpp new file mode 100644 index 0000000..f2eb2f1 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/main.cpp @@ -0,0 +1,36 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include "qglrenderer.h" + + +int +main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); + QGLRenderer w(argc > 1 ? argv[1] : ""); + w.setWindowTitle("Texture sharing example"); + w.show(); + return a.exec(); +} + diff --git a/tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp b/tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp new file mode 100644 index 0000000..1787e38 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/moc_gstthread.cpp @@ -0,0 +1,109 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'gstthread.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "gstthread.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'gstthread.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_GstThread_t { + QByteArrayData data[3]; + char stringdata[17]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_GstThread_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_GstThread_t qt_meta_stringdata_GstThread = { + { +QT_MOC_LITERAL(0, 0, 9), +QT_MOC_LITERAL(1, 10, 4), +QT_MOC_LITERAL(2, 15, 0) + }, + "GstThread\0stop\0\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_GstThread[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 19, 2, 0x0a, + + // slots: parameters + QMetaType::Void, + + 0 // eod +}; + +void GstThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + GstThread *_t = static_cast(_o); + switch (_id) { + case 0: _t->stop(); break; + default: ; + } + } + Q_UNUSED(_a); +} + +const QMetaObject GstThread::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_GstThread.data, + qt_meta_data_GstThread, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *GstThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *GstThread::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_GstThread.stringdata)) + return static_cast(const_cast< GstThread*>(this)); + return QThread::qt_metacast(_clname); +} + +int GstThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp b/tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp new file mode 100644 index 0000000..fdf0cf7 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/moc_pipeline.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'pipeline.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "pipeline.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'pipeline.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_Pipeline_t { + QByteArrayData data[4]; + char stringdata[39]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_Pipeline_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_Pipeline_t qt_meta_stringdata_Pipeline = { + { +QT_MOC_LITERAL(0, 0, 8), +QT_MOC_LITERAL(1, 9, 13), +QT_MOC_LITERAL(2, 23, 0), +QT_MOC_LITERAL(3, 24, 13) + }, + "Pipeline\0newFrameReady\0\0stopRequested\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Pipeline[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 24, 2, 0x06, + 3, 0, 25, 2, 0x06, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void Pipeline::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + Pipeline *_t = static_cast(_o); + switch (_id) { + case 0: _t->newFrameReady(); break; + case 1: _t->stopRequested(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (Pipeline::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&Pipeline::newFrameReady)) { + *result = 0; + } + } + { + typedef void (Pipeline::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&Pipeline::stopRequested)) { + *result = 1; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject Pipeline::staticMetaObject = { + { &QObject::staticMetaObject, qt_meta_stringdata_Pipeline.data, + qt_meta_data_Pipeline, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *Pipeline::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Pipeline::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_Pipeline.stringdata)) + return static_cast(const_cast< Pipeline*>(this)); + return QObject::qt_metacast(_clname); +} + +int Pipeline::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QObject::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void Pipeline::newFrameReady() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void Pipeline::stopRequested() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp b/tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp new file mode 100644 index 0000000..5a11b71 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/moc_qglrenderer.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'qglrenderer.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "qglrenderer.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'qglrenderer.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_QGLRenderer_t { + QByteArrayData data[4]; + char stringdata[38]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_QGLRenderer_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_QGLRenderer_t qt_meta_stringdata_QGLRenderer = { + { +QT_MOC_LITERAL(0, 0, 11), +QT_MOC_LITERAL(1, 12, 14), +QT_MOC_LITERAL(2, 27, 0), +QT_MOC_LITERAL(3, 28, 8) + }, + "QGLRenderer\0closeRequested\0\0newFrame\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_QGLRenderer[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 24, 2, 0x06, + + // slots: name, argc, parameters, tag, flags + 3, 0, 25, 2, 0x0a, + + // signals: parameters + QMetaType::Void, + + // slots: parameters + QMetaType::Void, + + 0 // eod +}; + +void QGLRenderer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + QGLRenderer *_t = static_cast(_o); + switch (_id) { + case 0: _t->closeRequested(); break; + case 1: _t->newFrame(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (QGLRenderer::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&QGLRenderer::closeRequested)) { + *result = 0; + } + } + } + Q_UNUSED(_a); +} + +const QMetaObject QGLRenderer::staticMetaObject = { + { &QGLWidget::staticMetaObject, qt_meta_stringdata_QGLRenderer.data, + qt_meta_data_QGLRenderer, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *QGLRenderer::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *QGLRenderer::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_QGLRenderer.stringdata)) + return static_cast(const_cast< QGLRenderer*>(this)); + return QGLWidget::qt_metacast(_clname); +} + +int QGLRenderer::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QGLWidget::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void QGLRenderer::closeRequested() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/qglwtextureshare/pipeline.cpp b/tests/examples/gl/qt/qglwtextureshare/pipeline.cpp new file mode 100644 index 0000000..a7dd490 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/pipeline.cpp @@ -0,0 +1,222 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "pipeline.h" + + +Pipeline::Pipeline(GstGLContext *context, + const QString &videoLocation, + QObject *parent) + : QObject(parent), + m_videoLocation(videoLocation), + m_loop(NULL), + m_bus(NULL), + m_pipeline(NULL) +{ + this->context = context; + this->configure(); +} + +Pipeline::~Pipeline() +{ +} + +void +Pipeline::configure() +{ + gst_init (NULL, NULL); + +#ifdef Q_WS_WIN + m_loop = g_main_loop_new (NULL, FALSE); +#endif + + if(m_videoLocation.isEmpty()) + { + qDebug("No video file specified. Using video test source."); + m_pipeline = + GST_PIPELINE (gst_parse_launch + ("videotestsrc ! " + "video/x-raw, width=640, height=480, " + "framerate=(fraction)30/1 ! " + "gleffects effect=5 ! fakesink sync=1", + NULL)); + } + else + { + QByteArray ba = m_videoLocation.toLocal8Bit(); + qDebug("Loading video: %s", ba.data()); + gchar *pipeline = g_strdup_printf ("filesrc location='%s' ! " + "decodebin ! gleffects effect=5 ! " + "fakesink sync=1", ba.data()); + m_pipeline = GST_PIPELINE (gst_parse_launch (pipeline, NULL)); + g_free (pipeline); + } + + m_bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline)); + gst_bus_add_watch(m_bus, (GstBusFunc) bus_call, this); + gst_object_unref(m_bus); + + /* Retrieve the last gl element */ + GstElement *gl_element = gst_bin_get_by_name(GST_BIN(m_pipeline), "gleffects0"); + if(!gl_element) + { + qDebug ("gl element could not be found"); + return; + } + g_object_set(G_OBJECT (gl_element), "other-context", + this->context, NULL); + gst_object_unref(gl_element); + + gst_element_set_state(GST_ELEMENT(this->m_pipeline), GST_STATE_PAUSED); + GstState state = GST_STATE_PAUSED; + if(gst_element_get_state(GST_ELEMENT(this->m_pipeline), + &state, NULL, GST_CLOCK_TIME_NONE) + != GST_STATE_CHANGE_SUCCESS) + { + qDebug("failed to pause pipeline"); + return; + } +} + +void +Pipeline::start() +{ + // set a callback to retrieve the gst gl textures + GstElement *fakesink = gst_bin_get_by_name(GST_BIN(this->m_pipeline), + "fakesink0"); + g_object_set(G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); + g_signal_connect(fakesink, "handoff", G_CALLBACK (on_gst_buffer), this); + gst_object_unref(fakesink); + + GstStateChangeReturn ret = + gst_element_set_state(GST_ELEMENT(this->m_pipeline), GST_STATE_PLAYING); + if (ret == GST_STATE_CHANGE_FAILURE) + { + qDebug("Failed to start up pipeline!"); + + /* check if there is an error message with details on the bus */ + GstMessage* msg = gst_bus_poll(this->m_bus, GST_MESSAGE_ERROR, 0); + if (msg) + { + GError *err = NULL; + gst_message_parse_error (msg, &err, NULL); + qDebug ("ERROR: %s", err->message); + g_error_free (err); + gst_message_unref (msg); + } + return; + } + +#ifdef Q_WS_WIN + g_main_loop_run(m_loop); +#endif +} + +/* fakesink handoff callback */ +void +Pipeline::on_gst_buffer(GstElement * element, + GstBuffer * buf, + GstPad * pad, + Pipeline* p) +{ + Q_UNUSED(pad) + Q_UNUSED(element) + + /* ref then push buffer to use it in qt */ + gst_buffer_ref(buf); + p->queue_input_buf.put(buf); + + if (p->queue_input_buf.size() > 3) + p->notifyNewFrame(); + + /* pop then unref buffer we have finished to use in qt */ + if (p->queue_output_buf.size() > 3) + { + GstBuffer *buf_old = (p->queue_output_buf.get()); + if (buf_old) + gst_buffer_unref(buf_old); + } +} + +void +Pipeline::stop() +{ +#ifdef Q_WS_WIN + g_main_loop_quit(m_loop); +#else + emit stopRequested(); +#endif +} + +void +Pipeline::unconfigure() +{ + gst_element_set_state(GST_ELEMENT(this->m_pipeline), GST_STATE_NULL); + + GstBuffer *buf; + while(this->queue_input_buf.size()) + { + buf = (GstBuffer*)(this->queue_input_buf.get()); + gst_buffer_unref(buf); + } + while(this->queue_output_buf.size()) + { + buf = (GstBuffer*)(this->queue_output_buf.get()); + gst_buffer_unref(buf); + } + + gst_object_unref(m_pipeline); +} + +gboolean +Pipeline::bus_call(GstBus *bus, GstMessage *msg, Pipeline* p) +{ + Q_UNUSED(bus) + + switch(GST_MESSAGE_TYPE(msg)) + { + case GST_MESSAGE_EOS: + qDebug("End-of-stream received. Stopping."); + p->stop(); + break; + + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + gst_message_parse_error(msg, &err, &debug); + qDebug("Error: %s", err->message); + g_error_free (err); + if(debug) + { + qDebug("Debug deails: %s", debug); + g_free(debug); + } + p->stop(); + break; + } + + default: + break; + } + + return TRUE; +} diff --git a/tests/examples/gl/qt/qglwtextureshare/pipeline.h b/tests/examples/gl/qt/qglwtextureshare/pipeline.h new file mode 100644 index 0000000..5e59f1a --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/pipeline.h @@ -0,0 +1,70 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef PIPELINE_H +#define PIPELINE_H + +#include + +#include + +#include "glcontextid.h" +#include "AsyncQueue.h" + + +class Pipeline : public QObject +{ + Q_OBJECT + +public: + Pipeline(GstGLContext *context, + const QString &videoLocation, + QObject *parent); + ~Pipeline(); + + void configure(); + void start(); + void notifyNewFrame() {emit newFrameReady();} + void stop(); + void unconfigure(); + + AsyncQueue queue_input_buf; + AsyncQueue queue_output_buf; + +Q_SIGNALS: + void newFrameReady(); + void stopRequested(); + +private: + GstGLContext *context; + const QString m_videoLocation; + GMainLoop* m_loop; + GstBus* m_bus; + GstPipeline* m_pipeline; + static float m_xrot; + static float m_yrot; + static float m_zrot; + + static void on_gst_buffer(GstElement * element, GstBuffer * buf, GstPad * pad, Pipeline* p); + static gboolean bus_call (GstBus *bus, GstMessage *msg, Pipeline* p); +}; + +#endif diff --git a/tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp b/tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp new file mode 100644 index 0000000..303e4f1 --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/qglrenderer.cpp @@ -0,0 +1,231 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * Copyright (C) 2010 Nuno Santos + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include +#include +#include + +#include +#include + +#include "gstthread.h" +#include "qglrenderer.h" +#include "pipeline.h" + +#if defined(Q_WS_MAC) +extern void *qt_current_nsopengl_context(); +#endif + +QGLRenderer::QGLRenderer(const QString &videoLocation, + QWidget *parent) + : QGLWidget(parent), + videoLoc(videoLocation), + gst_thread(NULL), + closing(false), + frame(NULL) +{ + move(20, 10); + resize(640, 480); +} + +QGLRenderer::~QGLRenderer() +{ +} + +void +QGLRenderer::initializeGL() +{ + GstGLContext *context; + GstGLDisplay *display; + + display = gst_gl_display_new (); + + /* FIXME: Allow the choice at runtime */ +#if defined(GST_GL_HAVE_PLATFORM_WGL) + context = gst_gl_context_new_wrapped (display, (guintptr) wglGetCurrentContext (), GST_GL_PLATFORM_WGL, GST_GL_API_OPENGL); +#elif defined (GST_GL_HAVE_PLATFORM_COCOA) + context = gst_gl_context_new_wrapped (display, (guintptr) qt_current_nsopengl_context(), GST_GL_PLATFORM_COCOA, GST_GL_API_OPENGL); +#elif defined(GST_GL_HAVE_PLATFORM_GLX) + context = gst_gl_context_new_wrapped (display, (guintptr) glXGetCurrentContext (), GST_GL_PLATFORM_GLX, GST_GL_API_OPENGL); +#endif + gst_object_unref (display); + + // We need to unset Qt context before initializing gst-gl plugin. + // Otherwise the attempt to share gst-gl context with Qt will fail. + this->doneCurrent(); + this->gst_thread = + new GstThread(context, this->videoLoc, SLOT(newFrame()), this); + this->makeCurrent(); + + QObject::connect(this->gst_thread, SIGNAL(finished()), + this, SLOT(close())); + QObject::connect(this, SIGNAL(closeRequested()), + this->gst_thread, SLOT(stop()), Qt::QueuedConnection); + + qglClearColor(QApplication::palette().color(QPalette::Active, + QPalette::Window)); + //glShadeModel(GL_FLAT); + //glEnable(GL_DEPTH_TEST); + //glEnable(GL_CULL_FACE); + glEnable(GL_TEXTURE_2D); // Enable Texture Mapping + + this->gst_thread->start(); +} + +void +QGLRenderer::resizeGL(int width, int height) +{ + // Reset The Current Viewport And Perspective Transformation + glViewport(0, 0, width, height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f); + glMatrixMode(GL_MODELVIEW); +} + +void +QGLRenderer::newFrame() +{ + Pipeline *pipeline = this->gst_thread->getPipeline(); + if(!pipeline) + return; + + /* frame is initialized as null */ + if (this->frame) + pipeline->queue_output_buf.put(this->frame); + + this->frame = pipeline->queue_input_buf.get(); + + /* direct call to paintGL (no queued) */ + this->updateGL(); +} + +void +QGLRenderer::paintGL() +{ + static GLfloat xrot = 0; + static GLfloat yrot = 0; + static GLfloat zrot = 0; + + if (this->frame) + { + guint tex_id; + GstMemory *mem; + GstVideoInfo v_info; + GstVideoFrame v_frame; + GstVideoMeta *v_meta; + + mem = gst_buffer_peek_memory (this->frame, 0); + v_meta = gst_buffer_get_video_meta (this->frame); + + if (gst_is_gl_memory (mem)) { + gst_video_info_set_format (&v_info, v_meta->format, v_meta->width, + v_meta->height); + + gst_video_frame_map (&v_frame, &v_info, this->frame, + (GstMapFlags) (GST_MAP_READ | GST_MAP_GL)); + + tex_id = *(guint *) v_frame.data[0]; + } + + glEnable(GL_DEPTH_TEST); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex_id); + if(glGetError () != GL_NO_ERROR) + { + qDebug ("failed to bind texture that comes from gst-gl"); + emit closeRequested(); + return; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_EDGE); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glTranslatef(0.0f,0.0f,-5.0f); + + glRotatef(xrot,1.0f,0.0f,0.0f); + glRotatef(yrot,0.0f,1.0f,0.0f); + glRotatef(zrot,0.0f,0.0f,1.0f); + + glBegin(GL_QUADS); + // Front Face + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + // Back Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + // Top Face + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + // Bottom Face + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + // Right face + glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); + // Left Face + glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot+=0.3f; + yrot+=0.2f; + zrot+=0.4f; + + glBindTexture(GL_TEXTURE_2D, 0); + } +} + +void +QGLRenderer::closeEvent(QCloseEvent* event) +{ + if(this->closing == false) + { + this->closing = true; + emit closeRequested(); + event->ignore(); + } +} diff --git a/tests/examples/gl/qt/qglwtextureshare/qglrenderer.h b/tests/examples/gl/qt/qglwtextureshare/qglrenderer.h new file mode 100644 index 0000000..0bf354b --- /dev/null +++ b/tests/examples/gl/qt/qglwtextureshare/qglrenderer.h @@ -0,0 +1,60 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * Copyright (C) 2009 Andrey Nechypurenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef QGLRENDERER_H +#define QGLRENDERER_H + +#include + +#include + + +class GstThread; + +class QGLRenderer : public QGLWidget +{ + Q_OBJECT + +public: + QGLRenderer(const QString &videoLocation, QWidget *parent = 0); + ~QGLRenderer(); + + void closeEvent(QCloseEvent* event); + +Q_SIGNALS: + void closeRequested(); + +public Q_SLOTS: + void newFrame(); + +protected: + virtual void initializeGL(); + virtual void resizeGL(int width, int height); + virtual void paintGL(); + +private: + QString videoLoc; + GstThread *gst_thread; + bool closing; + GstBuffer *frame; +}; + +#endif // QGLRENDERER_H diff --git a/tests/examples/gl/qt/qglwtextureshare/qglwtextureshare b/tests/examples/gl/qt/qglwtextureshare/qglwtextureshare new file mode 100755 index 0000000000000000000000000000000000000000..c32aedf5bdfbf9cc49e49fbe83878feefd239e59 GIT binary patch literal 989341 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 wwAhFiTnO~I6DQ;C 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

33s97+r*O$*Epq|CXj9m{IC>Y~ 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 IRkU6FZ#kLMK>z>% literal 0 HcmV?d00001 diff --git a/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp new file mode 100644 index 0000000..7982306 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_gstthread.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'gstthread.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../../gstthread.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'gstthread.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_GstThread_t { + QByteArrayData data[8]; + char stringdata[69]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_GstThread_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_GstThread_t qt_meta_stringdata_GstThread = { + { +QT_MOC_LITERAL(0, 0, 9), +QT_MOC_LITERAL(1, 10, 15), +QT_MOC_LITERAL(2, 26, 0), +QT_MOC_LITERAL(3, 27, 5), +QT_MOC_LITERAL(4, 33, 6), +QT_MOC_LITERAL(5, 40, 15), +QT_MOC_LITERAL(6, 56, 6), +QT_MOC_LITERAL(7, 63, 4) + }, + "GstThread\0resizeRequested\0\0width\0" + "height\0exposeRequested\0resize\0stop\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_GstThread[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 4, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 34, 2, 0x06, + + // slots: name, argc, parameters, tag, flags + 5, 0, 39, 2, 0x0a, + 6, 2, 40, 2, 0x0a, + 7, 0, 45, 2, 0x0a, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, + + 0 // eod +}; + +void GstThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + GstThread *_t = static_cast(_o); + switch (_id) { + case 0: _t->resizeRequested((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->exposeRequested(); break; + case 2: _t->resize((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 3: _t->stop(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (GstThread::*_t)(int , int ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&GstThread::resizeRequested)) { + *result = 0; + } + } + } +} + +const QMetaObject GstThread::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_GstThread.data, + qt_meta_data_GstThread, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *GstThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *GstThread::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_GstThread.stringdata)) + return static_cast(const_cast< GstThread*>(this)); + return QThread::qt_metacast(_clname); +} + +int GstThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 4) + qt_static_metacall(this, _c, _id, _a); + _id -= 4; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 4) + *reinterpret_cast(_a[0]) = -1; + _id -= 4; + } + return _id; +} + +// SIGNAL 0 +void GstThread::resizeRequested(int _t1, int _t2) +{ + void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp new file mode 100644 index 0000000..dff3f77 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_pipeline.cpp @@ -0,0 +1,143 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'pipeline.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../../pipeline.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'pipeline.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_Pipeline_t { + QByteArrayData data[6]; + char stringdata[54]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_Pipeline_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_Pipeline_t qt_meta_stringdata_Pipeline = { + { +QT_MOC_LITERAL(0, 0, 8), +QT_MOC_LITERAL(1, 9, 15), +QT_MOC_LITERAL(2, 25, 0), +QT_MOC_LITERAL(3, 26, 5), +QT_MOC_LITERAL(4, 32, 6), +QT_MOC_LITERAL(5, 39, 13) + }, + "Pipeline\0resizeRequested\0\0width\0height\0" + "stopRequested\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Pipeline[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 2, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 24, 2, 0x06, + 5, 0, 29, 2, 0x06, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, + + 0 // eod +}; + +void Pipeline::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + Pipeline *_t = static_cast(_o); + switch (_id) { + case 0: _t->resizeRequested((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->stopRequested(); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (Pipeline::*_t)(int , int ); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&Pipeline::resizeRequested)) { + *result = 0; + } + } + { + typedef void (Pipeline::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&Pipeline::stopRequested)) { + *result = 1; + } + } + } +} + +const QMetaObject Pipeline::staticMetaObject = { + { &QObject::staticMetaObject, qt_meta_stringdata_Pipeline.data, + qt_meta_data_Pipeline, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *Pipeline::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Pipeline::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_Pipeline.stringdata)) + return static_cast(const_cast< Pipeline*>(this)); + return QObject::qt_metacast(_clname); +} + +int Pipeline::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QObject::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 2) + qt_static_metacall(this, _c, _id, _a); + _id -= 2; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 2) + *reinterpret_cast(_a[0]) = -1; + _id -= 2; + } + return _id; +} + +// SIGNAL 0 +void Pipeline::resizeRequested(int _t1, int _t2) +{ + void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} + +// SIGNAL 1 +void Pipeline::stopRequested() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp new file mode 100644 index 0000000..007373b --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/GeneratedFiles/debug/moc_qrenderer.cpp @@ -0,0 +1,150 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'qrenderer.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../../qrenderer.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'qrenderer.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +struct qt_meta_stringdata_QRenderer_t { + QByteArrayData data[7]; + char stringdata[72]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + offsetof(qt_meta_stringdata_QRenderer_t, stringdata) + ofs \ + - idx * sizeof(QByteArrayData) \ + ) +static const qt_meta_stringdata_QRenderer_t qt_meta_stringdata_QRenderer = { + { +QT_MOC_LITERAL(0, 0, 9), +QT_MOC_LITERAL(1, 10, 15), +QT_MOC_LITERAL(2, 26, 0), +QT_MOC_LITERAL(3, 27, 14), +QT_MOC_LITERAL(4, 42, 15), +QT_MOC_LITERAL(5, 58, 5), +QT_MOC_LITERAL(6, 64, 6) + }, + "QRenderer\0exposeRequested\0\0closeRequested\0" + "resizeRequested\0width\0height\0" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_QRenderer[] = { + + // content: + 7, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 2, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x06, + 3, 0, 30, 2, 0x06, + + // slots: name, argc, parameters, tag, flags + 4, 2, 31, 2, 0x0a, + + // signals: parameters + QMetaType::Void, + QMetaType::Void, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 5, 6, + + 0 // eod +}; + +void QRenderer::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + QRenderer *_t = static_cast(_o); + switch (_id) { + case 0: _t->exposeRequested(); break; + case 1: _t->closeRequested(); break; + case 2: _t->resizeRequested((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + void **func = reinterpret_cast(_a[1]); + { + typedef void (QRenderer::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&QRenderer::exposeRequested)) { + *result = 0; + } + } + { + typedef void (QRenderer::*_t)(); + if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&QRenderer::closeRequested)) { + *result = 1; + } + } + } +} + +const QMetaObject QRenderer::staticMetaObject = { + { &QWidget::staticMetaObject, qt_meta_stringdata_QRenderer.data, + qt_meta_data_QRenderer, qt_static_metacall, 0, 0} +}; + + +const QMetaObject *QRenderer::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *QRenderer::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_QRenderer.stringdata)) + return static_cast(const_cast< QRenderer*>(this)); + return QWidget::qt_metacast(_clname); +} + +int QRenderer::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QWidget::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} + +// SIGNAL 0 +void QRenderer::exposeRequested() +{ + QMetaObject::activate(this, &staticMetaObject, 0, 0); +} + +// SIGNAL 1 +void QRenderer::closeRequested() +{ + QMetaObject::activate(this, &staticMetaObject, 1, 0); +} +QT_END_MOC_NAMESPACE diff --git a/tests/examples/gl/qt/videooverlay/videooverlay.cpp b/tests/examples/gl/qt/videooverlay/videooverlay.cpp new file mode 100644 index 0000000..9a95e90 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/videooverlay.cpp @@ -0,0 +1,80 @@ +/* GStreamer + * Copyright (C) <2010> Stefan Kost + * + * qt-xoverlay: demonstrate overlay handling using qt + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + gst_init (&argc, &argv); + QApplication app(argc, argv); + app.setQuitOnLastWindowClosed(true); + + /* prepare the pipeline */ + + GstElement *pipeline = gst_pipeline_new ("xvoverlay"); + GstElement *src = gst_element_factory_make ("videotestsrc", NULL); + GstElement *sink = gst_element_factory_make ("glimagesink", NULL); + + if (sink == NULL) + g_error ("Couldn't create glimagesink."); + + gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); + gst_element_link (src, sink); + + /* prepare the ui */ + + QWidget window; + window.resize(320, 240); + window.setWindowTitle("GstVideoOverlay Qt demo"); + window.show(); + + WId xwinid = window.winId(); + gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid); + + /* run the pipeline */ + + GstStateChangeReturn sret = gst_element_set_state (pipeline, + GST_STATE_PLAYING); + if (sret == GST_STATE_CHANGE_FAILURE) { + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + /* Exit application */ + QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit())); + } + + int ret = app.exec(); + + window.hide(); + gst_element_set_state (pipeline, GST_STATE_NULL); + gst_object_unref (pipeline); + + return ret; +} diff --git a/tests/examples/gl/qt/videooverlay/videooverlay.pri b/tests/examples/gl/qt/videooverlay/videooverlay.pri new file mode 100644 index 0000000..0a53a90 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/videooverlay.pri @@ -0,0 +1,4 @@ +#Header files + +#Source files +SOURCES += videooverlay.cpp diff --git a/tests/examples/gl/qt/videooverlay/videooverlay.sln b/tests/examples/gl/qt/videooverlay/videooverlay.sln new file mode 100644 index 0000000..f566357 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/videooverlay.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "videooverlay", "videooverlay.vcproj", "{7B8654F9-23A9-4C88-A751-6BBE09ED4CAF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B8654F9-23A9-4C88-A751-6BBE09ED4CAF}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B8654F9-23A9-4C88-A751-6BBE09ED4CAF}.Debug|Win32.Build.0 = Debug|Win32 + {7B8654F9-23A9-4C88-A751-6BBE09ED4CAF}.Release|Win32.ActiveCfg = Release|Win32 + {7B8654F9-23A9-4C88-A751-6BBE09ED4CAF}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection + GlobalSection(Qt) = preSolution + Integration = True + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/qt/videooverlay/videooverlay.vcproj b/tests/examples/gl/qt/videooverlay/videooverlay.vcproj new file mode 100644 index 0000000..557f68a --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/videooverlay.vcproj @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/examples/gl/qt/videooverlay/videovideooverlay.pro b/tests/examples/gl/qt/videooverlay/videovideooverlay.pro new file mode 100644 index 0000000..173b8c6 --- /dev/null +++ b/tests/examples/gl/qt/videooverlay/videovideooverlay.pro @@ -0,0 +1,53 @@ +TEMPLATE = app +TARGET = videooverlay +DESTDIR = ./Debug +CONFIG += debug +DEFINES += UNICODE QT_THREAD_SUPPORT QT_CORE_LIB QT_GUI_LIB +QT += gui widgets + +win32 { +DEFINES += WIN32 +INCLUDEPATH += ./GeneratedFiles \ + ./GeneratedFiles/Debug \ + C:/gstreamer/include \ + C:/gstreamer/include/libxml2 \ + C:/gstreamer/include/glib-2.0 \ + C:/gstreamer/lib/glib-2.0/include \ + C:/gstreamer/include/gstreamer-1.0 +LIBS += -L"C:/gstreamer/bin" \ + -L"C:/gstreamer/lib" \ + -lgstreamer-1.0 \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 +} + +unix { +DEFINES += UNIX +INCLUDEPATH += GeneratedFiles \ + GeneratedFiles/Debug \ + /usr/include/gstreamer-1.0 \ + /usr/local/include/gstreamer-1.0 \ + /usr/include/glib-2.0 \ + /usr/lib/glib-2.0/include \ + /usr/include/libxml2 +LIBS += -lgstreamer-1.0 \ + -lgstvideo-1.0 \ + -lglib-2.0 \ + -lgmodule-2.0 \ + -lgobject-2.0 \ + -lgthread-2.0 \ + -lGLU \ + -lGL +} + +DEPENDPATH += . +MOC_DIR += ./GeneratedFiles/debug +OBJECTS_DIR += debug +UI_DIR += ./GeneratedFiles +RCC_DIR += ./GeneratedFiles + +#Include file(s) +include(videooverlay.pri) diff --git a/tests/examples/gl/sdl/.gitignore b/tests/examples/gl/sdl/.gitignore new file mode 100644 index 0000000..b958bef --- /dev/null +++ b/tests/examples/gl/sdl/.gitignore @@ -0,0 +1 @@ +sdlshare diff --git a/tests/examples/gl/sdl/Makefile.am b/tests/examples/gl/sdl/Makefile.am new file mode 100644 index 0000000..9e0c8c5 --- /dev/null +++ b/tests/examples/gl/sdl/Makefile.am @@ -0,0 +1,15 @@ +noinst_PROGRAMS = ## + +#works on win32 and X +if HAVE_SDL + +noinst_PROGRAMS += sdlshare + +sdlshare_SOURCES = sdlshare.c + +sdlshare_CFLAGS=$(GST_PLUGINS_GL_CFLAGS) $(GST_CFLAGS) \ + $(GL_CFLAGS) $(SDL_CFLAGS) +sdlshare_LDADD=$(GST_PLUGINS_GL_LIBS) $(GST_LIBS) \ + $(GL_LIBS) $(SDL_LIBS) + +endif diff --git a/tests/examples/gl/sdl/sdl.sln b/tests/examples/gl/sdl/sdl.sln new file mode 100644 index 0000000..0ecdd00 --- /dev/null +++ b/tests/examples/gl/sdl/sdl.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sdlshare", "sdlshare.vcproj", "{2C29F5A2-5982-428A-8068-9A5788FD2277}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2C29F5A2-5982-428A-8068-9A5788FD2277}.Debug|Win32.ActiveCfg = Debug|Win32 + {2C29F5A2-5982-428A-8068-9A5788FD2277}.Debug|Win32.Build.0 = Debug|Win32 + {2C29F5A2-5982-428A-8068-9A5788FD2277}.Release|Win32.ActiveCfg = Release|Win32 + {2C29F5A2-5982-428A-8068-9A5788FD2277}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/examples/gl/sdl/sdlshare.c b/tests/examples/gl/sdl/sdlshare.c new file mode 100644 index 0000000..f54daf3 --- /dev/null +++ b/tests/examples/gl/sdl/sdlshare.c @@ -0,0 +1,380 @@ +/* + * GStreamer + * Copyright (C) 2009 Julien Isorce + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef WIN32 +#include +#endif + +#include +#include +#include "SDL/SDL.h" +#include "SDL/SDL_opengl.h" + +#ifndef WIN32 +#include +#include "SDL/SDL_syswm.h" +#endif + +#include + + +/* hack */ +typedef struct _GstGLBuffer GstGLBuffer; +struct _GstGLBuffer +{ + GstBuffer buffer; + + GObject *obj; + + gint width; + gint height; + GLuint texture; +}; + +/* rotation angle for the triangle. */ +float rtri = 0.0f; + +/* rotation angle for the quadrilateral. */ +float rquad = 0.0f; + +/* A general OpenGL initialization function. Sets all of the initial parameters. */ +static void +InitGL (int Width, int Height) // We call this right after our OpenGL window is created. +{ + glViewport (0, 0, Width, Height); + glClearColor (0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black + glClearDepth (1.0); // Enables Clearing Of The Depth Buffer + glDepthFunc (GL_LESS); // The Type Of Depth Test To Do + glEnable (GL_DEPTH_TEST); // Enables Depth Testing + glShadeModel (GL_SMOOTH); // Enables Smooth Color Shading + + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); // Reset The Projection Matrix + + gluPerspective (45.0f, (GLfloat) Width / (GLfloat) Height, 0.1f, 100.0f); // Calculate The Aspect Ratio Of The Window + + glMatrixMode (GL_MODELVIEW); +} + +/* The main drawing function. */ +static void +DrawGLScene (GstGLBuffer * gst_gl_buf) +{ + GLuint texture = gst_gl_buf->texture; + GLfloat width = (GLfloat) gst_gl_buf->width; + GLfloat height = (GLfloat) gst_gl_buf->height; + + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer + glLoadIdentity (); // Reset The View + + glTranslatef (-1.5f, 0.0f, -6.0f); // Move Left 1.5 Units And Into The Screen 6.0 + + glRotatef (rtri, 0.0f, 1.0f, 0.0f); // Rotate The Triangle On The Y axis + // draw a triangle (in smooth coloring mode) + glBegin (GL_POLYGON); // start drawing a polygon + glColor3f (1.0f, 0.0f, 0.0f); // Set The Color To Red + glVertex3f (0.0f, 1.0f, 0.0f); // Top + glColor3f (0.0f, 1.0f, 0.0f); // Set The Color To Green + glVertex3f (1.0f, -1.0f, 0.0f); // Bottom Right + glColor3f (0.0f, 0.0f, 1.0f); // Set The Color To Blue + glVertex3f (-1.0f, -1.0f, 0.0f); // Bottom Left + glEnd (); // we're done with the polygon (smooth color interpolation) + + glEnable (GL_TEXTURE_2D); + glBindTexture (GL_TEXTURE_2D, texture); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + + glLoadIdentity (); // make sure we're no longer rotated. + glTranslatef (1.5f, 0.0f, -6.0f); // Move Right 3 Units, and back into the screen 6.0 + + glRotatef (rquad, 1.0f, 0.0f, 0.0f); // Rotate The Quad On The X axis + // draw a square (quadrilateral) + glColor3f (0.5f, 0.5f, 1.0f); // set color to a blue shade. + glBegin (GL_QUADS); // start drawing a polygon (4 sided) + glTexCoord3f (0.0f, height, 0.0f); + glVertex3f (-1.0f, 1.0f, 0.0f); // Top Left + glTexCoord3f (width, height, 0.0f); + glVertex3f (1.0f, 1.0f, 0.0f); // Top Right + glTexCoord3f (width, 0.0f, 0.0f); + glVertex3f (1.0f, -1.0f, 0.0f); // Bottom Right + glTexCoord3f (0.0f, 0.0f, 0.0f); + glVertex3f (-1.0f, -1.0f, 0.0f); // Bottom Left + glEnd (); // done with the polygon + + glBindTexture (GL_TEXTURE_2D, 0); + + rtri += 1.0f; // Increase The Rotation Variable For The Triangle + rquad -= 1.0f; // Decrease The Rotation Variable For The Quad + + // swap buffers to display, since we're double buffered. + SDL_GL_SwapBuffers (); +} + +static gboolean +update_sdl_scene (void *fk) +{ + GstElement *fakesink = (GstElement *) fk; + GMainLoop *loop = + (GMainLoop *) g_object_get_data (G_OBJECT (fakesink), "loop"); + GAsyncQueue *queue_input_buf = + (GAsyncQueue *) g_object_get_data (G_OBJECT (fakesink), + "queue_input_buf"); + GAsyncQueue *queue_output_buf = + (GAsyncQueue *) g_object_get_data (G_OBJECT (fakesink), + "queue_output_buf"); + GstGLBuffer *gst_gl_buf = (GstGLBuffer *) g_async_queue_pop (queue_input_buf); + + SDL_Event event; + while (SDL_PollEvent (&event)) { + if (event.type == SDL_QUIT) { + g_main_loop_quit (loop); + } + if (event.type == SDL_KEYDOWN) { + if (event.key.keysym.sym == SDLK_ESCAPE) { + g_main_loop_quit (loop); + } + } + } + + DrawGLScene (gst_gl_buf); + + /* push buffer so it can be unref later */ + g_async_queue_push (queue_output_buf, gst_gl_buf); + + return FALSE; +} + +/* fakesink handoff callback */ +static void +on_gst_buffer (GstElement * fakesink, GstBuffer * buf, GstPad * pad, + gpointer data) +{ + GAsyncQueue *queue_input_buf = NULL; + GAsyncQueue *queue_output_buf = NULL; + + /* ref then push buffer to use it in sdl */ + gst_buffer_ref (buf); + queue_input_buf = + (GAsyncQueue *) g_object_get_data (G_OBJECT (fakesink), + "queue_input_buf"); + g_async_queue_push (queue_input_buf, buf); + if (g_async_queue_length (queue_input_buf) > 3) + g_idle_add (update_sdl_scene, (gpointer) fakesink); + + /* pop then unref buffer we have finished to use in sdl */ + queue_output_buf = + (GAsyncQueue *) g_object_get_data (G_OBJECT (fakesink), + "queue_output_buf"); + if (g_async_queue_length (queue_output_buf) > 3) { + GstBuffer *buf_old = (GstBuffer *) g_async_queue_pop (queue_output_buf); + gst_buffer_unref (buf_old); + } +} + +/* gst bus signal watch callback */ +static void +end_stream_cb (GstBus * bus, GstMessage * msg, GMainLoop * loop) +{ + switch (GST_MESSAGE_TYPE (msg)) { + + case GST_MESSAGE_EOS: + g_print ("End-of-stream\n"); + g_print + ("For more information, try to run: GST_DEBUG=gldisplay:2 ./sdlshare\n"); + break; + + case GST_MESSAGE_ERROR: + { + gchar *debug = NULL; + GError *err = NULL; + + gst_message_parse_error (msg, &err, &debug); + + g_print ("Error: %s\n", err->message); + g_error_free (err); + + if (debug) { + g_print ("Debug deails: %s\n", debug); + g_free (debug); + } + + break; + } + + default: + break; + } + + g_main_loop_quit (loop); +} + +int +main (int argc, char **argv) +{ + +#ifdef WIN32 + HGLRC sdl_gl_context = 0; + HDC sdl_dc = 0; +#else + SDL_SysWMinfo info; + Display *sdl_display = NULL; + Window sdl_win = 0; + GLXContext sdl_gl_context = NULL; +#endif + + GMainLoop *loop = NULL; + GstPipeline *pipeline = NULL; + GstBus *bus = NULL; + GstElement *glfilter = NULL; + GstElement *fakesink = NULL; + GstState state; + GAsyncQueue *queue_input_buf = NULL; + GAsyncQueue *queue_output_buf = NULL; + + /* Initialize SDL for video output */ + if (SDL_Init (SDL_INIT_VIDEO) < 0) { + fprintf (stderr, "Unable to initialize SDL: %s\n", SDL_GetError ()); + return -1; + } + + /* Create a 640x480 OpenGL screen */ + if (SDL_SetVideoMode (640, 480, 0, SDL_OPENGL) == NULL) { + fprintf (stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError ()); + SDL_Quit (); + return -1; + } + + /* Set the title bar in environments that support it */ + SDL_WM_SetCaption ("SDL and gst-plugins-gl", NULL); + + + /* Loop, drawing and checking events */ + InitGL (640, 480); + + gst_init (&argc, &argv); + loop = g_main_loop_new (NULL, FALSE); + + /* retrieve and turn off sdl opengl context */ +#ifdef WIN32 + sdl_gl_context = wglGetCurrentContext (); + sdl_dc = wglGetCurrentDC (); + wglMakeCurrent (0, 0); +#else + SDL_VERSION (&info.version); + SDL_GetWMInfo (&info); + sdl_display = info.info.x11.display; + sdl_win = info.info.x11.window; + sdl_gl_context = glXGetCurrentContext (); + glXMakeCurrent (sdl_display, None, 0); +#endif + + pipeline = + GST_PIPELINE (gst_parse_launch + ("videotestsrc ! video/x-raw, width=320, height=240, framerate=(fraction)30/1 ! " + "gleffects effect=5 ! fakesink sync=1", NULL)); + + bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); + gst_bus_add_signal_watch (bus); + g_signal_connect (bus, "message::error", G_CALLBACK (end_stream_cb), loop); + g_signal_connect (bus, "message::warning", G_CALLBACK (end_stream_cb), loop); + g_signal_connect (bus, "message::eos", G_CALLBACK (end_stream_cb), loop); + gst_object_unref (bus); + + /* sdl_gl_context is an external OpenGL context with which gst-plugins-gl want to share textures */ + glfilter = gst_bin_get_by_name (GST_BIN (pipeline), "gleffects0"); + g_object_set (G_OBJECT (glfilter), "external-opengl-context", + sdl_gl_context, NULL); + gst_object_unref (glfilter); + + /* NULL to PAUSED state pipeline to make sure the gst opengl context is created and + * shared with the sdl one */ + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); + state = GST_STATE_PAUSED; + if (gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL, + GST_CLOCK_TIME_NONE) != GST_STATE_CHANGE_SUCCESS) { + g_debug ("failed to pause pipeline\n"); + return -1; + } + + /* turn on back sdl opengl context */ +#ifdef WIN32 + wglMakeCurrent (sdl_dc, sdl_gl_context); +#else + glXMakeCurrent (sdl_display, sdl_win, sdl_gl_context); +#endif + + /* append a gst-gl texture to this queue when you do not need it no more */ + fakesink = gst_bin_get_by_name (GST_BIN (pipeline), "fakesink0"); + g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL); + g_signal_connect (fakesink, "handoff", G_CALLBACK (on_gst_buffer), NULL); + queue_input_buf = g_async_queue_new (); + queue_output_buf = g_async_queue_new (); + g_object_set_data (G_OBJECT (fakesink), "queue_input_buf", queue_input_buf); + g_object_set_data (G_OBJECT (fakesink), "queue_output_buf", queue_output_buf); + g_object_set_data (G_OBJECT (fakesink), "loop", loop); + gst_object_unref (fakesink); + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); + + g_main_loop_run (loop); + + /* before to deinitialize the gst-gl-opengl context, + * no shared context (here the sdl one) must be current + */ +#ifdef WIN32 + wglMakeCurrent (0, 0); +#else + glXMakeCurrent (sdl_display, sdl_win, sdl_gl_context); +#endif + + gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); + gst_object_unref (pipeline); + + /* turn on back sdl opengl context */ +#ifdef WIN32 + wglMakeCurrent (sdl_dc, sdl_gl_context); +#else + glXMakeCurrent (sdl_display, None, 0); +#endif + + SDL_Quit (); + + /* make sure there is no pending gst gl buffer in the communication queues + * between sdl and gst-gl + */ + while (g_async_queue_length (queue_input_buf) > 0) { + GstBuffer *buf = (GstBuffer *) g_async_queue_pop (queue_input_buf); + gst_buffer_unref (buf); + } + + while (g_async_queue_length (queue_output_buf) > 0) { + GstBuffer *buf = (GstBuffer *) g_async_queue_pop (queue_output_buf); + gst_buffer_unref (buf); + } + + return 0; +} diff --git a/tests/examples/gl/sdl/sdlshare.vcproj b/tests/examples/gl/sdl/sdlshare.vcproj new file mode 100644 index 0000000..760b349 --- /dev/null +++ b/tests/examples/gl/sdl/sdlshare.vcproj @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.7.4

2b(W# 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