I am having some problems getting the dfbvideosink to play a video file. I was able to use the example provided and play from the test video source. After some searching I decided to try the playbin but I don’t get any video from that. How should I set up the pipeline? Here is what I have so far



#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;




main (int argc, char *argv[])


  DFBSurfaceDescription dsc;

  GstElement *pipeline, *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;



  DFBCHECK (dfb->CreateSurface (dfb, &dsc, &primary));


  /* Creating our pipeline : videotestsrc ! dfbvideosink */

  pipeline = gst_element_factory_make("playbin", NULL); //gst_pipeline_new (NULL);

  g_assert (pipeline);


  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);


  g_object_set(pipeline, "uri", "file:///root/test.mp4", NULL);

  g_object_set(pipeline, "video-sink", sink, NULL);


  /* 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;



The result is a brown screen (the default directfb color I think).


Thanks for your help