sltv team mailing list archive
-
sltv team
-
Mailing list archive
-
Message #00009
[Branch ~sltv/sltv/trunk] Rev 10: improving the gui
------------------------------------------------------------
revno: 10
committer: lucasa@xxxxxxxxx
branch nick: SLTV
timestamp: Fri 2009-10-23 01:37:58 -0200
message:
improving the gui
modified:
build.xml
lib/sltv.jar
lib/substance-swingx.jar
src/br/org/softwarelivre/sltv/SLTVMain.java
src/br/org/softwarelivre/sltv/SLTVPlayerGst.java
src/br/org/softwarelivre/sltv/VideoPipeline.java
--
lp:sltv
https://code.launchpad.net/~sltv/sltv/trunk
Your team sltv is subscribed to branch lp:sltv.
To unsubscribe from this branch go to https://code.launchpad.net/~sltv/sltv/trunk/+edit-subscription.
=== modified file 'build.xml'
--- build.xml 2009-10-22 05:21:37 +0000
+++ build.xml 2009-10-23 03:37:58 +0000
@@ -3,7 +3,7 @@
<!--this file was created by Eclipse Runnable JAR Export Wizard-->
<!--ANT 1.7 is required -->
<target name="create_run_jar">
- <jar destfile="/home/lucasa/backup projeto-pensar 020909/eclipse/workspace/SLTV/lib/sltv.jar" filesetmanifest="mergewithoutmain">
+ <jar destfile="/home/lucasa/backup projeto-pensar 020909/eclipse/workspace/SLTV/lib/sltv.jar" filesetmanifest="mergewithoutmain" compress="true">
<manifest>
<attribute name="Built-By" value="${user.name}"/>
<attribute name="Main-Class" value="br.org.softwarelivre.sltv.SLTVMain"/>
@@ -20,5 +20,7 @@
<zipfileset excludes="META-INF/*.SF" src="/home/lucasa/backup projeto-pensar 020909/eclipse/workspace/SLTV/lib/substance-swingx.jar"/>
</jar>
<copy todir="/home/lucasa/" file="lib/sltv.jar" verbose="true"/>
+ <copy todir="/var/www/" file="lib/sltv.jar" verbose="true"/>
+ <copy todir="/var/www/" file="sltv.jnlp" verbose="true"/>
</target>
</project>
=== modified file 'lib/sltv.jar'
Binary files lib/sltv.jar 2009-10-22 05:19:28 +0000 and lib/sltv.jar 2009-10-23 03:37:58 +0000 differ
=== modified file 'lib/substance-swingx.jar'
Binary files lib/substance-swingx.jar 2009-10-22 05:21:37 +0000 and lib/substance-swingx.jar 2009-10-23 03:37:58 +0000 differ
=== modified file 'src/br/org/softwarelivre/sltv/SLTVMain.java'
--- src/br/org/softwarelivre/sltv/SLTVMain.java 2009-10-22 05:25:16 +0000
+++ src/br/org/softwarelivre/sltv/SLTVMain.java 2009-10-23 03:37:58 +0000
@@ -25,8 +25,7 @@
import javax.swing.UnsupportedLookAndFeelException;
import org.gstreamer.Gst;
-import org.pushingpixels.substance.api.skin.SubstanceGeminiLookAndFeel;
-import org.pushingpixels.substance.api.skin.SubstanceRavenLookAndFeel;
+import org.pushingpixels.substance.api.skin.SubstanceBusinessBlackSteelLookAndFeel;
import chrriis.dj.nativeswing.NativeSwing;
@@ -152,11 +151,11 @@
}
private static void configureLookAndFeel() {
-
// Define o look and feel.
try {
+ UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel());
//UIManager.setLookAndFeel(new SubstanceGeminiLookAndFeel());
- UIManager.setLookAndFeel(new SubstanceRavenLookAndFeel());
+ //UIManager.setLookAndFeel(new SubstanceRavenLookAndFeel());
//UIManager.setLookAndFeel(new NapkinLookAndFeel());
// UIManager.setLookAndFeel("org.jvnet.substance.skin.SubstanceRavenLookAndFeel");
} catch (UnsupportedLookAndFeelException e) {
@@ -334,13 +333,13 @@
getJDesktopPane().add(player);
player.setVisible(true);
- Thread thread = new Thread(new Runnable() {
+ Runnable thread = new Runnable() {
public void run() {
System.out.println("Playing video: "+path);
player.playVideo(path);
}
- });
- thread.start();
+ };
+ SwingUtilities.invokeLater(thread);
}
} // @jve:decl-index=0:visual-constraint="10,10"
=== modified file 'src/br/org/softwarelivre/sltv/SLTVPlayerGst.java'
--- src/br/org/softwarelivre/sltv/SLTVPlayerGst.java 2009-10-22 05:19:28 +0000
+++ src/br/org/softwarelivre/sltv/SLTVPlayerGst.java 2009-10-23 03:37:58 +0000
@@ -19,9 +19,13 @@
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
+import javax.swing.JSpinner;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
+import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.InternalFrameListener;
@@ -78,17 +82,32 @@
jxTaskePaneContainer.setBorder(new DropShadowBorder());
JXTaskPane tpPrincipal = new JXTaskPane();
- // Define o tÃtulo.
- tpPrincipal.setTitle("Principal");
-
+ // Define o tÃtulo.
+ tpPrincipal.setTitle("Principal");
JTextField jtextField_ServerIP = new JTextField();
JCheckBox jCheckBox_StreamOutput = new JCheckBox("Stream to Icecast2");
-
+ JCheckBox jCheckBox_VideoOutput = new JCheckBox("Output Video");
tpPrincipal.add(jtextField_ServerIP);
- tpPrincipal.add(jCheckBox_StreamOutput);
-
+ tpPrincipal.add(jCheckBox_StreamOutput);
+ tpPrincipal.add(jCheckBox_VideoOutput);
jxTaskePaneContainer.add(tpPrincipal);
+ JXTaskPane jxTaskPane_Audio = new JXTaskPane();
+ jxTaskPane_Audio.setTitle("Audio");
+ final JSpinner jSpinner = new JSpinner(new SpinnerNumberModel(50d,0d,100d,1d));
+ jSpinner.addChangeListener(new ChangeListener() {
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ Number value = (Number) jSpinner.getValue();
+ double v = value.doubleValue();
+ double volume = v/50;
+ getVideoPipeline().getAudioVolume().set("volume", volume);
+ System.out.println("Audio volume: "+volume*100+"%");
+ }
+ });
+ jxTaskPane_Audio.add(jSpinner);
+ jxTaskePaneContainer.add(jxTaskPane_Audio);
+
// JXTaskPane tpCalendario = new JXTaskPane();
// JXMonthView monthView = new JXMonthView();
// JXTaskPane tpSearchUrl = new JXTaskPane();
=== modified file 'src/br/org/softwarelivre/sltv/VideoPipeline.java'
--- src/br/org/softwarelivre/sltv/VideoPipeline.java 2009-10-22 05:19:28 +0000
+++ src/br/org/softwarelivre/sltv/VideoPipeline.java 2009-10-23 03:37:58 +0000
@@ -18,7 +18,9 @@
import org.gstreamer.PadLinkReturn;
import org.gstreamer.Pipeline;
import org.gstreamer.State;
+import org.gstreamer.Structure;
import org.gstreamer.Pad.EVENT_PROBE;
+import org.gstreamer.elements.DecodeBin;
import org.gstreamer.event.EOSEvent;
public class VideoPipeline {
@@ -38,16 +40,16 @@
private Element queueVideoOutput;
private Element videoOutput;
private Element textoverlay;
- private Element gnlcompositionVideo;
- private Element gnlcompositionAudio;
private Element identityTee;
private Element identityFilter;
private Element timeoverlay;
- private Caps capsVideo = Caps.fromString("video/x-raw-yuv, width=320, height=240, framerate=5/1");
- private Caps capsAudio = Caps.fromString("audio/x-raw-int; audio/x-raw-float");
- private int theoraStreamQuality = 40; //Range: 0 - 63
+ private Caps capsVideo = Caps.fromString("video/x-raw-yuv,width=320,height=240,framerate=5/1");
+ private Caps capsAudio = Caps.fromString("audio/x-raw-int,rate=22050,channels=1; audio/x-raw-float,rate=22050,channels=1");
+ private int theoraStreamQuality = 20; //Range: 0 - 63
private Element queueAudioBegin;
private Element teeAudio;
+ private Element audioVolume;
+ private DecodeBin decodeBin;
public enum SLTVEffects {
noeffect("identity"), quarktv, revtv, vertigotv, shagadelictv, warptv, dicetv, agingtv, edgetv, optv, radioactv, streaktv, rippletv;
@@ -83,14 +85,38 @@
srcIP = SLTVMain.LOCAL_IP_ADDRESS;
}
- public VideoPipeline(final String filepath, Element output) {
+ public VideoPipeline(String filepath, Element output) {
this();
this.videoOutput = output;
-
- gnlcompositionVideo = ElementFactory.make("gnlcomposition", "gnlcomposition-video");
- gnlcompositionAudio = ElementFactory.make("gnlcomposition", "gnlcomposition-audio");
+ Element filesrc = ElementFactory.make("filesrc", "Input File");
+ filesrc.set("location", filepath);
+ decodeBin = new DecodeBin("Decode Bin");
+
+ decodeBin.connect(new DecodeBin.NEW_DECODED_PAD() {
+ public void newDecodedPad(Element elem, Pad pad, boolean last) {
+ /* only link once */
+ if (pad.isLinked()) {
+ return;
+ }
+ /* check media type */
+ Caps caps = pad.getCaps();
+ Structure struct = caps.getStructure(0);
+ if (struct.getName().startsWith("audio/")) {
+ System.out.println("Linking audio pad: " + struct.getName());
+ pad.link(queueAudioBegin.getStaticPad("sink"));
+ } else if (struct.getName().startsWith("video/")) {
+ System.out.println("Linking video pad: " + struct.getName());
+ pad.link(queueVideoBegin.getStaticPad("sink"));
+ } else {
+ System.out.println("Unknown pad [" + struct.getName() + "]");
+ }
+ }
+ });
+
+ //gnlcompositionVideo = ElementFactory.make("gnlcomposition", "gnlcomposition-video");
+ //gnlcompositionAudio = ElementFactory.make("gnlcomposition", "gnlcomposition-audio");
/* listen for newly created pads */
Element.PAD_ADDED pad_added = new Element.PAD_ADDED() {
@@ -112,26 +138,20 @@
}
};
- gnlcompositionAudio.connect(pad_added);
- gnlcompositionVideo.connect(pad_added);
+ //gnlcompositionAudio.connect(pad_added);
+ //gnlcompositionVideo.connect(pad_added);
teeVideo = ElementFactory.make("tee", "tee");
- Element videofilesrcAudio = createFileSrc(filepath, 0, capsAudio);
- Element videofilesrcVideo = createFileSrc(filepath, 0, Caps.fromString("video/x-raw-yuv"));
- ((Bin) gnlcompositionAudio).add(videofilesrcAudio);
- ((Bin) gnlcompositionVideo).add(videofilesrcVideo);
-
- //Element videosrc = null;
- //videosrc = gnlcompositionVideo;
- //videosrc = ElementFactory.make("videotestsrc", "videotestsrc");
-
- pipe.addMany(gnlcompositionVideo, gnlcompositionAudio, queueVideoBegin, queueAudioBegin, teeVideo);
+ pipe.addMany(filesrc, decodeBin, queueAudioBegin, queueVideoBegin, teeVideo);
+ pipe.linkMany(filesrc, decodeBin);
+
+ linkAudioProcessing();
+
+ linkVideoProcessing();
linkAudioOutput();
- linkVideoEffectElements();
-
linkVideoOutput();
streamOggTheora();
@@ -144,14 +164,26 @@
private void linkAudioOutput() {
Element audioOutput = ElementFactory.make("autoaudiosink", null);
+ Element queue = ElementFactory.make("queue", null);
+ getPipeline().addMany(queue, audioOutput);
+ getPipeline().linkMany(teeAudio, queue, audioOutput);
+ }
+
+ private void linkAudioProcessing() {
Element capsFilter = ElementFactory.make("capsfilter", null);
capsFilter.setCaps(capsAudio);
- Element audioRate = ElementFactory.make("audiorate", null);
+ audioVolume = ElementFactory.make("volume", null);
+ //audioVolume.set("volume", 1d);
+ Element audioRate = ElementFactory.make("audiorate", null);
Element audioConvert = ElementFactory.make("audioconvert", null);
- Element queue = ElementFactory.make("queue", null);
+ Element resample = ElementFactory.make("audioresample", null);
teeAudio = ElementFactory.make("tee", "tee-audio");
- getPipeline().addMany(audioRate, audioConvert, capsFilter, teeAudio/*, queue, audioOutput*/);
- getPipeline().linkMany(queueAudioBegin, audioRate, audioConvert, capsFilter, teeAudio/*, queue, audioOutput*/);
+ getPipeline().addMany(audioRate, audioConvert, resample, capsFilter, audioVolume, teeAudio);
+ getPipeline().linkMany(queueAudioBegin, audioRate, audioConvert, resample, capsFilter, audioVolume, teeAudio);
+ }
+
+ public Element getAudioVolume() {
+ return audioVolume;
}
public VideoPipeline(Element output) {
@@ -160,36 +192,17 @@
this.videoOutput = output;
- gnlcompositionVideo = ElementFactory
- .make("gnlcomposition", "gnlcomposition");
-
- //Element videosrc = null;
- //videosrc = ElementFactory.make("videotestsrc", "source");
-
- /* listen for newly created pads */
- gnlcompositionVideo.connect(new Element.PAD_ADDED() {
- public void padAdded(Element element, Pad pad) {
- Pad sinkPad = queueVideoBegin.getPad("sink");
- pad.link(sinkPad);
- if (DEBUG)
- System.out.println("New Pad [" + pad.getName() + "] from "
- + pad.getParentElement().getName()
- + " was linked to pad " + sinkPad.getName()
- + " from " + sinkPad.getParentElement().getName());
- }
- });
-
teeVideo = ElementFactory.make("tee", "tee");
pipe.addMany(queueVideoBegin, teeVideo);
createReadNetworkBin(getPipeline(), srcIP, srcPort);
- linkVideoEffectElements();
+ linkVideoProcessing();
linkVideoOutput();
- streamOggTheora();
+ //streamOggTheora();
// create gstreamer bus service
createBusService();
@@ -197,8 +210,9 @@
pipe.play();
}
- private void linkVideoEffectElements()
+ private void linkVideoProcessing()
{
+
lastEffect = "filterBin";
Element videoscale = ElementFactory.make("videoscale", null);