#12644 HIGH 13.2.0: vmeta playback is unreliable with the vmetaxv optimization
Zarro Boogs per Child
bugtracker at laptop.org
Thu May 2 16:59:06 EDT 2013
#12644: vmeta playback is unreliable with the vmetaxv optimization
---------------------------------------+------------------------------------
Reporter: dsd | Owner: dsd
Type: defect | Status: new
Priority: high | Milestone: 13.2.0
Component: x window system | Version: not specified
Resolution: | Keywords:
Next_action: diagnose | Verified: 0
Deployment_affected: | Blockedby:
Blocking: |
---------------------------------------+------------------------------------
Comment(by dsd):
The vmetaxvimagesink plugin is at fault and removing it will work around
this bug (with a certain loss in performance).
The vmetaxv plugin tries to speed up video playback, by realising when
video frames that need to be shown on-screen have come from the vmeta
decoder. This means that they already have a known physical address. So
there is no need to copy such image data into a new buffer (as xvimagesink
would do), we can just pass the physical address directly and have the
image shown on screen.
This sounds sensible but the implementation really isn't. It is all done
through Xv, but instead of copying the image data into a buffer passed to
Xv, it simply sets a magic bytestring and writes the physical address
where the image data normally would be, then calls XvShmPutImage(). The X
driver receives this, notices the magic, handles it correctly, and changes
the magic value to a second value to be passed back to the client. The
client realises that the magic has changed and goes ahead and frees the
buffer.
The problem here is that XvShmPutImage() sometimes returns without drawing
the image on screen, without even invoking the Xv part of the X driver. It
commonly does this as totem is starting up, the first few calls don't seem
to "make it through" to the driver, maybe the video area is not visible
yet. So the magic value does not get changed, which causes the vmetaxv
driver not to free the buffer. This happens more than 16 times during
totem startup, which means we run out of buffers, and since we never free
them, things go wrong from that point.
It does not seem possible to detect if XvShmPutImage() actually sent its
operation to the driver or not. There are times when the driver does not
receive the request during the XvShmPutImage() call and the frame doesn't
even get drawn in the time that follows, so busy looping waiting for the
draw is not realistic (it would have to have a nasty timeout). Also I have
seen cases during totem startup where it returns before the driver has
drawn it, but then the driver does come along and draw it later. This
system is inherently racy and needs a redesign (hopefully a better
design...).
For now I think it is safe for the vmetaxv code simply to free the buffer
after sending to to XvShmPutImage(), even if the Xv driver has not sent it
to the screen (i.e. the magic value has not been changed). As I have seen
cases where the drawing is simply delayed, this does introduce a risk of
drawing stale data to the screen. But at least the stale data comes from a
known memory area and I don't see this being problematic.
--
Ticket URL: <http://dev.laptop.org/ticket/12644#comment:7>
One Laptop Per Child <http://laptop.org/>
OLPC bug tracking system
More information about the Bugs
mailing list