We have a video playback engine which uses JMF to display an AVI file.
During playback, we are also animating a couple of other things in different
windows.
When testing the application on a dual-processor machine with dual monitors,
we've noticed a strange behavior when painting components. It's rather
difficult to describe, but I'll try to be clear and concise.
There is a window containing a fairly small video player and some playback
controls. We have implemented our own component to display the playback
position, and the component is drawn using the Graphics2D. There is a
separate window (JFrame) in which we display a "mosaic," a static image of
all of the frames of the video, based on the camera movement from frame to
frame. This window updates to follow the position of the current frame
across the mosaic, since a mosaic image can be larger than a reasonable
window size. The panel scrolls to expose the relevant part of the mosaic as
the video plays. The mosaic window is typically 2 or 3 times the size of the
video player itself. The mosaic image itself is constructed using
JAI.create("awtImage"...) and displayed with Graphics2D.drawImage().
There is also a window which displays thumbnails of the frames (at 0.35
scale), with the current frame in the center and the next and previous two
or three frames to the right and left. This component also updates with
every frame played, and understandably it only worsens the problem below.
What we see is that during playback on the dual-processor machine (specs to
follow), when the video player frame is in front and the mosaic frame is
next behind it, the playback position component occasionally (a few frames a
second) draws into the mosaic panel, and the region of the mosaic panel that
was replaced by the playback component appears where in the other frame
where the playback position indicator should be. You might say the pixels in
those two places are "swapped". If this is done on a single-processor
machine, frames are dropped (or flickered) but the components do not paint
"swapped" like this. And if the app is run so that the video and mosaic
windows are on separate machines, the painting is correct and there are very
few dropped frames. Finally, if the app is run so that another window (such
as Notepad or some other application) is BETWEEN the video and mosaic
windows (in the z-direction), the components paint correctly but flicker
much more.
I don't know whether to chalk this problem up to the complexity of the
graphics systems involved, and I'm not sure if it's the dual-processor or
the dual-headed nature of the machine, or some other aspect that causes the
"swap." But if anyone has any insights as to why the components might be
drawing on the wrong window, that would be helpful. Unfortunately, I haven't
gotten intimately familiar with the code yet, so I haven't had a chance to
check for performance optimizations that could eliminate this problem...
Systems:
dual-processor:
dual Intel Xeon 1.7 GHz processors
1GB RAM
Windows 2000 Pro
JRE 1.4.1_01
JMF 2.1.1b
JAI 1.1.1_01
single processor:
Intel P4 1.8 GHz processor
768MB RAM
Windows 2000 Pro
JRE 1.4.1_01
JMF 2.1.1b
JAI 1.1.1_01
I don't know the graphics adapter information for either machine, but I
could get it if it might help.
thanks,
Mike Nidel
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".