mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-03 16:09:39 +00:00
82 lines
2.4 KiB
C
82 lines
2.4 KiB
C
|
|
#include <directfb.h>
|
|
#include <stdio.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);
|
|
|
|
/* Free the main loop */
|
|
g_main_loop_unref (loop);
|
|
|
|
/* Release DirectFB context and surface */
|
|
primary->Release (primary);
|
|
dfb->Release (dfb);
|
|
|
|
return 0;
|
|
}
|