communication between multiple gstreamer pipeline/apps

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

communication between multiple gstreamer pipeline/apps

timothe jahan
Dears,
I want to make an application (maybe) based on gstreamer for some video audio live encoding.
One of my problems is that it will be spread on multiple computers and I need to pass audio/video streams between them.

I want to be able to launch them sequentially (the source first, then the next step).
My best candidates to communicate between the different pipeline are tcpserversink and tcpclientsrc.

Therefore I make a test case :

gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234

gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 ! oggdemux ! theoradec  ! autovideosink

However here is what I get when I launch the server:
Définition du pipeline à PAUSED...
Le pipeline est en phase de PREROLL...
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
New clock: GstSystemClock
ERREUR : de l'élément /pipeline0/tcpserversink0 : Internal GStreamer error: negotiation problem.  Please file a bug at http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer.
Information de débogage supplémentaire :
gstmultifdsink.c(2506): gst_multi_fd_sink_render (): /pipeline0/tcpserversink0:
Received first buffer without caps set
Execution ended after 222178 ns.
Définition du pipeline à PAUSED...
Définition du pipeline à READY (prêt)...
Définition du pipeline à NULL...
Libération du pipeline (FREE)...

If I try to do the demuxing and decoding on the server side I have following commands:
gst-launch filesrc location=./testfile.ogg ! oggdemux ! theoradec ! tcpserversink port=1234

gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 ! autovideosink
Here it does not crash but I do not get any video displayed.

Does anybody has an idea, or any better way to pass streams between pipelines ?

Many thanks
Timothe




_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: communication between multiple gstreamer pipeline/apps

Tim-Philipp Müller-2
Hi,

> gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234
>
> gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 !
> oggdemux ! theoradec  ! autovideosink
>
> However here is what I get when I launch the server:
> DRREUR : de l'élément /pipeline0/tcpserversink0 : Internal GStreamer
> error: negotiation problem.

Try adding an ffmpegcolorspace ! videoscale before the videosink. If
that doesn't help, also try a typefind element before oggdemux.


> If I try to do the demuxing and decoding on the server side I have
> following commands:
> gst-launch filesrc location=./testfile.ogg ! oggdemux ! theoradec !
> tcpserversink port=1234
>
> gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 !
> autovideosink
> Here it does not crash but I do not get any video displayed.

Sending raw video/pixels over the network is usually a bad idea. In this
case, you will not only loose the framing, but also the timing
information, and the caps. You can use a videoparse to work around that,
but it's not really a great solution. You could also use gdppay before
sending the data and then gdpdepay on the receiving side, that will
maintain most info (but the timestamps may need fixing up then).
>
> Does anybody has an idea, or any better way to pass streams between
> pipelines ?

Maybe you could describe the bigger picture of what you're trying to do?

Cheers
 -Tim



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: communication between multiple gstreamer pipeline/apps

timothe jahan
Hi,
Thank you for the fast answer, however I have the impression that there is a misunderstanding.
The command that fails is the server one, meaning :
gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234
So I do  not even have time to launch the client side. I believe that the ffmpegcolorspace ! videoscale you proposed is for the client side (the one who should actually display the video).
So if you would have any other idea ... 

I am also not in favor at all of sending raw data but I just made it as a try in case of.

About the global picture, I have a 8 audio channel capture card and a video capture card.
What I am to achieve (LIVE !!!) is resampling the 8 audio channels to be in sync with the video (I am planning to write a gstreamer module for that) then encode all streams (video/audios) in mpeg2 for multichannel dvd, h264/AAC for live mp4 streaming and all audios also in mp3 for mp3 CDs.
I need to do it live because everything needs to be available right after the performance.
As you can imagine I would need a monster PC to do all that on one, that's the reason why my first step is to find a protocol to send the streams at the different stages of the process.

Timothé
PS: I took an theora file for my test though this is not the codec I'll use but as I said my first step is to define how to communicate.
 

On Sat, Mar 26, 2011 at 12:05 AM, Tim-Philipp Müller <[hidden email]> wrote:
Hi,

> gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234
>
> gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 !
> oggdemux ! theoradec  ! autovideosink
>
> However here is what I get when I launch the server:
> DRREUR : de l'élément /pipeline0/tcpserversink0 : Internal GStreamer
> error: negotiation problem.

Try adding an ffmpegcolorspace ! videoscale before the videosink. If
that doesn't help, also try a typefind element before oggdemux.


> If I try to do the demuxing and decoding on the server side I have
> following commands:
> gst-launch filesrc location=./testfile.ogg ! oggdemux ! theoradec !
> tcpserversink port=1234
>
> gst-launch tcpclientsrc protocol=none host=127.0.0.1 port=1234 !
> autovideosink
> Here it does not crash but I do not get any video displayed.

Sending raw video/pixels over the network is usually a bad idea. In this
case, you will not only loose the framing, but also the timing
information, and the caps. You can use a videoparse to work around that,
but it's not really a great solution. You could also use gdppay before
sending the data and then gdpdepay on the receiving side, that will
maintain most info (but the timestamps may need fixing up then).
>
> Does anybody has an idea, or any better way to pass streams between
> pipelines ?

