Redraw overlay with gst_x_overlay_expose needed

74 views
Skip to first unread message

DrakoDGA

unread,
Aug 21, 2008, 5:17:10 AM8/21/08
to gstreamer-java
Dear subscribers

I'm currently working on an application which needs basic video
playback overlays
capabilities on mini-itx platform and GStreamer seems to suite my
needs perfectly.

To enable the overlay I use the gst_x_overlay_set_xwindow_id, but when
i change between window mode to fullscreen mode, the overlays loss the
video. The solution seems to use gst_x_overlay_expose function, but is
not implemented in GS-java. Is it a good idea include that in next
version? Can anybody help me?

Any help with this problem would be greatly appreciated.

Kind regards, David Gil.

Wayne Meissner

unread,
Aug 22, 2008, 9:15:56 AM8/22/08
to gstream...@googlegroups.com
Ok, I've implemented this, but haven't tested it.

To use an XOverlay now, you do something like:

Element e = ElementFactory.make("xvimage", "video");
XOverlay overlay = XOverlay.wrap(e);
overlay.setWindowsID(canvas);

Alternatively, you can access the low level API as it was before:

GstInterfacesAPI.INSTANCE.gst_x_overlay_set_xwindow_id()
and
GstInterfacesAPI.INSTANCE.gst_x_overlay_expose()


2008/8/21 DrakoDGA <Drak...@gmail.com>:

DrakoDGA

unread,
Aug 23, 2008, 5:34:51 AM8/23/08
to gstreamer-java
Oh, thank you very much, Wayne.

I will try it on Monday, and I will inform you what so works!!
I believe that if this works, he will be very useful for other people.

Again, thanks to remake the code and to write the functions.

Kind regards David Gil.

DrakoDGA

unread,
Aug 25, 2008, 7:29:53 AM8/25/08
to gstreamer-java
Hello. I have trying the new functions, but it seems that itself
having the same problem.
When attempt to do ' Fullscreen' the image is lost. I am going to put
the test code that I have used, in case anybody can see the solution.


import com.sun.jna.Platform;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.gstreamer.Bus;
import org.gstreamer.BusSyncReply;
import org.gstreamer.Element;
import org.gstreamer.ElementFactory;
import org.gstreamer.Gst;
import org.gstreamer.GstObject;
import org.gstreamer.Message;
import org.gstreamer.elements.PlayBin;
import org.gstreamer.Structure;
import org.gstreamer.event.BusSyncHandler;
import org.gstreamer.interfaces.XOverlay;
import org.gstreamer.lowlevel.GstInterfacesAPI;

public class OverlayPlayer {

/** Creates a new instance of SwingPlayer */
public OverlayPlayer() {
}
private static Bus bus;

public static void main(String[] args) {
//System.setProperty("sun.java2d.opengl", "True");

args = Gst.init("Swing Player", args);
if (args.length < 1) {
System.err.println("Usage: SwingPlayer <filename>");
System.exit(1);
}
final String file = args[0];
final String overlayFactory = Platform.isWindows() ?
"directdrawsink" : "xvimagesink";
final Element videoSink = ElementFactory.make(overlayFactory,
"overlay video sink");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
try {

UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
} catch (Exception e) {
// TODO Bloque catch generado automáticamente
e.printStackTrace();
}
final JFrame frame = new JFrame("Overlay
Test");
final Canvas canvas = new Canvas();
canvas.setPreferredSize(new Dimension(640, 480));
frame.add(canvas,
BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton fs = new JButton("FullScreen");
frame.add(fs, BorderLayout.SOUTH);

fs.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {
if
(GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getFullScreenWindow()==null)
{
frame.dispose();
frame.setUndecorated(true);

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(frame);


GstInterfacesAPI.INSTANCE.gst_x_overlay_expose(videoSink); //I don't
know if that's correct
frame.pack();
frame.setVisible(true);

}else{
frame.dispose();
frame.setUndecorated(false);

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(null);


GstInterfacesAPI.INSTANCE.gst_x_overlay_expose(videoSink); //I don't
know if that's correct
frame.pack();
frame.setVisible(true);
}
}
});
frame.setUndecorated(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

PlayBin player = new PlayBin("Overlay
Player");
player.setInputFile(new File(file));
bus = player.getBus();

bus.connect(new Bus.ERROR() {
public void errorMessage(GstObject source, int
code, String message) {
System.out.println("Error: code=" + code + "
message=" + message);
}
});
//final Element videoSink =
ElementFactory.make(overlayFactory, "overlay video sink");
player.setVideoSink(videoSink);
//
// Setting the overlay window ID is supposed to be
done from a sync handler
// but that doesn't work on windows
//
if (!Platform.isWindows()) {
bus.setSyncHandler(new BusSyncHandler() {

public BusSyncReply syncMessage(Message msg) {
Structure s = msg.getStructure();
if (s == null || !s.hasName("prepare-
xwindow-id")) {
return BusSyncReply.PASS;
}

XOverlay.wrap(videoSink).setWindowID(canvas);
return BusSyncReply.DROP;
}
});
} else {
XOverlay.wrap(videoSink).setWindowID(canvas);
}
player.play();
}
});
}
}


Thank you very much for the help, David Gil.

Wayne Meissner

unread,
Aug 26, 2008, 4:31:35 AM8/26/08
to gstream...@googlegroups.com
I suspect that you need to unset/set the window id when switching to
or from fullscreen.

Use setWindowID(null) to detach the xvimagesink from the previous
window, then setWindowID(canvas) again after the switch.


2008/8/25 DrakoDGA <Drak...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages