[gst-devel] Newbie help. Cannot output audio/video simultaneously (with DirectFB)

Thijs Vermeir thijsvermeir at gmail.com
Tue Feb 26 11:30:47 CET 2008


Hello,

You have to add some queue element after the demuxer on both the audio
and video part.
Your pipeline must like this:
gst-launch filesrc location=movie.mpg !  mpegdemux name=demuxer
demuxer. ! queue ! mpeg2dec ! ffmpegcolorspace ! dfbvideosink
demuxer. ! queue ! mad ! audioconvert ! alsasink

Gr,
Thijs

On Tue, 2008-02-26 at 03:10 -0700, danielkun at iremo.com wrote:
> Hello,
> 	
> I'm new to Gstreamer and new to this mail subscription but I'm hoping
> someone will try to help me ;)
> 
> I trying to playback MPEG files using DirectFB. The code below does the
> job but it won't let me output
> video and audio at the same time. It's either audio only or video only. 
> 
> What have I not understood completely?
> 
> I put the src and the demuxer in the pipeline and made 2 bins for
> audio/video and added ghost pads.
> This seems to work well but not simultaneously.
> 
> I would appreciate any help.
> 
> Thanks,
> 
> Daniel
> 
> 
> 
> #include <string.h>
> #include <directfb.h>
> #include <gst/gst.h>
> 
> static IDirectFB *dfb = NULL;
> static IDirectFBSurface *primary = NULL;
> static GMainLoop *loop;
> 
> GstElement *pipeline, *bin_audio, *bin_video, *source, *parser,
> *decoder_audio, *decoder_video,
> 										*convert_audio, *convert_video, *sink_audio, *sink_video;
> 
> GstPad *pad_video, *pad_audio;
> 
> #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;
> }
> 
> 
> static void
> new_pad (GstElement *element,
> 		 GstPad     *pad,	//src
> 	 	 gpointer    data)
> {
> 
>   gchar *name;
>   name = gst_pad_get_name (pad);
>   
>   if ( NULL != strstr(name, "video"))
>   {
>   	GstPad *sinkpad;	//sink
>   	g_print ("Dynamic pad created, linking parser/decoder '%s'\n", name);
>   	sinkpad = gst_element_get_pad (bin_video, "sink");
>   	gst_pad_link (pad, sinkpad);
>   	gst_object_unref (sinkpad);
>   }
> 
>   if ( NULL != strstr(name, "audio"))
>   {
>   	GstPad *sinkpad;	//sink
>   	g_print ("Dynamic pad created, linking parser/decoder '%s'\n", name);
> 	sinkpad = gst_element_get_pad (bin_audio, "sink");
>   	gst_pad_link (pad, sinkpad);
>   	gst_object_unref (sinkpad);
>   }
> 
> }
> 
> int 
> main (int argc, char *argv[])
> {
>   DFBSurfaceDescription dsc;
>   GstBus *bus;
> 
> 
>   /* Init both GStreamer and DirectFB */
>   DFBCHECK (DirectFBInit (&argc, &argv));
>   gst_init (&argc, &argv);
> 
>   loop = g_main_loop_new (NULL, FALSE);
> 
>   /* 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));
> 
> 
>   // create elements
>   pipeline = gst_pipeline_new (NULL);
>   bin_audio = gst_bin_new (NULL);
>   bin_video = gst_bin_new (NULL);
> 
>   source = gst_element_factory_make ("filesrc", NULL);	// videotestsrc
> 
>   parser = gst_element_factory_make ("mpegdemux", NULL);	// dvddemux,
> mpegparse, mpegvideoparse
> 
>   decoder_audio = gst_element_factory_make ("mad", NULL);
>   decoder_video = gst_element_factory_make ("mpeg2dec", NULL);
> 
>   convert_audio = gst_element_factory_make ("audioconvert", NULL);
>   convert_video = gst_element_factory_make("ffmpegcolorspace", NULL);
> 
>   sink_audio = gst_element_factory_make ("alsasink", NULL);
>   sink_video = gst_element_factory_make ("dfbvideosink", NULL);
> 
> 
>   // That's the interesting part, giving the primary surface to
> dfbvideosink
>   g_object_set (sink_video, "surface", primary, NULL);
> 
>   // set filename property on the file source
>   g_object_set (G_OBJECT (source), "location", argv[1], NULL);
> 
>   // add source and parser
>   gst_bin_add_many (GST_BIN (pipeline), source, parser, NULL);
> 
>   // put all elements in a bin
>   gst_bin_add_many (GST_BIN (bin_video), decoder_video, convert_video,
> sink_video, NULL);
>   gst_bin_add_many (GST_BIN (bin_audio), decoder_audio, convert_audio,
> sink_audio, NULL);
> 
> 
>   // add ghostpad to audio
>   pad_audio = gst_element_get_pad (decoder_audio, "sink");
>   gst_element_add_pad (bin_audio, gst_ghost_pad_new ("sink",
> pad_audio));
>   gst_object_unref (GST_OBJECT (pad_audio));
> 
>   // add ghostpad to video
>   pad_video = gst_element_get_pad (decoder_video, "sink");
>   gst_element_add_pad (bin_video, gst_ghost_pad_new ("sink",
> pad_video));
>   gst_object_unref (GST_OBJECT (pad_video));
> 
> 
>   // add bins to pipeline
>   gst_bin_add_many (GST_BIN (pipeline), bin_video, bin_audio, NULL);
> 
>   // link together - note that we cannot link the parser and decoder yet
>   gst_element_link (source, parser);
>   gst_element_link_many (decoder_video, convert_video, sink_video,
> NULL);
>   gst_element_link_many (decoder_audio, convert_audio, sink_audio,
> NULL);
> 
>   g_signal_connect (parser, "pad-added", G_CALLBACK (new_pad), NULL);
> 
> 
>   // Now set to playing and iterate.
>   g_print ("Setting to PLAYING\n");
>   gst_element_set_state (pipeline, GST_STATE_PLAYING);
> 
>   g_print ("Running\n");
> 
>   // Get us out after xx seconds
>   g_timeout_add (5000, 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);
> 
>   // clean up nicely
>   g_print ("Returned, stopping playback\n");
>   gst_element_set_state (pipeline, GST_STATE_NULL);
> 
>   g_print ("Deleting pipeline\n");
>   gst_object_unref (GST_OBJECT (pipeline));
> 
>   /* Release DirectFB context and surface */
>   primary->Release (primary);
>   dfb->Release (dfb);
> 
>   return 0;
> }
> 
> 
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel





More information about the gstreamer-devel mailing list