mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
49 lines
2.8 KiB
Text
49 lines
2.8 KiB
Text
|
What I propose for EOS condition is th following: As is stands, EOS is a
|
||
|
flag in a buffer. However, it's also a signal from an element, which is
|
||
|
odd. What I propose is that EOS become a pad thing. Here's how it would
|
||
|
work:
|
||
|
|
||
|
When a source has a final buffer, it marks it as EOS. It passes this on
|
||
|
through the pad, and the pads set a 'pending' EOS state on the way
|
||
|
through. When another push or pull happens, only then does the pad signal
|
||
|
EOS. This means that EOS doesn't happen until the buffer has passed all
|
||
|
the way to the end, and a request for another buffer is starting to work
|
||
|
its way back. It gets stopped almost immediately.
|
||
|
|
||
|
This gets a bit messy in complex cases, haven't thought them all out.
|
||
|
Assuming everything is reasonably symmetric, it should work out cleanly.
|
||
|
We may have to add the ability to force buffers to pass even post EOS, but
|
||
|
that sounds like a hack.
|
||
|
|
||
|
|
||
|
|
||
|
Example: DVD
|
||
|
============
|
||
|
|
||
|
|
||
|
------------ |-------|
|
||
|
-| mpeg2dec |-----| |
|
||
|
------------------------ / ------------ | |
|
||
|
| video0|------/ ------------- | | -------------
|
||
|
| | -| subtitle0 |-----| merge |-------| videosink |
|
||
|
| subtitle0|------/ ------------- | | -------------
|
||
|
---------- | | ------------- | |
|
||
|
| dvdsrc |---| mpeg2parse subtitle1|--------| subtitle1 |-----| |
|
||
|
---------- | | ------------- |-------|
|
||
|
| audio0|--------\ ----------- |----------|
|
||
|
| | -| ac3dec0 |-----| |
|
||
|
| audio1|-------\ ----------- | | -------------
|
||
|
------------------------ \ ----------- | switcher |----| audiosink |
|
||
|
-| ac3dec1 |-----| | -------------
|
||
|
----------- |----------|
|
||
|
|
||
|
When dvdsrc reads its last buffer, it sets EOS on the buffer and passes it. The pad (probably audio1,
|
||
|
since video and audio are interleaved and subtitles don't usually end up at the end of a movie) would
|
||
|
set EOS pending, and pass it to mpeg2dec which would pass the EOS to the merge. Merge would then ask
|
||
|
for a buffer from subtitle1, since that's the one we're showing subtitles on right now. It would then
|
||
|
pull from the mpeg2parse. This would cause a switch back the parser, who's next task is to go and set
|
||
|
all the output pads to EOS. It may have to accomplish this by sending a zero-byte buffer.
|
||
|
|
||
|
Well, this example isn't actually very good. I'll go ahead and implement it, and we can see what
|
||
|
happens. The current setup is so lacking that anything is better....
|