| OUTDATED |
| -------- |
| |
| |
| 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. |
| |
| |
| case 5) |
| |
| (-----------------------------------------------------------------------) |
| ! bin ! |
| ! (---------------) ! |
| ! !audiosink ! ! |
| ! (--------) (----------) (--------) ! ! ! |
| ! !disksrc1! ! effect ! ! mixer ! ! ! ! |
| ! ! src -- sink src ---- sink src -- sink ! ! |
| ! (--------) (----------) ! ! ! ! ! |
| ! ! ! (---------------) ! |
| ! (--------) (----------) ! ! ! |
| ! !disksrc2! ! effect ! ! ! ! |
| ! ! src -- sink src ---- sink ! ! |
| ! (--------) (----------) (--------) ! |
| (-----------------------------------------------------------------------) |
| |
| This is a simple audio mixer (mp3audio mixer). |
| We assume disksrc1 is going to be in EOS while disksrc2 is still in !EOS |
| |
| |
| .scheduling. |
| |
| two chains are detected: disksrc1-effect-mixer-audiosink, |
| disksrc2-effect-mixer-audiosink |
| |
| .eos. |
| |
| disksrc1 has passed the last buffer in the _get function. with its next |
| call to _get, it will return a NULL buffer and set the src pad to EOS. |
| |
| the EOS call travels up till the mixer element because it has overridden |
| the handler. The first chain is disabled from the scheduler. |
| |
| finally disksrc2 run into EOS, same procedure as with disksrc1, except |
| now the mixer also sets EOS to its src pad, chain2 becomes inactive too |
| and the bin fires EOS because there are no more chains to schedule. |
| |
| somebody sets the location of disksrc1 to a new mp3 file, the srcpad |
| is set to !EOS, chain1 is scheduled again, mixer is activated again too |
| and audio is playing again... |
| |
| |
| case 6) |
| |
| (-------------------------------------------------------------------------------------) |
| ! bin ! |
| ! (---------------) ! |
| ! (---------------------------------------------) !audiosink ! ! |
| ! ! thread1 ! ! ! ! |
| ! ! (--------) (----------) (-----) ! (--------) ! ! ! |
| ! ! !disksrc1! ! effect ! !queue! ! ! mixer ! ! ! ! |
| ! ! ! src -- sink src -- sink src -- sink src -- sink ! ! |
| ! ! (--------) (----------) (-----) ! ! ! ! ! ! |
| ! (---------------------------------------------) ! ! ! ! ! |
| ! ! ! (---------------) ! |
| ! (---------------------------------------------) ! ! ! |
| ! ! thread2 ! ! ! ! |
| ! ! (--------) (----------) (-----) ! ! ! ! |
| ! ! !disksrc2! ! effect ! !queue! ! ! ! ! |
| ! ! ! src -- sink src -- sink src -- sink ! ! |
| ! ! (--------) (----------) (-----) ! (--------) ! |
| ! (---------------------------------------------) ! |
| (-------------------------------------------------------------------------------------) |
| |
| This is a simple audio mixer (mp3audio mixer). |
| We assume disksrc1 is going to be in EOS while disksrc2 is still in !EOS |
| |
| .scheduling. |
| |
| Scheduling is a bit tricky here: we have two threads with each one chain ds1-e-q and |
| ds2-e-q. the mixer element is loop based and forms a third chain, mixer-audiosink |
| |
| .eos. |
| |
| disksrc1 has passed the last buffer in the _get function. with its next |
| call to _get, it will return a NULL buffer and set the src pad to EOS. |
| |
| the EOS call travels up till the queue element because it has overridden |
| the handler. The first chain is disabled from the scheduler. thread1 fires EOS |
| because it does not have any chains to schedule. |
| |
| the mixer element pulls buffers from queue1 until queue1 is empty. At that time, |
| queue1 sets the pad to EOS, mixer now knows that it does not have to request |
| another buffer from that pad again. |
| |
| disksrc2 finally sets its pad to EOS, rendering chain2 unscheduled which makes |
| the thread2 fire an EOS. |
| |
| the mixer element pulls buffers from queue2 until queue2 is empty. At that time, |
| queue2 sets the pad to EOS, mixer now knows that it does not have to request |
| another buffer from that pad again. all pads for the mixer are in EOS now so |
| it sets the src pad to EOS. the last chain now also becomes unscheduled and |
| the bin fires EOS. |
| |
| |