[svn r520] Gets and sets functions to the parameters.
10 from subprocess import *
14 def __init__(self, config):
22 self.mencoder_pid = None
23 self.mplayer_pid = None
24 signal.signal(signal.SIGABRT, self.kill_handler)
28 def kill_handler(self, sig, frame):
30 os.kill(self.mplayer_pid.pid, signal.SIGKILL)
31 log.debug("Killed Mplayer")
34 log.error("Problems closing child")
38 def set_args(self, options):
43 self.mplayer = lib.which("mplayer")
45 elif opt.find("language=") >= 0:
47 self.language = opt.split("=")[1]
49 log.error("Bad language option")
51 elif opt.find("format=") >= 0:
53 self.mux += " -mpegopts format=%s" % opt.split("=")[1]
55 log.error("Bad format option")
59 def run_mplayer(self):
62 if self.kind == "dvd":
65 self.mplayer_pid = Popen([self.mplayer, self.filename, "1> %s" % os.devnull,\
66 "2> %s" % os.devnull], stdout=PIPE, close_fds=True)
71 def setup_mencoder(self):
72 self.path = self.config.get("Mencoder", "path")
73 mp = Popen([self.path], stdout=PIPE, close_fds=True)
75 version = mp.stdout.read().split("MEncoder ")[1].split(" (C)")[0].split("-")[-1]
77 if version > "4.1.1": self.mencoder_old = False
78 else: self.mencoder_old = True
80 os.kill(mp.pid, signal.SIGKILL)
81 log.info("Mencoder version: %s" % version)
84 self.fifo = self.config.get("Mencoder", "fifo_path")
90 def setup_audio(self, acodec):
92 if acodec == "mp3lame":
93 return "-oac mp3lame -lameopts cbr:br=%s vol=5" % self.abitrate
95 return = "-oac lavc -lavcopts acodec=%s:abitrate=%s" % (\
96 self.acodec, self.abitrate)
98 def setup_filename(self, filename):
100 self.kind, self.filename = filename.split("://")
102 return (False, "Wrong filename protocol")
104 audio = setup_audio(self.acodec)
106 if self.kind == "file":
107 if not os.path.exists(self.filename):
108 msg = "File requested does not exist. SETUP failed."
112 self.args += " %s -mf fps=%s -of %s %s"\
113 " -ovc lavc -lavcopts vcodec=%s:vbitrate=%s -vf scale=%s:%s"\
114 " -really-quiet -o %s 2>/dev/null" % (
115 self.filename, self.fps, self.mux, audio, self.vcodec,
116 self.vbitrate, self.width, self.height, self.fifo)
118 elif self.kind == "dvd":
119 self.args += " dvd://%s -alang %s -vf scale=%s:%s %s"\
120 " -of %s -ovc lavc -lavcopts vcodec=%s:vbitrate=%s"\
121 " -ofps %s -really-quiet -o %s 2>/dev/null" % (
122 self.filename, self.language, self.width, self.height, audio,
123 self.mux, self.vcodec, self.vbitrate, self.fps, self.fifo)
129 def setup_socket(self, socket):
133 socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
134 socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
137 socket.bind( ('', self.port) )
140 log.error("Could not create socket: %s" % e)
146 MENCODER SETUP DESCRIPTION
147 ===========================
149 -> mux, vcodecs and acodecs
150 |-> mencoder (-of | -ovc | -oac) help
152 -> if used mpeg as mux:
153 |-> to setup format: format=%s as an option at the end
157 def setup(self, filename, mux, vcodec, vbitrate,\
158 fps, acodec, abitrate, width, height, port, options):
162 self.vbitrate = vbitrate
165 self.abitrate = abitrate
168 self.port = int(port)
170 self.setup_mencoder()
171 ret_val = self.setup_filename(filename)
176 self.set_args(options)
178 # good one: /tmp/dvb.mpg avi mpeg4 400 25 mp3lame 192 320 240 5000 file
179 # /tmp/dvb.mpg mpeg mpeg1video 400 25 mp2 192 320 240 5000 format=mpeg1 file
180 #4 mpeg mpeg1video 400 25 mp3lame 192 400 240 5000 language=en local dvd
181 ret_val = setup_socket(self.socket)
192 if self.mencoder_old:
196 lib.log("Fifo already exists")
199 lib.log("Starting Mencoder: %s %s" % (self.path, self.args) )
201 if self.mencoder_old:
202 self.mencoder_pid = Popen(self.path + self.args, shell=True,
204 self.pout = open(self.fifo)
206 self.path += self.args
207 pin, self.pout = os.popen2(self.path)
209 self.child_pid = os.fork()
211 if self.child_pid == 0:
212 conn,addr= self.socket.accept()
213 lib.log("Sending Data to client: %s" % addr[0])
215 data = self.pout.read(1024)
220 while data != "" and retry < 5:
223 r, w, x = select([conn], [], [], 0)
225 back = conn.recv(1024)
226 if back == "OK" and self.mplayer and not self.mplayer_pid:
230 lib.log("Socket error (maybe timeout ?)")
233 data = self.pout.read(1024)
236 lib.log("Finished sending Data to client: %s" % addr[0])
238 lib.log("Client timed out")
246 os.kill(self.mencoder_pid.pid + 1, signal.SIGKILL)
251 lib.log("Trying to stop before playing...")
253 if self.socket != None:
254 lib.log("Closing socket")
257 lib.log("Trying to stop Mencoder process")
258 if self.child_pid != None:
259 os.kill(self.child_pid, signal.SIGABRT)