mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
d3b914ad91
Original commit message from CVS: added two more cases of eos reasoning
206 lines
8.6 KiB
Text
206 lines
8.6 KiB
Text
|
|
case 1)
|
|
|
|
(--------) (--------) (--------)
|
|
! fakesrc! !identity! !fakesink!
|
|
! src ----- sink src ---- sink !
|
|
(--------) (--------) (--------)
|
|
|
|
|
|
|
|
fakesrc detects the end of stream. It just sent the last buffer
|
|
and sets the srcpad to EOS with gst_pad_eos ().
|
|
|
|
gst_pad_eos() will notify the parent about the plugins attempt to
|
|
signal eos. the parent adds the element to its possible EOS
|
|
providers.
|
|
|
|
gst_pad_eos() will by default propagate to identy and to fakesink.
|
|
none of these plugins override the default behaviour so gst_pad_eos
|
|
returns TRUE and fakesrc signals EOS with the value TRUE.
|
|
|
|
The parent looks in the list of EOS providers and finds the faksrc
|
|
element that is now signaling EOS. all EOS providers are now in EOS
|
|
and so the bin fires EOS.
|
|
|
|
|
|
|
|
case 2)
|
|
(---------------)
|
|
!thread !
|
|
(--------) (--------) (--------) ! (--------)!
|
|
! fakesrc! !identity! ! queue ! ! !fakesink!!
|
|
! src ----- sink src ---- sink src ---- sink !!
|
|
(--------) (--------) (--------) ! (--------)!
|
|
(---------------)
|
|
|
|
|
|
fakesrc detects the end of stream. It just sent the last buffer
|
|
and sets the srcpad to EOS with gst_pad_eos ().
|
|
|
|
gst_pad_eos() will notify the parent about the plugins attempt to
|
|
signal eos. the parent adds the element to its possible EOS
|
|
providers.
|
|
|
|
gst_pad_eos() will by default propagate to identy and to queue.
|
|
queue overrides the eos handler and returns false on the eos
|
|
request. fakesrc signals EOS with a value of false and the parent
|
|
bin removes the EOS provider from its list.
|
|
|
|
after the queue has sent out the last buffer, its calls eos on its
|
|
src pad. queue is added to the top level bin as an eos provider and
|
|
the default eos handler signals EOS with a value of TRUE to the parent.
|
|
|
|
the parent sees that all the eos providers are in eos now and signals
|
|
EOS.
|
|
|
|
|
|
case 3)
|
|
(---------------)
|
|
!thread !
|
|
(--------) (--------) (--------) ! (--------)!
|
|
! fakesrc! ! tee ! ! queue1 ! ! !fakesink!!
|
|
! src ----- sink src ---- sink src ---- sink !!
|
|
(--------) ! ! (--------) ! (--------)!
|
|
! ! (---------------)
|
|
! !
|
|
! ! (---------------)
|
|
! ! !thread !
|
|
! ! (--------) ! (--------)!
|
|
! ! ! queue2 ! ! !fakesink!!
|
|
! src ---- sink src ---- sink !!
|
|
! ! (--------) ! (--------)!
|
|
(--------) (---------------)
|
|
|
|
|
|
fakesrc detects the end of stream. It just sent the last buffer
|
|
and sets the srcpad to EOS with gst_pad_eos ().
|
|
|
|
the eos handler returns false because both queues return false on the
|
|
eos request. the parent removes fakesrc as an EOS provider.
|
|
|
|
queue1 and queue2 were responisble for the EOS delay and so they get
|
|
added to the bin as possible EOS providers.
|
|
|
|
after the queues have sent out their last buffer, they calls eos on their
|
|
src pads.
|
|
the parent allready has the two queues in the EOS provider list so they dont
|
|
get added twice.
|
|
the two queues perform gst_pad_eos () on their pads when the queue is empty,
|
|
the parent removes the EOS providers from its list, when the list is empty,
|
|
the parent fires EOS.
|
|
|
|
|
|
case 4)
|
|
|
|
(---------------)
|
|
!thread !
|
|
(--------) (----------) (--------) ! (--------)!
|
|
! fakesrc! !mpeg1parse! ! queue1 ! ! !fakesink!!
|
|
! src -- sink src ---- sink src ---- sink !!
|
|
(--------) ! ! (--------) ! (--------)!
|
|
! ! (---------------)
|
|
! !
|
|
! ! (---------------)
|
|
! ! !thread !
|
|
! ! (--------) ! (--------)!
|
|
! ! ! queue2 ! ! !fakesink!!
|
|
! src ---- sink src ---- sink !!
|
|
! ! (--------) ! (--------)!
|
|
(----------) (---------------)
|
|
|
|
|
|
this case differs from case3 in that one of the queues can be empty
|
|
while the other isn't. we assume queue1 is empty while queue2 isn't yet.
|
|
|
|
fakesrc detects the end of stream. It just sent the last buffer
|
|
and sets the srcpad to EOS with gst_pad_eos ().
|
|
|
|
the eos handler returns false because queue2 returns false on the
|
|
eos request. the parent removes fakesrc as an EOS provider.
|
|
|
|
queue2 was responisble for the EOS delay and so it gets added to the bin
|
|
as a possible EOS provider.
|
|
|
|
after the queue2 has sent its last buffer, it performs gst_pad_eos on its
|
|
src pad.
|
|
the parent allready has the queue2 in the list of EOS providers so it does not
|
|
get added twice.
|
|
queue2 finally fires the EOS signal and the parent removes the EOS provider
|
|
from its list, when the list is empty, the parent fires EOS.
|
|
|
|
|
|
|
|
case 5)
|
|
|
|
(--------) (--------) (--------)
|
|
! disksrc! ! mad ! !disksink!
|
|
! src ----- sink src ---- sink !
|
|
(--------) (--------) (--------)
|
|
|
|
|
|
disksrc detects the end of stream. It just sent the last buffer
|
|
and sets the srcpad to EOS with gst_pad_eos ().
|
|
|
|
the eos handler returns false because mad returns false on the
|
|
eos request. the parent removes mad as an EOS provider.
|
|
|
|
mad was responsible for the EOS delay and so it gets added to the bin
|
|
as a possible EOS provider.
|
|
|
|
After mad has sent its last buffer, it performs gst_pad_eos on its
|
|
src pad.
|
|
the parent already has mad in the list of EOS providers so it does not
|
|
get added twice.
|
|
mad finally fires the EOS signal. This time, disksink returns false on
|
|
the eos request. the parent removes mad as an EOS provider.
|
|
|
|
disksink was responsible for the EOS delay and gets added to the bin
|
|
as a possible EOS provider.
|
|
When disksink has written all of it's data and closed the output file,
|
|
it fires EOS.
|
|
The parent already has disksink in the list of EOS providers so it does
|
|
not get added twice.
|
|
The parent removes the EOS provider
|
|
from its list, and since the list is empty, the parent fires EOS.
|
|
|
|
case 6)
|
|
|
|
(--------) (--------) (--------)
|
|
!disksrc1! ! mad1 ! ! mixer !
|
|
! src ----- sink src ---- sink1 ! (--------)
|
|
(--------) (--------) ! ! !disksink!
|
|
! src ---- sink !
|
|
(--------) (--------) ! ! (--------)
|
|
!disksrc2! ! mad2 ! ! !
|
|
! src ----- sink src ---- sink2 !
|
|
(--------) (--------) (--------)
|
|
|
|
In this case, we want to make sure the pipeline keeps running after one
|
|
of the two sources reaches eos. Suppose in this case that disksrc1 will
|
|
reach eos first.
|
|
|
|
disksrc1 detects the end of stream. It sets eos, mad1 will return false,
|
|
and mad1 will be responsible for eos. When mad1 had sent out the last
|
|
buffer, it sends out eos.
|
|
|
|
The mixer intercepts eos and returns false. mad1 is removed from the
|
|
eos providers and mixer is added.
|
|
|
|
(At this point, the mixer might choose to disconnect mad1->src and
|
|
mixer->sink1 pads, since it's received eos on mad1->src)
|
|
|
|
mixer will not send out eos since it hasn't received eos from
|
|
mad2->src.
|
|
|
|
After a while, disksrc2 will detect end of stream, and eos will finally
|
|
propagate to mixer. mixer might disconnect mad->src2, and after
|
|
realizing all of it's sources have reached eos, it sends out the final
|
|
buffer and fires EOS.
|
|
|
|
At this point, disksink will return false, mixer will be removed as an
|
|
eos provider, and disksink will write out it's final buffer and close
|
|
the file on disk. At this point, it fires eos, and since it's the last
|
|
eos provider, the parent can fire eos.
|
|
|
|
|