mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 13:41:48 +00:00
105 lines
2.5 KiB
Text
105 lines
2.5 KiB
Text
|
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");
|