OUTDATED, methods have different names now
------------------------------------------


Here's a pipeline that does audio/video MPEG streams with a queue on
either side of each decompressor, for a total of 5 threads (read/split,
decode audio, decode video, play audio, play video):

NOTES: mpegsplit is the intelligence in this pipeline, providing an IDL
that allows one to connect things to a GUI.  

Pipeline(mpegplay)
	Thread(reader)
		Element(:disk_async_src) [StreamerAsyncSrc]
			OutPad(disk1)
		Element(:mpegsplit)
			InPad(disk1)
			OutPad(audio1)
			OutPad(video1)

	Queue(audioQ1)
		InPad(audio1)
		OutPad(audio2)
	Thread(audiodecode)
		Element(:mpeg_audio_decode) [StreamerVideoFilter]
			InPad(audio2)
			OutPad(audio3)
	Queue(audioQ2)
		InPad(audio3)
		OutPad(audio4)
	Thread(audioplay)
		Element(:audio_play) [StreamerAudioSink]
			InPad(audio4)

	Queue(videoQ1)
		InPad(video1)
		OutPad(video2)
	Thread(videodecode)
		Element(:mpeg_video_decode) [StreamerVideoFilter]
			InPad(video2)
			OutPad(video3)
	Queue(videoQ2)
		InPad(video3)
		OutPad(video4)
	Thread(videoplay)
		Element(:video_play) [StreamerVideoSink]
			InPad(video4)


A simpler pipeline that just does MPEG videos:

Pipeline(mpegplay)
	Thread(reader)
		Element(:disk_async_src) [GstAsyncSrc]
			OutPad(disk1)
		Element(:mpeg_control)
			InPad(disk1)
			OutPad(video1)
		Element(:mpeg_video_decode) [GstVideoFilter]
			InPad(video1)
			InPad(video2)
	Queue(queue)
		InPad(video2)
		OutPad(video3)
	Thread(play)
		Element(:video_play) [GstVideoSink]
			InPad(video3)

The code for the above looks roughly like:

/* all the objects we're worried about */
GstPipeline *mpegplay;
GstThread *reader;
GstSrc *disk_src;
GstControl *mpeg_control;
GstFilter *mpeg_video_decode;
GstQueue *queue;
GstThread *play;
GstSink *video_play;

/*** first we create all of the objects ***/

mpegplay = gst_pipeline_new();
reader = gst_thread_new();
disk_src = gst_async_disk_src_new("filename.mpg");
mpeg_control = gst_mpeg_control_new();
mpeg_video_decode = gst_mpeg_video_decode_new();
queue = gst_queue_new();
play = gst_thread_new();
video_play = gst_video_sink_new();


/*** now we start to create the pipeline ***/

/* first set up the reader thread */
gst_bin_add(reader,disk_src);
gst_object_connect(disk_src,"out",mpeg_control,"in");
gst_object_connect(mpeg_control,"out",mpeg_audio_decode,"in");
gst_bin_ghost_pad(reader,mpeg_audio_decode,"out");

/* then set up the player thread */
gst_bin_add(play,audio_play);
gst_bin_ghost_pad(play,audio_play,"in");

/* now plug them all into the main pipeline */
gst_bin_add(mp3play,reader);
gst_object_connect(reader,"out",queue,"in");
gst_object_connect(queue,"out",play,"in");