# HG changeset patch
# User morphbr
# Date 1175036262 -3600
# Node ID a7aba7d166fb840c9e16884b199c776d89f85fde
# Parent  997f281ba5960f253274a687ce0fe3f97e4144b1
[svn r471] - Added plugins/media/ffmpeg.py
 - Added tests/client_ffmpeg.py (To test ffmpeg plugin using mplayer)
 - Bug fixes inside gmyth-stream

diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/main.py
--- a/gmyth-stream/main.py	Tue Mar 27 21:43:05 2007 +0100
+++ b/gmyth-stream/main.py	Tue Mar 27 23:57:42 2007 +0100
@@ -1,30 +1,3 @@
- '''
- # GMyth-Stream
- #
- # @file main.py
- #
- # @brief <p> Plugin for GMyth-Stream
- #
- # Copyright (C) 2007 INdT - Instituto Nokia de Tecnologia.
- # @author Artur Duque de Souza <artur.souza@indt.org.br>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU Lesser General Public License as published by
- # the Free Software Foundation; either version 2 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 Lesser General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- #
- '''
-
 #!/usr/bin/python
 
 import sys
@@ -62,7 +35,9 @@
         elif (msg == "SETUP"):
             setup = server.getMsg(1024).strip().split(" ")
             media.setup(setup[0], setup[1], setup[2], \
-                        setup[3], setup[4], setup[5])
+                        setup[3], setup[4], setup[5],
+                        setup[6], setup[7], setup[8],
+                        setup[9])
 
         elif (msg == "PLAY"):
             media.play()
@@ -81,5 +56,5 @@
     server.disconnect_client(con)
 
 server.stop()
-
+del(server)
 print "--> Server stopped..."
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/plugins/comm/tcp.py
--- a/gmyth-stream/plugins/comm/tcp.py	Tue Mar 27 21:43:05 2007 +0100
+++ b/gmyth-stream/plugins/comm/tcp.py	Tue Mar 27 23:57:42 2007 +0100
@@ -1,30 +1,3 @@
- '''
- # GMyth-Stream
- #
- # @file main.py
- #
- # @brief <p> Plugin for GMyth-Stream
- #
- # Copyright (C) 2007 INdT - Instituto Nokia de Tecnologia.
- # @author Artur Duque de Souza <artur.souza@indt.org.br>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU Lesser General Public License as published by
- # the Free Software Foundation; either version 2 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 Lesser General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- #
- '''
-
 import time
 import socket
 
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/plugins/media/ffmpeg.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gmyth-stream/plugins/media/ffmpeg.py	Tue Mar 27 23:57:42 2007 +0100
@@ -0,0 +1,72 @@
+import os
+import sys
+import time
+import socket
+import ConfigParser
+
+class Media:
+
+    def __init__(self, config):
+
+        self.config = config
+
+    def setup(self, filename, mux, vcodec, vbitrate,\
+              fps, acodec, abitrate, width, height, port):
+
+        self.filename = filename
+        self.mux = mux
+        self.vcodec = vcodec
+        self.vbitrate = int(vbitrate)
+        self.fps = int(fps)
+        self.acodec = acodec
+        self.abitrate = int(abitrate)
+        self.width = int(width)
+        self.height = int(height)
+
+        self.port = int(port)
+
+        # good one: /tmp/mpg/cpm.mpg mpeg mpeg1video 400 25 mp2 192 320 240 5000
+        self.path = self.config.get("FFmpeg", "path")
+        self.path += " -i %s -f %s -vcodec %s -b %d -r %d -acodec %s -ab %d -s %dx%d -" % (
+            self.filename, self.mux, self.vcodec, self.vbitrate,\
+            self.fps, self.acodec, self.abitrate, self.width, self.height)
+
+        self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
+        self.socket.bind( ('', self.port) )
+
+    def play(self):
+
+        self.socket.listen(1)
+
+        print "Starting FFmpeg: %s" % self.path
+
+        # exec FFmpeg and get stdout
+        child_stdin, child_stdout = os.popen2(self.path)
+        child_stdin.close()
+
+        self.child_pid = os.fork()
+        if (self.child_pid == 0):
+            #child
+
+            conn,addr= self.socket.accept()
+            print "--> Sending Data..."
+            data = child_stdout.read(1024)
+
+            while( data != ""):
+                try:
+                    conn.send(data)
+                except socket.error:
+                    break
+                data = child_stdout.read(1024)
+
+            print "--> Finished sending data..."
+            conn.close()
+
+
+    def stop(self):
+
+        print "--> Trying to stop FFmpeg process..."
+        self.socket.close()
+        os.kill(self.child_pid, 9)
+
+
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/plugins/media/gstreamer.py
--- a/gmyth-stream/plugins/media/gstreamer.py	Tue Mar 27 21:43:05 2007 +0100
+++ b/gmyth-stream/plugins/media/gstreamer.py	Tue Mar 27 23:57:42 2007 +0100
@@ -1,30 +1,3 @@
- '''
- # GMyth-Stream
- #
- # @file main.py
- #
- # @brief <p> Plugin for GMyth-Stream
- #
- # Copyright (C) 2007 INdT - Instituto Nokia de Tecnologia.
- # @author Artur Duque de Souza <artur.souza@indt.org.br>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU Lesser General Public License as published by
- # the Free Software Foundation; either version 2 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 Lesser General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- #
- '''
-
 import pygst
 pygst.require("0.10")
 import gst
