gmyth-stream/server/0.3/plugins/transcoders/gmencoder.py
author melunko
Mon Aug 13 22:54:55 2007 +0100 (2007-08-13)
branchtrunk
changeset 801 e51af4d0caf5
parent 794 02ba1859ddc0
child 803 b1d0964060b3
permissions -rw-r--r--
[svn r807] Added gmyth_scheduler_add_schedule_full() method
     1 #!/usr/bin/env python
     2 
     3 __author__ = "Renato Filho"
     4 __author_email__ = "renato.filho@indt.org.br"
     5 __license__ = "GPL"
     6 __version__ = "0.2"
     7 
     8 import os
     9 import sys
    10 import shlex
    11 import signal
    12 import subprocess
    13 import time
    14 
    15 import select
    16 
    17 import lib.utils as utils
    18 import lib.server as server
    19 import lib.transcoder as transcoder
    20 
    21 __all__ = ("TranscoderGMencoder",)
    22 
    23 class TranscoderGMencoder(transcoder.Transcoder):
    24     gmencoder_path = utils.which("gmencoder")
    25     name = "gmencoder"
    26     priority = -1
    27     proc = None
    28 
    29     def __init__(self, params):
    30         self.status = 0
    31         transcoder.Transcoder.__init__(self, params)
    32         self.opts = []
    33         self.opts.append (self.gmencoder_path)
    34         self.opts.append ("-d")
    35         self._parser_params ()
    36 
    37         outfile = self.params_first("outfile", "")
    38 
    39         if outfile != "":
    40             path = os.path.join(sys.path[0], ".transcoded", outfile)
    41             self._insert_param("-o", "file://%s" % path)
    42         else:
    43             self._insert_param ("-o", "fd://%d" % outfd.fileno())
    44             self.opts.append ("-c")
    45 
    46         cmd = " ".join(self.opts)
    47 
    48     # __init__()
    49 
    50     def _insert_param (self, name, value):
    51         if (value != ""):
    52             self.opts.append(name)
    53             self.opts.append(value)
    54 
    55     def _parser_params (self):
    56         self._insert_param("-i", \
    57             "%s://%s" % (self.params_first("type", "file"),
    58                          self.params_first("uri", "")))
    59         self._insert_param("--video-encode", self.params_first("ve", "ffenc_mpeg1video"))
    60         self._insert_param("--video-opts", "bitrate=600000,pass=512,quantizer=0.05,quant-type=1")
    61         self._insert_param("--video-fps", self.params_first("fps", ""))
    62         self._insert_param("--video-width", self.params_first("width", "320"))
    63         self._insert_param("--video-height", self.params_first("height", "240"))
    64         self._insert_param("--audio-rate", "32000")
    65         self._insert_param("--audio-encode", self.params_first("ae", ""))
    66     # _parse_params
    67 
    68     def start(self, outfd):
    69         self.log.info(self.tid, "GMencoder: %s" % cmd)
    70 
    71         try:
    72             self.proc = subprocess.Popen(self.opts, stdin=subprocess.PIPE,
    73                                          stdout=subprocess.PIPE)
    74         except Exception, e:
    75             self.log.error(self.tid, "Error: executing GMencoder: %s" % e)
    76             outfd.write("Error: GMencoder: %s" % e)
    77             return False
    78 
    79         try:
    80             while (self.proc and self.proc.poll() == None):
    81                 r, w, x = select.select([self.proc.stdout], [], [], 0)
    82                 if self.proc.stdout in r:
    83                     progress = self.proc.stdout.readline()
    84                     if (progress.find ("PROGRESS") >= 0):
    85                         self.status = progress.split (":")[1]
    86         except Exception, e:
    87             self.log.error(self.tid, "Problems handling data: %s" % e)
    88             return False
    89 
    90         self.status = 100;
    91         return True
    92     # start()
    93 
    94 
    95     def stop(self):
    96         if self.proc:
    97             self.log.info(self.tid, "Stopped GMencoder plugin")
    98             try:
    99                 os.kill(self.proc.pid, signal.SIGKILL)
   100                 self.proc.wait()
   101             except Exception, e:
   102                 pass
   103 
   104             self.proc = None
   105     # stop()
   106 
   107     def get_progress(self):
   108         return self.status
   109 
   110     def get_lenght(self):
   111         return -1
   112 
   113 # TranscoderGMencoder