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