mirror of https://github.com/mpv-player/mpv
c5eb2f2ac4
The mp_filter_run() invocation blocks as long as the demuxer provides packets and the queue can be filled. That means it may block quite a long time of the decoder queue size is large (since we use libavcodec in a blocking manner; it regrettably does not have an async. API). This made the main thread freeze in certain situations, because it has to wait on the decoder thread. Other than I suspected (I wrote that code, but that doesn't mean I know how the hell it works), this did not freeze during seeking: seek resets flushed the queue, which also prevented the decoder thread from adding more frames to it, thus stopping decoding and responding to the main thread in time. But it does fix the issue that exiting the player waited for the decoder to finish filling the queue when stopping playback. (This happened because it called mp_decoder_wrapper_set_play_dir() before any resets. Related to the somewhat messy way play_dir is generally set. But it affects all "synchronous" decoder wrapper API calls.) This uses pretty weird mechanisms in filter.h and dispatch.h. The resulting durr hurr interactions are probably hard to follow, and this whole thing is a sin. On the other hand, this is a _very_ user visible issue, and I'm happy that it can be fixed in such an unintrusive way. |
||
---|---|---|
.. | ||
f_async_queue.c | ||
f_async_queue.h | ||
f_auto_filters.c | ||
f_auto_filters.h | ||
f_autoconvert.c | ||
f_autoconvert.h | ||
f_decoder_wrapper.c | ||
f_decoder_wrapper.h | ||
f_demux_in.c | ||
f_demux_in.h | ||
f_hwtransfer.c | ||
f_hwtransfer.h | ||
f_lavfi.c | ||
f_lavfi.h | ||
f_output_chain.c | ||
f_output_chain.h | ||
f_swresample.c | ||
f_swresample.h | ||
f_swscale.c | ||
f_swscale.h | ||
f_utils.c | ||
f_utils.h | ||
filter.c | ||
filter.h | ||
filter_internal.h | ||
frame.c | ||
frame.h | ||
user_filters.c | ||
user_filters.h |