Maybe you could describe the bigger picture of what you're trying to do?

Cheers
 -Tim



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: communication between multiple gstreamer pipeline/apps

Tim-Philipp Müller-2
On Sat, 2011-03-26 at 10:43 +0100, timothe jahan wrote:

Hi,

> Thank you for the fast answer, however I have the impression that
> there is a misunderstanding.
> The command that fails is the server one, meaning :
> gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234

Ah, sorry, you're right. Should've been obvious from the error message,
but I just saw 'not-negotiated' and started going after the usual
suspects, completely missing the 'gstmultifdsink.c(2506):
gst_multi_fd_sink_render (): /pipeline0/tcpserversink0: Received first
buffer without caps set' bit.

So tcpserversink wants caps set on buffers fed to it. Generally the
easiest way to do that would be to put a typefind element after filesrc.

In this case, however, you probably want to use an oggparse element
after filesrc. This should not only put proper caps with stream headers
on the buffers, but also set timestamps on buffers (in case you want to
throttle sending the data).

Cheers
 -Tim



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: communication between multiple gstreamer pipeline/apps

timothe jahan
Hi,
oggparse and typefind seems indeed to solve that first issue, but a new one appears.
the new command is:
gst-launch-0.10 --gst-debug-level=2 filesrc location=./testfile.ogg ! oggparse ! tcpserversink port=1234
now it fails as follow:
Définition du pipeline à PAUSED...
Le pipeline est en phase de PREROLL...
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
New clock: GstSystemClock
EOS reçu de l'élément « pipeline0 ».
Execution ended after 8509877 ns.
Définition du pipeline à PAUSED...
Définition du pipeline à READY (prêt)...
Définition du pipeline à NULL...
0:00:00.115279949 16709 0x8069060 WARN           multifdsink gstmultifdsink.c:2291:gst_multi_fd_sink_handle_clients:<tcpserversink0> wait failed: Périphérique ou ressource occupé (16)
Libération du pipeline (FREE)...
For some reason it seems to get an end of stream from the beginning. To be sure my file is not wrongly formed I tried with the bunny example (http://en.wikipedia.org/wiki/File:Big_Buck_Bunny_extract.ogg) but same.

If I set the debug level to 3 I can see following lines (amongst many others !!):
0:00:00.130223762 16923 0x804e050 INFO             GST_EVENT gstevent.c:942:gst_event_new_latency: creating latency event 0:00:00.000000000
0:00:00.130298217 16923 0x804e050 INFO                   bin gstbin.c:2069:do_bin_latency:<pipeline0> configured latency of 0:00:00.000000000
0:00:00.144386914 16923 0x8157b38 INFO               basesrc gstbasesrc.c:2056:gst_base_src_loop:<filesrc0> pausing after gst_base_src_get_range() = unexpected
0:00:00.144424840 16923 0x8157b38 INFO              GST_PADS gstpad.c:2933:gst_pad_event_default_dispatch:<oggparse0:sink> Sending event 0x804fd68 (eos) to all internally linked pads
0:00:00.144473103 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<tcpserversink0> completed state change to PLAYING
0:00:00.144490773 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<tcpserversink0> posting state-changed PAUSED to PLAYING
0:00:00.144526744 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'tcpserversink0' changed state to 4(PLAYING) successfully
0:00:00.144548256 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<oggparse0> completed state change to PLAYING
0:00:00.144561666 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<oggparse0> posting state-changed PAUSED to PLAYING
0:00:00.144586392 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'oggparse0' changed state to 4(PLAYING) successfully
0:00:00.144606926 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<filesrc0> completed state change to PLAYING
0:00:00.144626203 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<filesrc0> posting state-changed PAUSED to PLAYING
0:00:00.144646039 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'filesrc0' changed state to 4(PLAYING) successfully
0:00:00.144663640 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<pipeline0> completed state change to PLAYING
0:00:00.144676422 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<pipeline0> posting state-changed PAUSED to PLAYING
New clock: GstSystemClock
EOS reçu de l'élément « pipeline0 ».
Execution ended after 102184 ns.
Définition du pipeline à PAUSED...

So it seems that the oggparse (or typefind for the other case) sends the EOS before the end of the file.
What could generate that ?

Many thanks,
Timothé


On Sat, Mar 26, 2011 at 1:15 PM, Tim-Philipp Müller <[hidden email]> wrote:
On Sat, 2011-03-26 at 10:43 +0100, timothe jahan wrote:

Hi,

> Thank you for the fast answer, however I have the impression that
> there is a misunderstanding.
> The command that fails is the server one, meaning :
> gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234

Ah, sorry, you're right. Should've been obvious from the error message,
but I just saw 'not-negotiated' and started going after the usual
suspects, completely missing the 'gstmultifdsink.c(2506):
gst_multi_fd_sink_render (): /pipeline0/tcpserversink0: Received first
buffer without caps set' bit.

So tcpserversink wants caps set on buffers fed to it. Generally the
easiest way to do that would be to put a typefind element after filesrc.

In this case, however, you probably want to use an oggparse element
after filesrc. This should not only put proper caps with stream headers
on the buffers, but also set timestamps on buffers (in case you want to
throttle sending the data).

Cheers
 -Tim



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: communication between multiple gstreamer pipeline/apps

timothe jahan
Any additional idea ?

Many thanks, 
Timothe

On Sat, Mar 26, 2011 at 1:43 PM, timothe jahan <[hidden email]> wrote:
Hi,
oggparse and typefind seems indeed to solve that first issue, but a new one appears.
the new command is:
gst-launch-0.10 --gst-debug-level=2 filesrc location=./testfile.ogg ! oggparse ! tcpserversink port=1234
now it fails as follow:
Définition du pipeline à PAUSED...
Le pipeline est en phase de PREROLL...
Le pipeline a terminé la phase PREROLL...
Passage du pipeline à la phase PLAYING...
New clock: GstSystemClock
EOS reçu de l'élément « pipeline0 ».
Execution ended after 8509877 ns.
Définition du pipeline à PAUSED...
Définition du pipeline à READY (prêt)...
Définition du pipeline à NULL...
0:00:00.115279949 16709 0x8069060 WARN           multifdsink gstmultifdsink.c:2291:gst_multi_fd_sink_handle_clients:<tcpserversink0> wait failed: Périphérique ou ressource occupé (16)
Libération du pipeline (FREE)...
For some reason it seems to get an end of stream from the beginning. To be sure my file is not wrongly formed I tried with the bunny example (http://en.wikipedia.org/wiki/File:Big_Buck_Bunny_extract.ogg) but same.

If I set the debug level to 3 I can see following lines (amongst many others !!):
0:00:00.130223762 16923 0x804e050 INFO             GST_EVENT gstevent.c:942:gst_event_new_latency: creating latency event 0:00:00.000000000
0:00:00.130298217 16923 0x804e050 INFO                   bin gstbin.c:2069:do_bin_latency:<pipeline0> configured latency of 0:00:00.000000000
0:00:00.144386914 16923 0x8157b38 INFO               basesrc gstbasesrc.c:2056:gst_base_src_loop:<filesrc0> pausing after gst_base_src_get_range() = unexpected
0:00:00.144424840 16923 0x8157b38 INFO              GST_PADS gstpad.c:2933:gst_pad_event_default_dispatch:<oggparse0:sink> Sending event 0x804fd68 (eos) to all internally linked pads
0:00:00.144473103 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<tcpserversink0> completed state change to PLAYING
0:00:00.144490773 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<tcpserversink0> posting state-changed PAUSED to PLAYING
0:00:00.144526744 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'tcpserversink0' changed state to 4(PLAYING) successfully
0:00:00.144548256 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<oggparse0> completed state change to PLAYING
0:00:00.144561666 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<oggparse0> posting state-changed PAUSED to PLAYING
0:00:00.144586392 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'oggparse0' changed state to 4(PLAYING) successfully
0:00:00.144606926 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<filesrc0> completed state change to PLAYING
0:00:00.144626203 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<filesrc0> posting state-changed PAUSED to PLAYING
0:00:00.144646039 16923 0x804e050 INFO            GST_STATES gstbin.c:2191:gst_bin_change_state_func:<pipeline0> child 'filesrc0' changed state to 4(PLAYING) successfully
0:00:00.144663640 16923 0x804e050 INFO            GST_STATES gstelement.c:2148:gst_element_continue_state:<pipeline0> completed state change to PLAYING
0:00:00.144676422 16923 0x804e050 INFO            GST_STATES gstelement.c:2161:gst_element_continue_state:<pipeline0> posting state-changed PAUSED to PLAYING
New clock: GstSystemClock
EOS reçu de l'élément « pipeline0 ».
Execution ended after 102184 ns.
Définition du pipeline à PAUSED...

So it seems that the oggparse (or typefind for the other case) sends the EOS before the end of the file.
What could generate that ?

Many thanks,
Timothé


On Sat, Mar 26, 2011 at 1:15 PM, Tim-Philipp Müller <[hidden email]> wrote:
On Sat, 2011-03-26 at 10:43 +0100, timothe jahan wrote:

Hi,

> Thank you for the fast answer, however I have the impression that
> there is a misunderstanding.
> The command that fails is the server one, meaning :
> gst-launch filesrc location=./testfile.ogg ! tcpserversink port=1234

Ah, sorry, you're right. Should've been obvious from the error message,
but I just saw 'not-negotiated' and started going after the usual
suspects, completely missing the 'gstmultifdsink.c(2506):
gst_multi_fd_sink_render (): /pipeline0/tcpserversink0: Received first
buffer without caps set' bit.

So tcpserversink wants caps set on buffers fed to it. Generally the
easiest way to do that would be to put a typefind element after filesrc.

In this case, however, you probably want to use an oggparse element
after filesrc. This should not only put proper caps with stream headers
on the buffers, but also set timestamps on buffers (in case you want to
throttle sending the data).

Cheers
 -Tim



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel