[mythtv-users] Exiting playback is very slow
Jim Stichnoth
stichnot at gmail.com
Thu Nov 12 04:33:12 UTC 2009
On Wed, Nov 11, 2009 at 11:44 AM, Jim Stichnoth <stichnot at gmail.com> wrote:
> For quite a while I have noticed that exiting playback and returning
> to the menu is very slow, usually 10-15 seconds. This has been the
> case in both 0.21 and 0.22, and for both VDPAU and Slim profiles.
>
> I added some extra logging to my own build to find out where the
> slowness is happening. Here are the last few calls leading to the big
> pause:
>
> TV::~TV()
> delete player.back();
> PlayerContext::~PlayerContext()
> PlayerContext::TeardownPlayer()
> PlayerContext::SetNVP(NULL)
> pthread_join(decode, NULL)
>
> The pthread_join call takes about 11-12 seconds to complete. Running
> strace shows tons of system calls leading up to pthread_join, but the
> logging output pauses for several seconds at the pthread_join call
> with this line:
> futex(0xad249bd8, FUTEX_WAIT, 13506, NULL) = 0
>
> (The first and third parameters of course change each run.)
>
> Interestingly, I tried running "top -d .25" to see what was going on
> with the CPU during the long pause, but top refuses to update the
> screen during this period.
>
> Any ideas what the problem might be? The possibilities seem to be
> Myth code, the pthreads library, or the kernel. My kernel is
> 2.6.27.9-159.fc10.i686 from MythDora 10.21.
Silly me. Apparently I had at some point modified the Slim profile to
use VDPAU, so both of my tests were actually using VDPAU.
In any case, I thought to add extra logging to the other threads that
the main thread was waiting on. It turns out that the bottleneck is
in VDPAUContext::FreeBuffers(), particularly the call to
vdp_video_surface_destroy(). For some recordings, each call is taking
about 0.6 seconds, and since there is one call for each of the 17
VDPAU buffers, that adds up to 10+ seconds. (For other recordings,
each call might take only half as long; I don't know what the pattern
is.)
So if I want to improve the stop-playback performance, it seems I have
two choices. First, I could try reducing the number of VDPAU buffers.
What is special about 17 buffers? Are there any guidelines on how
many are necessary for a given recording?
Second, I could try setting up a special thread to free the buffers in
the background, with a lock to ensure that another playback doesn't
start until the special thread completes.
Jim
More information about the mythtv-users
mailing list