@@ -38,13 +11,20 @@
         self.config = config
         self.pipe = ""
 
-    def setup(self, filename, codec, bitrate, width, height, port):
+
+    def setup(self, filename, mux, vcodec, vbitrate,\
+              fps, acodec, abitrate, width, height, port):
 
         self.filename = filename
-        self.codec = codec
-        self.bitrate = int(bitrate)
+        self.mux = mux
+        self.vcodec = vcodec
+        self.vbitrate = int(vbitrate)
+        self.fps = int(fps)
+        self.acodec = acodec
+        self.abitrate = int(abitrate)
         self.width = int(width)
         self.height = int(height)
+
         self.port = int(port)
 
         ## Pipelines
@@ -62,7 +42,7 @@
                     " me-method=2 ! rtph263ppay ! udpsink host=224.0.0.1 port=%d d. ! "\
                     "queue  ! audioconvert ! faac ! rtpmp4gpay ! udpsink name=udp_audio "\
                     "host=224.0.0.1 port=%d" % (self.filename, self.width, self.height,\
-                                                self.bitrate, self.port, self.port+2)
+                                                self.vbitrate, self.port, self.port+2)
 
         #self.pipe = "filesrc location=/tmp/mpg/cpm.mpg ! decodebin ! ffmpegcolorspace ! ximagesink"
 
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/plugins/media/vlc.py
--- a/gmyth-stream/plugins/media/vlc.py	Tue Mar 27 21:43:05 2007 +0100
+++ b/gmyth-stream/plugins/media/vlc.py	Tue Mar 27 23:57:42 2007 +0100
@@ -1,30 +1,3 @@
-'''
- # GMyth-Stream
- #
- # @file main.py
- #
- # @brief <p> Plugin for GMyth-Stream
- #
- # Copyright (C) 2007 INdT - Instituto Nokia de Tecnologia.
- # @author Artur Duque de Souza <artur.souza@indt.org.br>
- #
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU Lesser General Public License as published by
- # the Free Software Foundation; either version 2 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 Lesser General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- #
- '''
-
 import os
 import sys
 import time
@@ -52,12 +25,12 @@
             self.path += " -I telnet -d 1> /dev/null 2> /dev/null &"
             os.system(self.path)
             sys.exit(0)
-
-        print "ESTOU EM PARENT 1"
-        time.sleep(3)
-        print "ESTOU EM PARENT 2"
-        self.sock.connect( (self.host, self.port) )
-        self.sock.send("%s\n" % self.pwd)
+        else:
+            print "ESTOU EM PARENT 1"
+            time.sleep(3)
+            print "ESTOU EM PARENT 2"
+            self.sock.connect( (self.host, self.port) )
+            self.sock.send("%s\n" % self.pwd)
 
 
     def insert_file(self, filename):
@@ -65,20 +38,28 @@
         self.sock.send("setup output0 input %s\n" % filename)
 
 
-    def setup(self, filename, codec, bitrate, width, height, port):
+
+    def setup(self, filename, mux, vcodec, vbitrate,\
+              fps, acodec, abitrate, width, height, port):
 
         self.filename = filename
-        self.codec = codec
-        self.bitrate = int(bitrate)
+        self.mux = mux
+        self.vcodec = vcodec
+        self.vbitrate = int(vbitrate)
+        self.fps = int(fps)
+        self.acodec = acodec
+        self.abitrate = int(abitrate)
         self.width = int(width)
         self.height = int(height)
+
         self.port = int(port)
 
+
         self.pipe = "#transcode{vcodec=%s,vb=%d,"\
                     "fps=25.0,scale=1,acodec=mpga,"\
                     "ab=64,channels=1,width=%d,height=%d}"\
                     ":duplicate{dst=std{access=http,"\
-                    "mux=mpeg1,dst=:%d}}" % (self.codec, self.bitrate,\
+                    "mux=mpeg1,dst=:%d}}" % (self.vcodec, self.vbitrate,\
                                              self.widht, self.height,\
                                              self.port)
 
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/stream.conf
--- a/gmyth-stream/stream.conf	Tue Mar 27 21:43:05 2007 +0100
+++ b/gmyth-stream/stream.conf	Tue Mar 27 23:57:42 2007 +0100
@@ -1,12 +1,18 @@
-[Media]
-engine = gstreamer
-
 [Comm]
 engine = tcp
-port = 12344
+port = 12345
+
+
+[Media]
+engine = ffmpeg
+
 
 [Vlc]
 path = /usr/local/bin/vlc
 host = 127.0.0.1
 port = 4212
 pwd = admin
+
+
+[FFmpeg]
+path = /usr/bin/ffmpeg
diff -r 997f281ba596 -r a7aba7d166fb gmyth-stream/tests/client_ffmpeg.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gmyth-stream/tests/client_ffmpeg.py	Tue Mar 27 23:57:42 2007 +0100
@@ -0,0 +1,24 @@
+import os
+import time
+import socket
+
+HOST='localhost'
+PORT=5000
+
+s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
+s.settimeout(10)
+
+arq = open('/tmp/dvb.mpg','r')
+
+mplayer = os.popen("which mplayer").read().strip()
+mplayer += " -noidx -"
+pin, pout = os.popen2(mplayer)
+
+s.connect((HOST,PORT))
+i = 0
+
+data = s.recv(1024)
+while (data != ""):
+    pin.write(data)
+    data = s.recv(1024)
+