/*! Copyright (C) 2010 Apertus, All Rights Reserved
*! Author : Apertus Team
*! Description: Video Stream Player class based on VLC java bindings
-----------------------------------------------------------------------------**
*!
*! This program is free software: you can redistribute it and/or modify
*! it under the terms of the GNU General Public License as published by
*! the Free Software Foundation, either version 3 of the License, or
*! (at your option) any later version.
*!
*! This program is distributed in the hope that it will be useful,
*! but WITHOUT ANY WARRANTY; without even the implied warranty of
*! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*! GNU General Public License for more details.
*!
*! You should have received a copy of the GNU General Public License
*! along with this program. If not, see <http://www.gnu.org/licenses/>.
*!
-----------------------------------------------------------------------------**/
//import java.awt.Color;
import java.awt.Dimension;
//import org.gstreamer.elements.PlayBin;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
//import org.gstreamer.Clock;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.gstreamer.swing.VideoComponent;
import org.gstreamer.Element;
import org.gstreamer.ElementFactory;
import org.gstreamer.Gst;
import org.gstreamer.GstException;
import org.gstreamer.Pipeline;
import org.gstreamer.State;
import org.gstreamer.elements.PlayBin;
import org.gstreamer.elements.PlayBin2;
import org.gstreamer.elements.FileSrc;
public class GstreamerPlayer {
private ElphelVision Parent;
private String[] args;
private VideoComponent videoComponent;
private Pipeline pipe;
//private VideoPlayer GSTPlayer;
private PlayBin2 Playbin;
GstreamerPlayer(ElphelVision parent) {
this.Parent = parent;
args = new String[2];
args[1] = "";
args[0] = "";
try {
args = Gst.init("ElphelVision", args);
} catch (GstException e) {
Parent.WriteErrortoConsole("Gst.init error: " + e);
}
Playbin = new PlayBin2("VideoPlayer");
// rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 ! ffmpegcolorspace name=elphelstream";
//Playbin.setInputFile(new File("test.avi"));
/*java.net.URI uri = null;
try {
uri = new URI("rtsp://" + Parent.Camera.GetIP()[0] + ":554");
} catch (URISyntaxException ex) {
Logger.getLogger(GstreamerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
Playbin.setURI(uri);*/
videoComponent = new VideoComponent();
videoComponent.setPreferredSize(new Dimension(850, 480));
Playbin.setVideoSink(videoComponent.getElement());
}
public VideoComponent GetGSTVideoComponent() {
return videoComponent;
}
public void SetVideocomponent(VideoComponent newcomponent) {
videoComponent = newcomponent;
}
public void ToggleFullscreen() {
}
public void SetScale(float factor) {
//todo
//mediaPlayer.setScale(factor);
}
public void close() {
Parent.WriteLogtoConsole("Stopping Gstreamer Video Player");
pipe.setState(State.NULL);
Gst.deinit(); // more trouble
//State test = pipe.getState();
pipe = null; //do we really need this?
}
public void PauseVideoStream() {
Playbin.setState(State.PAUSED);
}
public void StopVideoStream() {
Playbin.setState(State.NULL);
}
public void PlayVideoStream() {
/*
String rtspsource = "";
if (Parent.Camera.GetColorMode() == ColorMode.RGB) {
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! decodebin ! ffmpegcolorspace name=elphelstream";
} else if (Parent.Camera.GetColorMode() == ColorMode.JP46) {
// rtspsrc location=rtsp://" + Parent.Camera.GetIP() + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 ! ffmpegcolorspace ! videorate ! "video/x-raw-yuv, format=(fourcc)I420, width=(int)1920, height=(int)1088, framerate=(fraction)25/1" ! xvimagesink sync=false max-lateness=-1
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 ! ffmpegcolorspace name=elphelstream";
} else {
//TODO in this mode we dont see anything from the non-jpeg compliant stream so the jp46 filter wont help, but what else should we show?
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 name=elphelstream";
}
pipe = Pipeline.launch(rtspsource);
videoComponent.setKeepAspect(true);
Element videosink = videoComponent.getElement();
pipe.add(videosink);
pipe.getElementByName("elphelstream").link(videosink);
Playbin.add(videosink);*/
// Pipeline pipe = new Pipeline("SimplePipeline");
/*
Element src = ElementFactory.make("rtspsrc", "elphelsrc");
src.set("location", "rtsp://" + Parent.Camera.GetIP()[0] + ":554");
src.set("protocols", "00000001"); // "0x00000001" doesnt work
src.set("latency", "50");
Playbin.add(src);*/
//Playbin.getElementByName("elphelsrc").link(Playbin.getSinks().get(0));
//Element sink = ElementFactory.make("fakesink", "Destination");
//Playbin.addMany(src, sink);
//src.link(sink);*/
try {
Playbin.setURI(new URI("rtsp://" + Parent.Camera.GetIP()[0] + ":554"));
} catch (URISyntaxException ex) {
Logger.getLogger(GstreamerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
//Playbin.getElementByName("uri").set("protocols", "00000001");
//Playbin.getElementByName("uri").set("latency", "50");
/*
Playbin.add(src);
Playbin.link(src);*/
//Playbin.setInputFile(new File("test.avi")); // works
Playbin.setState(State.PLAYING);
/*
final List<URI> playList = new LinkedList<URI>();
for (String arg : args) {
playList.add(new File(arg).toURI());
}
GSTPlayer.setPreferredSize(new Dimension(640, 480));
GSTPlayer.setControlsVisible(false);
//player.setKeepAspect(true);
GSTPlayer.getMediaPlayer().setPlaylist(playList);
GSTPlayer.getMediaPlayer().play();
*/
//GstreamerPlayer.SetVideocomponent(GstreamerVideoComponent);
/*
String rtspsource = "";
if (Parent.Camera.GetColorMode() == ColorMode.RGB) {
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! decodebin ! ffmpegcolorspace name=elphelstream";
} else if (Parent.Camera.GetColorMode() == ColorMode.JP46) {
// rtspsrc location=rtsp://" + Parent.Camera.GetIP() + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 ! ffmpegcolorspace ! videorate ! "video/x-raw-yuv, format=(fourcc)I420, width=(int)1920, height=(int)1088, framerate=(fraction)25/1" ! xvimagesink sync=false max-lateness=-1
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 ! ffmpegcolorspace name=elphelstream";
} else {
//TODO in this mode we dont see anything from the non-jpeg compliant stream so the jp46 filter wont help, but what else should we show?
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 name=elphelstream";
}
//Notes
//LUT
//gst-launch rtspsrc location=rtsp://192.168.10.141:554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! ffmpegcolorspace ! videorate ! coloreffects preset=heat ! ffmpegcolorspace ! autovideosink -v
//edge detection:
//gst-launch rtspsrc location=rtsp://192.168.10.141:554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! ffmpegcolorspace ! videorate ! edgetv ! ffmpegcolorspace ! autovideosink -v
// kind of scopes
//gst-launch rtspsrc location=rtsp://192.168.10.141:554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! ffmpegcolorspace ! videorate ! revtv ! ffmpegcolorspace ! autovideosink -v
pipe = Pipeline.launch(rtspsource);
videoComponent.setKeepAspect(true);
Element videosink = videoComponent.getElement();
pipe.add(videosink);
pipe.getElementByName("elphelstream").link(videosink);
pipe.setState(State.PLAYING);
List<Element> sinks = pipe.getSinks();
/*
String rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP() + ":554 latency=30 ! rtpjpegdepay ! jpegdec name=elphelstream";
pipe = Pipeline.launch(rtspsource);
//pipe = new Pipeline("GstreamerViewer");
//videosrc = ElementFactory.make("videotestsrc", "source");
//videosrc = ElementFactory.make("rtspsource ", "source");
///videosrc.setCaps(Caps.fromString("location=rtsp://192.168.10.141:554 latency=30"));
//Element rtpjpegdepay = ElementFactory.make("rtpjpegdepay", "rtpjpegdepay");
//Element jpegdec = ElementFactory.make("jpegdec", "jpegdec");
Element videosink = ElementFactory.make("xvimagesink", "sink");
//Element videosink = videoComponent.getElement();
pipe.add(videosink);
pipe.getElementByName("elphelstream").link(videosink);
//playbin.setInputFile(new File(args[0]));
//pipe.addMany(videosrc, rtpjpegdepay, jpegdec, videosink);
//videosrc.link(videosink);
//Element.linkMany(videosrc, rtpjpegdepay, jpegdec, videosink);
pipe.setState(State.PLAYING);
Gst.main();
pipe.setState(State.NULL);
//gst-launch rtspsrc location=rtsp://192.168.10.141:554 latency=30 ! rtpjpegdepay ! jpegdec ! xvimagesink
//VideoComponent videoComponent = new VideoComponent();
//videosink = videoComponent.getElement();
//playbin.setVideoSink(videosink);
//Element.linkMany(videosrc, videosink);*/
}
public void ReInitVideoStream() {
Parent.WriteLogtoConsole("Trying to reinit Gstreamer Video Player");
args = new String[2];
args[1] = "";
args[0] = "";
try {
args = Gst.init("ElphelVision", args);
} catch (GstException e) {
Parent.WriteErrortoConsole("Gst.init error: " + e);
}
}
public void RePlayVideoStream() {
Parent.WriteLogtoConsole("Trying to restart Gstreamer Video Player");
Playbin.setState(State.PLAYING);
/*
String rtspsource = "";
if (Parent.Camera.GetColorMode() == ColorMode.RGB) {
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec name=elphelstream";
} else if (Parent.Camera.GetColorMode() == ColorMode.JP46) {
// rtspsrc location=rtsp://" + Parent.Camera.GetIP() + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 ! ffmpegcolorspace ! videorate ! "video/x-raw-yuv, format=(fourcc)I420, width=(int)1920, height=(int)1088, framerate=(fraction)25/1" ! xvimagesink sync=false max-lateness=-1
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 ! ffmpegcolorspace name=elphelstream";
} else {
//TODO in this mode we dont see anything from the non-jpeg compliant stream so the jp46 filter wont help, but what else should we show?
rtspsource = "rtspsrc location=rtsp://" + Parent.Camera.GetIP()[0] + ":554 protocols=0x00000001 latency=50 ! rtpjpegdepay ! jpegdec ! queue ! jp462bayer ! queue ! bayer2rgb2 method=0 name=elphelstream";
}
//pipe = null;
pipe = Pipeline.launch(rtspsource);
videoComponent.setKeepAspect(true);
Element videosink = videoComponent.getElement();
pipe.add(videosink);
pipe.getElementByName("elphelstream").link(videosink);
//List<Element> sinks = pipe.getSinks();
//pipe.setClock(null);
//pipe.play();
//pipe.setState(State.PLAYING);
//pipe.play();*/
}
/*public void Overlay(Window overlay) {
mediaPlayer.setOverlay(overlay);
mediaPlayer.enableOverlay(true);
}*/
public void PlayVideoFile(String file) {
//mediaPlayer.playMedia("http://" + Parent.Camera.GetIP() + file);
}
}