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");