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;

}

 

int

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;

  dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

 

  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

-Jesse