Use of gstAppSrc and VDPAU treatment...

Jérémy Lauraire jeremy.lauraire at
Mon Jul 4 08:14:15 PDT 2011


I am facing difficulties with the use of gstAppSrc : my idea is to feed the
pipeline with buffer that I have already treated from a streaming flow (data
are in an avpacket => and avPacket.size....).

I've try to follow API explanations and examples to implement my application
but i still have a green display...  What am I doing wrong?

1 - I have succesfully tested the pipeline with cmd line,
2 - I defined the GstAppSrc's caps... but still not sure... The stream is a
mpeg2 video with mepgTS container.
3 - Is it an incompatible format pixel....?
4 - It works with a raw format and the simple pipeline :
         appsrc -> autovideosink

Here is part of my code :

      GMainLoop *loop;
      GstBus *bus;

      GstElement *pipeline, *appsrc, *demuxer, *decoder, *postprocess,
      loop = g_main_loop_new (NULL, FALSE);

      /* Create gstreamer elements */
      pipeline    = gst_pipeline_new ("pipeline");
      appsrc      = gst_element_factory_make ("appsrc", "app-src");
      decoder     = gst_element_factory_make ("vdpaumpegdec",
      demuxer     = gst_element_factory_make ("mpegtsdemux", "mpeg-demux");
      postprocess = gst_element_factory_make ("vdpauvideopostprocess",
      videosink   = gst_element_factory_make ("vdpausink", "vdpau-sink");

      /* set the capabilities of the appsrc element */
      GstCaps *caps = gst_caps_new_simple ("video/mpeg",
                              "width", G_TYPE_INT, 720,
                              "height", G_TYPE_INT, 576,
                              "framerate", GST_TYPE_FRACTION, 25, 1,
                              "bpp", G_TYPE_INT, 16,
                              "depth", G_TYPE_INT, 16,
                              "endianness", G_TYPE_INT, G_BYTE_ORDER,

      gst_app_src_set_caps(GST_APP_SRC(appsrc), caps);

      /* we add all elements into the pipeline */
      /* we link the elements together */
      gst_element_link (appsrc, demuxer);
      gst_element_link_many (decoder, postprocess, videosink, NULL);
      g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added),

      /* play */
      gst_element_set_state (pipeline, GST_STATE_PLAYING);

      /* create the buffer */
      GstBuffer *buffer = gst_buffer_new();
      GST_BUFFER_DATA (buffer) =; // Data from the original
      GST_BUFFER_SIZE (buffer) = _avPacket.size; // Size of the original
      printf("BUFFER_SIZE = %d \n", _avPacket.size);

      /* push the buffer to pipeline via appsrc */
      GstFlowReturn gstFlowReturn =
gst_app_src_push_buffer(GST_APP_SRC(appsrc), buffer);

      /* and loop... */
      g_main_loop_run (loop);

      /* clean up */
      gst_element_set_state (pipeline, GST_STATE_NULL);
      gst_object_unref (GST_OBJECT (pipeline));


Thanks for your help!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the gstreamer-devel mailing list