filter.c: Register tasks in proper order
authorAndre Noll <maan@systemlinux.org>
Thu, 1 Mar 2007 19:42:32 +0000 (20:42 +0100)
committerAndre Noll <maan@systemlinux.org>
Thu, 1 Mar 2007 19:42:32 +0000 (20:42 +0100)
commitcafdd0a10e3ec387c7265ae6d50ee504ded4e056
tree1f325310aa195c57bef6d90565491c78b363f5ec
parent1d298ac7426fdc13221f759848dbf766ef606c0b
filter.c: Register tasks in proper order

The order is important as it determines the order in which
the pre_select functions are going to be called by the scheduler.

In the previous code, the scheduler called stdin->pre_select _before_
filter_chain->pre_select() which gave rise to the following scenario
(note that there's no filter_chain->post_select()):

stdin->pre_select(): set stdin for reading
filter_chain->pre_select(): nothing to do
stdin->post_select(): read buffer
stdin->pre_select(): do _not_ set stdin for reading as stdin buffer is full

For para_filter, after the last there are no fds set which causes the
scheduler to use the default timeout of 1s. This had the effect that
decoding of aac files started only after a few seconds.

With the roles of interchanged tasks the scenario is as follows:

filter_chain->pre_select(): nothing to do
stdin->pre_select(): set stdin for reading
stdin->post_select(): read buffer
filter_chain->pre_select(): convert buffer
stdin->pre_select(): set stdin _again_ as stdin buffer is not full

Alternative fix might be to use filter_pre_select() also for post_select.
filter.c