gmyth-stream/server/0.2/plugins/transcoders/gmencoder.py
author renatofilho
Thu Aug 16 14:46:11 2007 +0100 (2007-08-16)
branchtrunk
changeset 807 add4025ca678
parent 672 4e623a4274a1
permissions -rw-r--r--
[svn r813] created a timeout function for invalid channels
renatofilho@589
     1
import os
renatofilho@589
     2
import shlex
renatofilho@589
     3
import signal
renatofilho@589
     4
import subprocess
renatofilho@672
     5
import time
renatofilho@672
     6
renatofilho@672
     7
import select
renatofilho@589
     8
renatofilho@589
     9
import lib.utils as utils
renatofilho@589
    10
import lib.server as server
renatofilho@589
    11
renatofilho@589
    12
__all__ = ("TranscoderGMencoder",)
renatofilho@589
    13
renatofilho@589
    14
class TranscoderGMencoder(server.Transcoder):
renatofilho@589
    15
    gmencoder_path = utils.which("gmencoder")
renatofilho@589
    16
    name = "gmencoder"
renatofilho@589
    17
    priority = -1
renatofilho@589
    18
    proc = None
renatofilho@589
    19
renatofilho@589
    20
    def __init__(self, params):
renatofilho@589
    21
        server.Transcoder.__init__(self, params)
renatofilho@589
    22
        self.opts = []
renatofilho@589
    23
    # __init__()
renatofilho@589
    24
renatofilho@589
    25
    def _insert_param (self, name, value):
renatofilho@589
    26
        if (value != ""):
renatofilho@589
    27
            self.opts.append(name)
renatofilho@589
    28
            self.opts.append(value)
renatofilho@589
    29
renatofilho@589
    30
    def _parser_params (self):
renatofilho@589
    31
        self._insert_param("-i", \
renatofilho@672
    32
            "%s://%s" % (self.params_first("type", "file"), self.params_first("uri", "")))
renatofilho@589
    33
        self._insert_param("--video-encode", self.params_first("ve", ""))
renatofilho@589
    34
        self._insert_param("--video-opts", "bitrate=200,pass=2,quantizer=5")
renatofilho@589
    35
        self._insert_param("--video-fps", self.params_first("fps", ""))
renatofilho@589
    36
        self._insert_param("--video-width", self.params_first("width", ""))
renatofilho@589
    37
        self._insert_param("--video-height", self.params_first("height", ""))
renatofilho@602
    38
        self._insert_param("--audio-rate", "32000")
renatofilho@589
    39
        self._insert_param("--audio-encode", self.params_first("ae", ""))
morphbr@595
    40
    # _parse_params
morphbr@595
    41
renatofilho@589
    42
    def start(self, outfd):
renatofilho@589
    43
        self.opts.append (self.gmencoder_path)
renatofilho@589
    44
        self._parser_params ()
renatofilho@602
    45
        self._insert_param ("-o", "fd://%d" % outfd.fileno())
renatofilho@589
    46
renatofilho@589
    47
        cmd = " ".join(self.opts)
morphbr@595
    48
        self.log.info ("GMencoder: %s", cmd)
renatofilho@589
    49
renatofilho@589
    50
        try:
renatofilho@672
    51
            self.proc = subprocess.Popen(self.opts, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
renatofilho@589
    52
        except Exception, e:
morphbr@595
    53
            self.log.error("Error executing GMencoder: %s" % e)
renatofilho@589
    54
            return False
renatofilho@589
    55
renatofilho@589
    56
        try:
renatofilho@672
    57
			while (self.proc and self.proc.poll() == None):
renatofilho@672
    58
				r, w, x = select.select([self.proc.stdout], [], [], 0)
renatofilho@672
    59
				if self.proc.stdout in r:
renatofilho@672
    60
					progress = self.proc.stdout.readline()
renatofilho@680
    61
					self.log.info ("stdout %s" % progress)
renatofilho@672
    62
					if (progress.find ("PROGRESS") >= 0):
renatofilho@672
    63
						self.status = progress.split (":")[1]
renatofilho@680
    64
					#if (progress.find ("DONE") >= 0):
renatofilho@680
    65
					#	break
renatofilho@672
    66
			self.log.info ("Process exit")
renatofilho@589
    67
        except Exception, e:
renatofilho@589
    68
            self.log.error("Problems handling data: %s" % e)
renatofilho@589
    69
            return False
renatofilho@589
    70
renatofilho@589
    71
        return True
renatofilho@589
    72
    # start()
renatofilho@589
    73
renatofilho@589
    74
renatofilho@589
    75
    def stop(self):
renatofilho@589
    76
        if self.proc:
renatofilho@672
    77
            self.log.info ("STOPED GMencoder plugin")
renatofilho@589
    78
            try:
renatofilho@589
    79
                self.proc.stdin.write ("QUIT\n")
renatofilho@589
    80
            except Exception, e:
renatofilho@589
    81
                pass
renatofilho@589
    82
renatofilho@589
    83
            try:
renatofilho@589
    84
                self.proc.wait()
renatofilho@589
    85
            except Exception, e:
renatofilho@589
    86
                pass
renatofilho@589
    87
renatofilho@589
    88
            self.proc = None
renatofilho@589
    89
    # stop()
renatofilho@589
    90
renatofilho@589
    91
# TranscoderGMencoder