[gst-devel] gstreamer problem

sangita pithadia sangitapithadia at gmail.com
Tue Sep 25 14:18:19 CEST 2007


I m trying to play MPEG TS using gstreamer pipeline.
This is the pipeline which i have used to playback the file. It works fine.

gst-launch -v filesrc
location=/root/GStremerDir/gstreamer-0.10.13/ed24p_00.ts !
ffdemux_mpegts ! ffdec_mpeg2video ! queue ! videoscale !
ffmpegcolorspace ! xvimagesink

Same thing i tried to do using the code but it doesnt play.
my code is like..

#include<stdio.h>#define SOURCE "filesrc"#define VSINK
"xvimagesink"#define ASINK "alsasink"#include <stdlib.h>#include
<glib.h>*//#include <gtk/gtk.h>*#include <gst/gst.h>#include
const gchar * location = "file:///root/GStremerDir/ed24p_00.ts";static
GList *seekable_pads = NULL;static GList *rate_pads = NULL;static
GstElement *pipeline;static GList *seekable_elements = NULL;*typedef*
	const gchar *padname;
	GstPad *target;
	GstElement *bin;
static gboolean
bus_call (GstBus     *bus,
	  GstMessage *msg,
	  gpointer    data)
  GMainLoop *loop = (GMainLoop *) data;

  *switch* (GST_MESSAGE_TYPE (msg)) {
    *case* GST_MESSAGE_EOS:
      g_print ("End-of-stream\n");
      g_main_loop_quit (loop);
    *case* GST_MESSAGE_ERROR: {
      gchar *debug;
      GError *err;

      gst_message_parse_error (msg, &err, &debug);
      g_free (debug);

      g_print ("Error: %s\n", err->message);
      g_error_free (err);

      g_main_loop_quit (loop);
static GstElement *
gst_element_factory_make_or_warn (gchar * type, gchar * name)
	GstElement *element = gst_element_factory_make (type, name);
	*if* (!element) {
	g_warning ("Failed to create element %s of type %s", name, type);
	*return* element;
}static void dynamic_link (GstPadTemplate * templ, GstPad * newpad,
gpointer data)
	gchar *padname;
	dyn_link *connect = (dyn_link *) data;
	padname = gst_pad_get_name (newpad);
	*if* (connect->padname == NULL || !strcmp (padname, connect->padname)) {
	*if* (connect->bin)
	gst_bin_add (GST_BIN (pipeline), connect->bin);
	gst_pad_link (newpad, connect->target);
	seekable_pads = g_list_prepend (seekable_pads, newpad);
	rate_pads = g_list_prepend (rate_pads, newpad);
	g_free (padname);
static void setup_dynamic_link (GstElement * element, const gchar * padname,
    GstPad * target, GstElement * bin)
	dyn_link *connect;
	connect = g_new0 (dyn_link, 1);
	connect->padname = g_strdup (padname);
	connect->target = target;
	connect->bin = bin;
	g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link),
}int main(int argc,char *argv[])
	static GstElement *bin;	
	GstBus *bus;
	GMainLoop *loop;
	GstElement *pipeline, *audio_bin, *video_bin;
	GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
	GstElement *audiosink, *videosink;
	GstElement *a_queue, *v_queue, *v_scale;
	GstPad *seekable;
	GstPad *pad;
	gst_init (&argc, &argv);
	loop = g_main_loop_new (NULL, FALSE);
	*if* (argc != 2)
   		g_print ("Usage: %s <AVI file>\n", argv[0]);
   		*return* -1;

	pipeline = gst_pipeline_new ("app");
	src = gst_element_factory_make_or_warn (SOURCE, "src");
	g_object_set (G_OBJECT (src), "location", argv[1], NULL);
	*//demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");*
	demux = gst_element_factory_make_or_warn ("ffdemux_mpegts", "demux");
	gst_bin_add (GST_BIN (pipeline), src);
	gst_bin_add (GST_BIN (pipeline), demux);
	gst_element_link (src, demux);
	audio_bin = gst_bin_new ("a_decoder_bin");
	a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
	a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
	audiosink = gst_element_factory_make_or_warn (ASINK, "a_sink");
	gst_bin_add (GST_BIN (audio_bin), a_decoder);
	gst_bin_add (GST_BIN (audio_bin), a_queue);
	gst_bin_add (GST_BIN (audio_bin), audiosink);
	gst_element_link (a_decoder, a_queue);
	gst_element_link (a_queue, audiosink);
	gst_bin_add (GST_BIN (pipeline), audio_bin);
	pad = gst_element_get_pad (a_decoder, "sink");
	gst_element_add_pad (audio_bin, gst_ghost_pad_new ("sink", pad));
	gst_object_unref (pad);
	setup_dynamic_link (demux, "audio_c0", gst_element_get_pad (audio_bin,
		"sink"), NULL);
	video_bin = gst_bin_new ("v_decoder_bin");
	v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
	v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
	v_scale = gst_element_factory_make_or_warn ("videoscale", "v_scale");
	v_filter = gst_element_factory_make_or_warn ("ffmpegcolorspace", "v_filter");
	videosink = gst_element_factory_make_or_warn (VSINK, "v_sink");
	gst_bin_add (GST_BIN (video_bin), v_decoder);
	gst_bin_add (GST_BIN (video_bin), v_queue);
	gst_bin_add (GST_BIN (video_bin), v_scale);
	gst_bin_add (GST_BIN (video_bin), v_filter);
	gst_bin_add (GST_BIN (video_bin), videosink);
	gst_element_link (v_decoder, v_queue);
	gst_element_link (v_queue, v_scale);
	gst_element_link (v_scale, v_filter);
	gst_element_link (v_filter, videosink);
	gst_bin_add (GST_BIN (pipeline), video_bin);
	pad = gst_element_get_pad (v_decoder, "sink");
	gst_element_add_pad (video_bin, gst_ghost_pad_new ("sink", pad));
	gst_object_unref (pad);
	setup_dynamic_link (demux, "video_e0", gst_element_get_pad (video_bin,
		"sink"), NULL);
	/*seekable = gst_element_get_pad (v_filter, "src");
	seekable_pads = g_list_prepend (seekable_pads, seekable);
	rate_pads = g_list_prepend (rate_pads, seekable);
	rate_pads =
	g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));*/

	bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  	gst_bus_add_watch (bus, bus_call, loop);
	gst_element_set_state (pipeline, GST_STATE_PLAYING);
	*/* now run */*
	g_main_loop_run (loop);

	gst_element_set_state (pipeline, GST_STATE_NULL);
  	gst_object_unref (GST_OBJECT (pipeline));
	gst_object_unref (bus);
  	exit (0);

Can anyone tell me what can be the cause of this.

Thanks in advance.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20070925/8c97b8cb/attachment.htm>

More information about the gstreamer-devel mailing list