February 18, 2009
This article was contributed by Koen Vervloesem
At FOSDEM 2009 (Free and Open
Source Software Developers' European Meeting) in Brussels, your author
attended a number of talks about the state of graphics in Linux. Two of
them stood out: Matthias Hopf's talk about RandR 1.3 and Helge Bahmann's
work on multimedia processing extensions for X.
RandR 1.3: panning, transformations and properties
Matthias Hopf of SUSE R&D gave
an update about RandR 1.3 (Resize and Rotate Extension). So far,
RandR 1.2 exposes an interface to dynamically set and query properties such
as the displayed and known video modes, the framebuffer size, and
attachment of a monitor. However, there are still some important features
lacking. For example, querying the state of an output involves output
probing, and there is no way for applications to distinguish between the
internal panel and an external output, which could be interesting for
presentation software. Panning is also lacking, just as displaying in a
non-1:1 fashion. And last but not least: the framebuffer size of X is
limited to its initial allocation.
RandR 1.3, which is to be released with X Server 1.6, should implement a
number of these features. With the new version of the extension, it is
finally possible to query the state without output probing. The function
RRGetScreenResourcesCurrent is equivalent to
RRGetScreenResources but does not use polling. However, you won't
get notified of new monitors this way. The xrandr command to query the
state of a VGA output would be:
xrandr --output VGA --current
Other additions are multi-monitor panning and display
transformations. When the mouse hits the screen borders, the viewport has
to be changed. For a seamless movement without flickering, the graphics
driver needs an update. The --panning option of the new xrandr command has
three sets of four parameters, as in this example:
xrandr --output VGA --panning 2000x1200+0+0/2000x1200+0+0/100/100/100/100
The first
parameter set is the panning area, the second one is the tracking area, and
the third one are the borders. For example, setting the right border to 100
means that panning begins if the user reaches a border of 100 pixels before
the right end of the physical screen. The panning area is the area that
might be visible on the screen, while the tracking area is the area in
which the mouse pointer movements influence the pan. In most circumstances
these two are identical.
There are still some conceptual problems to be solved, according to
Hopf. He wonders what the combination of a dual-head configuration and
panning could mean: should the whole space span when the user reaches the
side of the virtual space, or should each physical space pan separately? Or
should it be a combination of these two? Xrandr needs an update to
accommodate to these possibilities. Another problem is that panning and
display transformations don't fit together.
Display transformations in RandR 1.3 make it possible to transform the
perspective of the CRTC content. This could be used for rotation, flipping,
scaling and keystone correction. Under the hood, the code is using
homogeneous coordinate transformations, implemented by a 3-component
matrix-vector multiplication. The user has to specify this transformation
matrix in the appropriate xrandr command, as in:
xrandr --output VGA --transform 2,0,0,0,2,0,0,0,1
which scales the image down by a factor of 2. A more pragmatic use of
this display transformation would be a keystone
correction matrix, which transforms the distorted image of an incorrectly
positioned projector to a perfect rectangle. It would seem that there is
ample scope for the creation of more user-friendly interfaces to this
functionality, though.
Distinguishing between different types of screens can be done in RandR
1.3 with standard properties, such as output and signal types. RandR will
require graphics drivers to implement some mandatory properties to claim
RandR 1.3 support. Hopf added that "unknown" is a valid value, so initial
support is trivial. Two of these mandatory properties are SignalFormat and
ConnectorType. The former describes the physical protocol format, such as
VGA, TMDS, LVDS, Composite, Composite-PAL, Composite-NTSC, Composite-SECAM,
SVideo, Component or DisplayPort. The graphics driver changes this property
when the underlying hardware indicates a protocol change, and X clients can
change this property to select a protocol. The ConnectorType property is
immutable, and can have one of VGA, DVI,
DVI-I, DVI-A, DVI-D, HDMI, Panel, TV, TV-Composite, TV-SVideo,
TV-Component, TV-SCART, TV-C4 or DisplayPort as its value. A presentation
application can use this property to detect unambiguously which is the
laptop display and which is the projector display.
Other, non-mandatory properties are SignalProperties, ConnectorNumber,
EDID (formerly EDID_DATA, the raw EDID data from the monitor),
CompatibilityList and CloneList. Many of these properties haven't been
implemented by any driver yet. A final problem that cannot be solved in
RandR 1.3 is the framebuffer size limitation. The culprit is the current
XAA implementation: XAA calls don't get the pitch as an argument and assume
it stays the same for the whole life of the X Server.
Multimedia processing extensions for X
Helge Bahmann, a research assistant at the Technical University of
Freiburg in Germany, talked about his experimental multimedia processing
extensions for the X Window System. At this moment, multimedia applications
either bypass X (e.g. by DRI), or they use X as a video playback service
for computed images (e.g. by XVideo). The network transparency for which X
is famous fails in both cases. If you want to display video remotely, you
have to be able to transmit compressed media data, and you have to
synchronize audio and video. For this purpose, Bahmann introduced three new
experimental X extensions.
The TIME extension, part of Bahmann's master's thesis in 2002,
introduces two new server-side objects: Clocks and Schedules. An X client
can start, stop and query the X server's clock. The client also submits
commands to the server with execution and expiration timestamps, and the
scheduler executes these requests at the appropriate time. This mechanism
allows the application to schedule drawing requests (using the RENDER extension). It's
important to note the (non-)obligations of the client and server: the X
server doesn't guarantee the timely execution of the commands, and the
client thus cannot rely on a created state. At the other end, the client
can "change its mind": it can retract scheduled commands and it can replace
them with completely different commands. Retracting and replacing can fail
if the server has already started the execution.
The other extension Bahmann introduced is the AUDIO extension: it
implements a SampleBuffer object, which is server-side storage for audio
samples, equivalent to pixmaps for images. A PCMContext object can serve as
a clock: a client can bind an execution scheduler to it, which allows
operations to be executed synchronized to audio playback or capture. This
also allows a simple synchronization between audio and video. The AUDIO
extension spawns a dedicated real-time thread, but the rest of the X server
is completely unaware of the thread. Because of the audio thread, the X
server has to be linked to a thread-safe libc.
The TIME and AUDIO extensions are the basic infrastructure for
multimedia processing, but as you have to deal with huge amounts of data,
this will not work well on low-bandwidth networks. That's why Bahmann
introduced a third X extension: COMPRESS, which is actually a misnomer
because it uncompresses data. The ImageSequenceDecompressor and
AudioSequenceDecompressor can receive and buffer individual compressed JPEG
frames, and convert them into an uncompressed representation which can be
processed by the X server. The client must submit compressed frame data and
hence has to understand the compression format.
Summarizing his talk, Bahmann stressed that his X extensions are
conceptually relatively simple and reuse existing X functionality (such as
communication, client/resource management and security) without duplicating
existing X functionality. A drawback for the programmer is that these
multimedia extensions are very low-level and hence not at all
easy-to-use. The client application has a big responsibility: it has to
understand, parse and partition the media data, to plan ahead, submit
compressed data and schedule commands, and to handle synchronization. It
also needs to back-track and reschedule commands, for example when the
window size changes. Bahmann warns this can be very complex to
implement.
Bahmann calls his extensions "experimental" because they work for him
but probably require diving into the code if you want to use them. Audio,
timing and synchronization basically work, and the protocol part of the
compression is finished. However, the backend interface to plug in new
decompressors is still in flux. But all in all, it works:
Simple
networked media player applications work quite well across our campus
network. For really low-bandwidth media, such as MPEG1 at 70 to 80 kbytes
per second, it also works across my DSL connection. The overhead added by
the X protocol is quite minuscule.
While implementing and thinking about these extensions, Bahmann
encountered some deficiencies of the current design of the X
server. There's the security problem of audio/image decompressors in a
process running with root privileges. Knowing the bad security track record
of media players such as VLC and MPlayer, one should be cautious with such
complex code running with root privileges. Bahmann is currently auditing
the decompressors, and that's the principal reason why there are so few
codecs available. Secondly, the compute-intensive decompression operations
of the COMPRESS extension may stall the X server. Bahmann suggests to give
up the current single-threaded design of the X server, but that is an idea
which has not been accepted by the X development community in the past. In
the absence of multiple threads, decompression must be handled carefully so
as to avoid interfering with other X operations.
(
Log in to post comments)