← Back to team overview

sltv team mailing list archive

[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);