diff options
Diffstat (limited to 'ext/directfb/dfb-example.c')
-rw-r--r-- | ext/directfb/dfb-example.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ext/directfb/dfb-example.c b/ext/directfb/dfb-example.c new file mode 100644 index 00000000..3f455c92 --- /dev/null +++ b/ext/directfb/dfb-example.c @@ -0,0 +1,78 @@ + +#include <directfb.h> +#include <gst/gst.h> + +static IDirectFB *dfb = NULL; +static IDirectFBSurface *primary = NULL; +static GMainLoop *loop; + +#define DFBCHECK(x...) \ + { \ + DFBResult err = x; \ + \ + if (err != DFB_OK) \ + { \ + fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ + DirectFBErrorFatal( #x, err ); \ + } \ + } + +static gboolean +get_me_out (gpointer data) +{ + g_main_loop_quit (loop); + return FALSE; +} + +int +main (int argc, char *argv[]) +{ + DFBSurfaceDescription dsc; + GstElement *pipeline, *src, *sink; + + /* Init both GStreamer and DirectFB */ + DFBCHECK (DirectFBInit (&argc, &argv)); + gst_init (&argc, &argv); + + /* Creates DirectFB main context and set it to fullscreen layout */ + DFBCHECK (DirectFBCreate (&dfb)); + DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN)); + + /* We want a double buffered primary surface */ + dsc.flags = DSDESC_CAPS; + dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING; + + DFBCHECK (dfb->CreateSurface (dfb, &dsc, &primary)); + + /* Creating our pipeline : videotestsrc ! dfbvideosink */ + pipeline = gst_pipeline_new (NULL); + g_assert (pipeline); + src = gst_element_factory_make ("videotestsrc", NULL); + g_assert (src); + sink = gst_element_factory_make ("dfbvideosink", NULL); + g_assert (sink); + /* That's the interesting part, giving the primary surface to dfbvideosink */ + g_object_set (sink, "surface", primary, NULL); + + /* Adding elements to the pipeline */ + gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL); + g_assert (gst_element_link (src, sink)); + + /* Let's play ! */ + gst_element_set_state (pipeline, GST_STATE_PLAYING); + + /* we need to run a GLib main loop to get out of here */ + loop = g_main_loop_new (NULL, FALSE); + /* Get us out after 20 seconds */ + g_timeout_add (20000, get_me_out, NULL); + g_main_loop_run (loop); + + /* Release elements and stop playback */ + gst_element_set_state (pipeline, GST_STATE_NULL); + + /* Release DirectFB context and surface */ + primary->Release (primary); + dfb->Release (dfb); + + return 0; +} |