[gst-devel] Problem to run a mpeg file both with code nd pipeline

soma dutta banik dbsoma at gmail.com
Mon Aug 22 22:14:07 CEST 2005


Hi all,
I ve tried to run an mpeg file with the pipeline as 
gst-launch filesrc location=/home/soma/dip.mpg ! mpegdemux name=s
s.audio_00 ! { queue ! mad ! osssink} s.video_00 ! {queue ! mpeg2dec !
sdlvideosink}

But it only shows that RUNNING pipeline....but don't show any
mpegfile...even it also doesn't run the audio part of the mpeg
file....

I also tried with the c code to run the mpeg file....and see that
control doesn't enter the corresponding signal function (here
cb_signal) of the mpegdemux.....
Please help me.....

The C code is
=====================================
#include <gst/gst.h>
#include <string.h>

static void
cb_signal(GstElement *demux, GstPad *pad, GstElement *main_thread)
{
	g_print ("New pad %s created\n", gst_pad_get_name (pad));
	if (!strncmp("video_", gst_pad_get_name (pad), 6)) {
		GstElement *vid_q, *vid_dec, *vid_sink, *vid_bin;

		vid_bin = gst_thread_new ("vid_bin");
		vid_q = gst_element_factory_make ("queue", "vid_q");
		vid_dec = gst_element_factory_make ("mpeg2dec" , "vid_dec");
		vid_sink = gst_element_factory_make ("videomixer", "vid_sink");

		gst_bin_add_many(GST_BIN(vid_bin), vid_q, vid_dec, vid_sink, NULL);
		gst_element_link_many(vid_q, vid_dec, vid_sink, NULL);

		gst_element_add_ghost_pad(vid_bin,
				 gst_element_get_pad(vid_q, "sink"), "sink");
	//	gst_bin_add(GST_BIN(main_thread), vid_bin); 
		gst_pad_link(pad, gst_element_get_pad(vid_bin, "sink"));
		g_print("%s:%d\n",__FUNCTION__,__LINE__);
		gst_element_set_state(GST_ELEMENT(vid_bin), GST_STATE_PLAYING);
		g_print("%s:%d\n",__FUNCTION__,__LINE__);

	} else if (!strncmp("audio_", gst_pad_get_name (pad), 6)) {
		GstElement *aud_q, *aud_dec, *aud_sink, *aud_bin;

		aud_bin = gst_thread_new("aud_bin");
		aud_q = gst_element_factory_make("queue", "aud_q");
		aud_dec = gst_element_factory_make("mad" , "aud_dec");
		aud_sink = gst_element_factory_make("osssink", "aud_sink");

		gst_bin_add_many(GST_BIN(aud_bin), aud_q,
				aud_dec, aud_sink, NULL);
		gst_element_link_many(aud_q, aud_dec, aud_sink, NULL);

		gst_element_add_ghost_pad(aud_bin,
				 gst_element_get_pad(aud_q, "sink"), "sink");

		//gst_bin_add(GST_BIN(main_thread), GST_ELEMENT(aud_bin)); 
		gst_pad_link(pad, gst_element_get_pad(aud_bin, "sink"));

		gst_element_set_state(GST_ELEMENT(aud_bin), GST_STATE_PLAYING);
	} else {
		g_print("Unhandled case\n");
	}
}

int main (int argc, char *argv[])
{
	GstElement *src, *demux, *main_thread;
	if (argc !=2) {
		g_print("Usage: ./a.out <MPEG Filename>\n");
		return 0;
	}

	gst_init(&argc, &argv);

	main_thread = gst_thread_new("main_thread");
	
	src = gst_element_factory_make ("filesrc", "src");
	g_object_set(G_OBJECT(src), "location", argv[1], NULL);
	demux = gst_element_factory_make ("mpegdemux", "demux");
	g_print("%s:%d\n",__FUNCTION__,__LINE__);
	g_signal_connect(G_OBJECT(demux), "new-pad",
			G_CALLBACK(cb_signal), main_thread);
	g_print("%s:%d\n",__FUNCTION__,__LINE__);
	gst_bin_add(GST_BIN(main_thread), src);
	gst_bin_add(GST_BIN(main_thread), demux);
	gst_element_link(src, demux);
	
	g_print("%s:%d\n",__FUNCTION__,__LINE__);
	gst_element_set_state(GST_ELEMENT(main_thread), GST_STATE_PLAYING);
	g_print("Iterating over pipeline\n");
	while (gst_bin_iterate (GST_BIN (main_thread)));

	gst_object_unref (GST_OBJECT (main_thread));
	exit(0);
}
=============================
Thanks,
Soma




More information about the gstreamer-devel mailing list