[gst-devel] pulsesink optimizations
René Stadler
mail at renestadler.de
Wed Oct 14 23:48:47 CEST 2009
pl bossart write:
> Hi folks,
> I noticed performance issues due to the rewrite of pulsesink since the
> 0.10.15 release. The degradation is in the 30% range on my Atom board
> when playing MP3/AAC. There have been a couple of modifications in git
> related to buffer attributes and latency settings, but overall the
> overhead remains, and the pulsesink code could be further optimized
> for low-power playback apps that don't care about latency.
I noticed the same on the Nokia N900.
> I finally took the time to look at the code and check what was going
> on. It seems that the overhead is mainly due to the granularity of
> transfers between pulsesink and PulseAudio. What happens is that the
> sink waits for space available in the PulseAudio buffer. When PA
> requests data in a callback, the mainloop unblocks and the sink writes
> its PCM to PulseAudio. The problem is that the sink will not try to
> fill the whole buffer before handing-off the data to PulseAudio. For
> example, say PulseAudio requests 100k (as defined by minreq) and you
> are doing MP3 decode, you are going to send one frame (4608 bytes) at
> a time to PulseAudio until the 100k have been filled. That's a lot of
> overhead. It would be a lot more efficient power-wise to decode and
> store as many frames as possible into the PA buffer before calling
> pa_stream_write().
Wim just committed my patch that changes pulsesink back to set the minreq to
the value of the latency-time property, which lets applications tune the
gst<->pa overhead again.
During the investigation of that regression, I found that there is some further
things to optimize in pulsesink. I will be filing more bugs and sending more
patches as I come up with better solutions.
> I have snippets of code as a proof of concept. I don't mind releasing
> the code, but I must admit this is a hack and does not cover all the
> cases pulsesink addresses. An additional optimization could consist in
> passing the PulseAudio buffer upstream to avoid memory copies. The new
> PA release provides support for this with pa_stream_begin_write(). In
> short, I would badly need a review from more experienced developers...
> If anyone is interested let me know.
>
> Cheers,
> - Pierre
Using that API is a step into the right direction. However there is still a lot
to do. GStreamer desperately needs a zero-copy mechanic for audio such that the
audio decoders' output buffer sizing doesn't incur arbitrary overhead.
For the time being, I think you can get almost the same performance/battery
life gain by increasing the output buffer size of your audio decoders. Felipe
Contreras has been trying this with the vorbis decoder, with good results.
--
Regards,
René Stadler
More information about the gstreamer-devel
mailing list