gmyth-stream/plugins/media/mencoder.py
branchtrunk
changeset 479 5e1afa4a66e8
parent 475 2521ec986005
     1.1 --- a/gmyth-stream/plugins/media/mencoder.py	Sun Apr 01 03:11:01 2007 +0100
     1.2 +++ b/gmyth-stream/plugins/media/mencoder.py	Mon Apr 02 20:05:56 2007 +0100
     1.3 @@ -2,53 +2,90 @@
     1.4  import sys
     1.5  import lib
     1.6  import time
     1.7 +import signal
     1.8  import socket
     1.9  import ConfigParser
    1.10  
    1.11 +from select import *
    1.12 +from subprocess import *
    1.13 +
    1.14  class Media:
    1.15  
    1.16      def __init__(self, config):
    1.17  
    1.18          self.config = config
    1.19 +        self.language = "en"
    1.20          self.socket = None
    1.21          self.child_pid = None
    1.22          self.mplayer = None
    1.23 +        self.mencoder_pid = None
    1.24 +        self.mplayer_pid = None
    1.25 +        signal.signal(signal.SIGABRT, self.kill_handler)
    1.26 +
    1.27 +    def kill_handler(self, sig, frame):
    1.28 +        try:
    1.29 +            os.kill(self.mplayer_pid.pid + 1, signal.SIGKILL)
    1.30 +            sys.exit(0)
    1.31 +        except:
    1.32 +            lib.log("Problems closing child")
    1.33  
    1.34      def set_args(self, options):
    1.35  
    1.36          for opt in options:
    1.37  
    1.38 +            if (opt == "file" or opt == "dvd"):
    1.39 +                if (self.acodec == "mp3lame"):
    1.40 +                    audio = "-oac mp3lame -lameopts cbr:br=%s vol=5" % self.abitrate
    1.41 +                else:
    1.42 +                    audio = "-oac lavc -lavcopts acodec=%s abitrate=%s" % (\
    1.43 +                        self.acodec, self.abitrate)
    1.44 +
    1.45              if (opt == "file"):
    1.46                  self.kind = "file"
    1.47 -                self.args += " %s -mf fps=%d -of %s -oac %s -lameopts vol=5 cbr:br=%d"\
    1.48 -                             " -ovc lavc -lavcopts vcodec=%s:vbitrate=%d -vf scale=%d:%d"\
    1.49 +                self.args += " %s -mf fps=%s -of %s %s"\
    1.50 +                             " -ovc lavc -lavcopts vcodec=%s:vbitrate=%s -vf scale=%s:%s"\
    1.51                               " -o %s 1> /dev/null 2> /dev/null" % (
    1.52 -                    self.filename, self.fps, self.mux, self.acodec, self.abitrate,
    1.53 -                    self.vcodec, self.vbitrate, self.width, self.height, self.fifo)
    1.54 +                    self.filename, self.fps, self.mux, audio, self.vcodec,
    1.55 +                    self.vbitrate, self.width, self.height, self.fifo)
    1.56  
    1.57              elif (opt == "dvd"):
    1.58                  self.kind = "dvd"
    1.59 -                self.args += " dvd://%s -vf scale=%d:%d -oac %s -lameopts vol=5 cbr:br=%d"\
    1.60 -                             " -of %s -ovc lavc -lavcopts vcodec=%s:vbitrate=%d -o %s"\
    1.61 -                             " -mf fps=%d 1> /dev/null 2> /dev/null" % (
    1.62 -                    self.filename, self.width, self.height, self.acodec, self.abitrate,
    1.63 +                self.args += " dvd://%s -alang %s -vf scale=%s:%s %s"\
    1.64 +                             " -of %s -ovc lavc -lavcopts vcodec=%s:vbitrate=%s -o %s"\
    1.65 +                             " -ofps %s 1> /dev/null 2> /dev/null" % (
    1.66 +                    self.filename, self.language, self.width, self.height, audio,
    1.67                      self.mux, self.vcodec, self.vbitrate, self.fifo, self.fps)
    1.68  
    1.69              elif (opt == "local"):
    1.70                  self.mplayer = os.popen("which mplayer").read().strip()
    1.71  
    1.72 +            elif (opt.find("language=") >= 0):
    1.73 +                try:
    1.74 +                    self.language = opt.split("=")[1]
    1.75 +                except:
    1.76 +                    lib.log("Bad language option")
    1.77 +
    1.78 +
    1.79 +    def run_mplayer(self):
    1.80 +        msg = "%s 1>/dev/null 2>/dev/null" % self.filename
    1.81 +        if (self.kind == "dvd"):
    1.82 +            msg = "dvd://" + msg
    1.83 +
    1.84 +        self.mplayer += " " + msg
    1.85 +        self.mplayer_pid = Popen(self.mplayer, shell=True)
    1.86 +
    1.87      def setup(self, filename, mux, vcodec, vbitrate,\
    1.88                fps, acodec, abitrate, width, height, port, options):
    1.89  
    1.90          self.filename = filename
    1.91          self.mux = mux
    1.92          self.vcodec = vcodec
    1.93 -        self.vbitrate = int(vbitrate)
    1.94 -        self.fps = int(fps)
    1.95 +        self.vbitrate = vbitrate
    1.96 +        self.fps = fps
    1.97          self.acodec = acodec
    1.98 -        self.abitrate = int(abitrate)
    1.99 -        self.width = int(width)
   1.100 -        self.height = int(height)
   1.101 +        self.abitrate = abitrate
   1.102 +        self.width = width
   1.103 +        self.height = height
   1.104  
   1.105          self.port = int(port)
   1.106          self.fifo = self.config.get("Mencoder", "fifo_path")
   1.107 @@ -63,9 +100,7 @@
   1.108              return msg
   1.109  
   1.110          # good one: /tmp/dvb.mpg avi mpeg4 400 25 mp3lame 192 320 240 5000
   1.111 -        #mencoder dvd://2 -vf scale=640:480 -o title2.avi -oac copy -ovc lavc -lavcopts vcodec=mpeg4
   1.112          self.path = self.config.get("Mencoder", "path")
   1.113 -        self.path += self.args
   1.114  
   1.115          if (self.socket != None):
   1.116              del(self.socket)
   1.117 @@ -85,10 +120,9 @@
   1.118          except:
   1.119              lib.log("Fifo already exists")
   1.120  
   1.121 -        lib.log("Starting Mencoder: %s" % self.path )
   1.122 +        lib.log("Starting Mencoder: %s %s" % (self.path, self.args) )
   1.123          # exec Mencoder
   1.124 -        pin, self.pout = os.popen2(self.path)
   1.125 -        pin.close()
   1.126 +        self.mencoder_pid = Popen(self.path + self.args, shell=True)
   1.127  
   1.128          fifo = open(self.fifo)
   1.129  
   1.130 @@ -102,17 +136,15 @@
   1.131              conn.settimeout(5)
   1.132              retry = 0
   1.133  
   1.134 -            if (self.mplayer):
   1.135 -                msg = "%s 1>/dev/null 2>/dev/null" % self.filename
   1.136 -                if (self.kind == "dvd"):
   1.137 -                    msg = "dvd://" + msg
   1.138 -
   1.139 -                self.mplayer += " " + msg
   1.140 -                mplayer_in, self.mplayer_out = os.popen2(self.mplayer)
   1.141 -
   1.142              while( data != "" and retry < 5):
   1.143                  try:
   1.144                      conn.send(data)
   1.145 +                    r, w, x = select([conn], [], [], 0)
   1.146 +                    if conn in r:
   1.147 +                        back = conn.recv(1024)
   1.148 +                        if (back == "OK" and self.mplayer and not self.mplayer_pid):
   1.149 +                            self.run_mplayer()
   1.150 +
   1.151                  except socket.error:
   1.152                      lib.log("Socket error (maybe timeout ?)")
   1.153                      retry += 1
   1.154 @@ -124,20 +156,20 @@
   1.155              else:
   1.156                  lib.log("Client timed out")
   1.157  
   1.158 +            sys.exit(0)
   1.159 +
   1.160  
   1.161      def stop(self):
   1.162          try:
   1.163 -            self.pout.close()
   1.164 -            self.mplayer_out.close()
   1.165 +            os.kill(self.mencoder_pid.pid + 1, signal.SIGKILL)
   1.166 +            self.mplayer = None
   1.167          except:
   1.168              lib.log("Trying to stop before playing...")
   1.169  
   1.170 -        self.mplayer = None
   1.171 -
   1.172          if (self.socket != None):
   1.173              lib.log("Closing socket")
   1.174              self.socket.close()
   1.175  
   1.176              lib.log("Trying to stop Mencoder process")
   1.177              if (self.child_pid != None):
   1.178 -                os.kill(self.child_pid, 9)
   1.179 +                os.kill(self.child_pid, signal.SIGABRT)