From 76f1b4540a35a7f3e2bf78cbc66843241c40b9da Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 12 Jan 2001 18:51:03 +0000 Subject: [PATCH] While typing on eos2 about the EOS handling, I got an idea and started eos3. eos3 takes a different approach by mergi... Original commit message from CVS: While typing on eos2 about the EOS handling, I got an idea and started eos3. eos3 takes a different approach by merging the eos detection and the scheduling in a quite elegant way. I'm not sure we handle the scheduling like this though... --- docs/random/wtay/eos2 | 147 ++++++++++++++++++++++++++++++++++++++ docs/random/wtay/eos3 | 159 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 306 insertions(+) create mode 100644 docs/random/wtay/eos2 create mode 100644 docs/random/wtay/eos3 diff --git a/docs/random/wtay/eos2 b/docs/random/wtay/eos2 new file mode 100644 index 0000000000..46dc80f200 --- /dev/null +++ b/docs/random/wtay/eos2 @@ -0,0 +1,147 @@ + +case 1) + +(--------------------------------------------------) +! bin ! +! (--------) (--------) (--------) ! +! ! fakesrc! !identity! !fakesink! ! +! ! src ----- sink src ---- sink ! ! +! (--------) (--------) (--------) ! +(--------------------------------------------------) + +.scheduling. + + case1 has just one scheduled entity (chain) no problem here. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + gst_pad_set_eos() will notify the parent about the plugins attempt to + signal eos. the parent adds the element to its possible EOS + providers. + + gst_pad_set_eos() will by default propagate to identy and to fakesink. + none of these plugins override the default behaviour so gst_pad_set_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 !! + (--------) (--------) (--------) ! (--------)! + (---------------) + +.scheduling. + + case2 has two scheduled entities: fsr-i-q, q-fsk. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + gst_pad_set_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. + + + diff --git a/docs/random/wtay/eos3 b/docs/random/wtay/eos3 new file mode 100644 index 0000000000..ed4b5e986c --- /dev/null +++ b/docs/random/wtay/eos3 @@ -0,0 +1,159 @@ + +case 1) + +(--------------------------------------------------) +! bin ! +! (--------) (--------) (--------) ! +! ! fakesrc! !identity! !fakesink! ! +! ! src ----- sink src ---- sink ! ! +! (--------) (--------) (--------) ! +(--------------------------------------------------) + +.scheduling. + + case1 has just one scheduled entity (chain) no problem here. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + gst_pad_set_eos() will notify the parent about the plugins attempt to + signal eos. the parent disables scheduling for the chain containing + fakesrc. + + no more chains are being scheduled so the bin fires EOS. + + +case 2) + + +(-----------------------------------------------------------------------) +! bin ! +! (---------------) ! +! !thread ! ! +! (--------) (--------) (--------) ! (--------)! ! +! ! fakesrc! !identity! ! queue ! ! !fakesink!! ! +! ! src ----- sink src ---- sink src ---- sink !! ! +! (--------) (--------) (--------) ! (--------)! ! +! (---------------) ! +(-----------------------------------------------------------------------) + +.scheduling. + + case2 has two scheduled entities: fsr-i-q, q-fsk. + The first one is scheduled by the bin, the second one by the thread. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + gst_pad_set_eos() will notify the parent about the plugins attempt to + signal eos. the parent will take chain1 out if its scheduled chains. + + the bin does not fire EOS yet because the thread has not yet signaled + EOS. + + after the queue has sent out the last buffer, its calls eos on its + src pad. the chain with the queue is removed from the threads scheduled + chains. there are no more chains to schedule, the thread fires EOS. + + The bin now has no more scheduled chains and no more pending subbins, + it fires EOS. + + +case 3) + +(-----------------------------------------------------------------------) +! bin ! +! (---------------) ! +! !thread ! ! +! (--------) (--------) (--------) ! (--------)! ! +! ! fakesrc! ! tee ! ! queue1 ! ! !fakesink!! ! +! ! src ----- sink src ---- sink src ---- sink !! ! +! (--------) ! ! (--------) ! (--------)! ! +! ! ! (---------------) ! +! ! ! ! +! ! ! (---------------) ! +! ! ! !thread ! ! +! ! ! (--------) ! (--------)! ! +! ! ! ! queue2 ! ! !fakesink!! ! +! ! src ---- sink src ---- sink !! ! +! ! ! (--------) ! (--------)! ! +! (--------) (---------------) ! +(-----------------------------------------------------------------------) + +.scheduling. + + case3 has tree scheduled entities: fsr-t(-q1,-q2), q1-fsk. q2-fsk + the first one is managed by the bin, the second two are managed by the + threads. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + chain1 is taken out of the scheduling algorithm of the bin. + + after a while, the threads finish their scheduling and fire EOS too. + + The bin now has no more scheduled chains and no more pending subbins, + it fires EOS. + + +case 4) + +(-----------------------------------------------------------------------) +! bin ! +! (---------------) ! +! !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. + +.scheduling. + + case3 has tree scheduled entities: fsr-t(-q1,-q2), q1-fsk. q2-fsk + the first one is managed by the bin, the second two are managed by the + threads. + +.eos. + + fakesrc detects the end of stream. It just returned the last buffer. + The next _pull will cause the srcpad to trigger gst_pad_set_eos (). + After that it will return a NULL buffer. + + chain1 is taken out of the scheduling algorithm of the bin. + + after a while, the threads finish their scheduling and fire EOS too. + chain2 (with queue1) is taken out of the scheduling first because it + is empty. + + chain3 (with queue2) finally removes its last scheduled chain and + fires EOS. + + The bin now has no more scheduled chains and no more pending subbins, + it fires EOS. + + + +