[PATCH v6 5/5] winegstreamer: Replace source pad interface with GstAppSrc.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Tue Sep 28 00:23:57 CDT 2021
On 9/24/21 14:23, Derek Lesho wrote:
>
> On 9/24/21 12:38, Zebediah Figura wrote:
>> On 9/24/21 3:05 AM, Derek Lesho wrote:
>>> On 9/21/21 13:02, Zebediah Figura wrote:
>>>
>>>>
>>>>
>>>> 1. Rely on the fact that seek-data is sent during a seek, and use it
>>>> to effectively invalidate any buffers sent before the seek. Unlike the
>>>> aforementioned problem with validation, this will actually work: at
>>>> the time that seek-data is sent appsrc should be flushing, so any
>>>> buffers we send before it will be discarded by appsrc, and any buffers
>>>> we send afterward can be discarded by us if they aren't valid. This is
>>>> very fragile, though. There's really no reason for appsrc to send
>>>> seek-data for random-access streams in the first place, and this kind
>>>> of synchronization is easy to get wrong if I haven't already.
>>>
>>> This sounds like the best way forward in my opinion, how is it fragile?
>>
>> It's fragile in general because we're making a lot of assumptions,
>> that aren't documented, about when and from which thread gstappsrc
>> will send these signals, and what synchronization guarantees it
>> applies when doing so.
>
> My perspective is that if we can get it working, documenting the two
> required quirks to the GStreamer project, eventually the problem will be
> be cleared up and/or fixed, and we can remove the quirks then.
The problem is that we're still going to have to keep those workarounds
for a long time. Not to mention that clearly filing a bug is not enough
to get the attention of the GStreamer developers.
As the maintainer of this code, I don't think I feel very comfortable
relying this much on the internals of appsrc, whether as workarounds or not.
>
>>
>>> It seems that if we just ensure that a pushed buffer takes into account
>>> the latest seek/need data pair, not much can go wrong.
>>>
>>
>> That's not enough by itself. We can, generally speaking, send a buffer
>> after a seek-data/need-data is triggered but before it is actually sent.
> Before what is sent?
Before the seek-data or need-data signal is sent. There is a window
there, however short.
>> This happens in practice with flushes.
>>
>> In order to get around that, you need the hack I mentioned: assume
>> that a flush will be accompanied by a seek-data signal. This is
>> especially fragile because there's no reason for appsrc to even be
>> sending this signal in the first place (it only really makes sense in
>> "seekable" mode), and they could easily decide to not do that.
>
> I'm not sure I understand, whenever the next buffer app source wants is
> not consecutively after the last, seek-data is required (and sent). What
> does "assume the flush will be accompanied by a seek-data signal" mean?
> The app source client doesn't have any conception of a flush, just
> seek-data and need-data, and to fix this problem all we need to do is
> add a quite rational check that push_data is responding to the latest
> seek/need data pair.
Let me try to explain more clearly. At least one race, the one I've been
trying to describe, looks like this:
read thread main thread
-------------------------------------
push seek event
retrieve data
validate offset
send flush-start
emit seek-data
send flush-stop
push-buffer
At which point appsrc will get the wrong buffer.
Solution 1 has us rely on the seek-data signal to effectively wait for
the read thread (most likely using the parser mutex) and, in a sense,
put a barrier between reads occuring before and after the flush.
More information about the wine-devel
mailing list