import os
import shlex
import signal
import subprocess
import time

import select

import lib.utils as utils
import lib.server as server

__all__ = ("TranscoderGMencoder",)

class TranscoderGMencoder(server.Transcoder):
    gmencoder_path = utils.which("gmencoder")
    name = "gmencoder"
    priority = -1
    proc = None

    def __init__(self, params):
        server.Transcoder.__init__(self, params)
        self.opts = []
    # __init__()

    def _insert_param (self, name, value):
        if (value != ""):
            self.opts.append(name)
            self.opts.append(value)

    def _parser_params (self):
        self._insert_param("-i", \
            "%s://%s" % (self.params_first("type", "file"), self.params_first("uri", "")))
        self._insert_param("--video-encode", self.params_first("ve", ""))
        self._insert_param("--video-opts", "bitrate=200,pass=2,quantizer=5")
        self._insert_param("--video-fps", self.params_first("fps", ""))
        self._insert_param("--video-width", self.params_first("width", ""))
        self._insert_param("--video-height", self.params_first("height", ""))
        self._insert_param("--audio-rate", "32000")
        self._insert_param("--audio-encode", self.params_first("ae", ""))
    # _parse_params

    def start(self, outfd):
        self.opts.append (self.gmencoder_path)
        self._parser_params ()
        self._insert_param ("-o", "fd://%d" % outfd.fileno())

        cmd = " ".join(self.opts)
        self.log.info ("GMencoder: %s", cmd)

        try:
            self.proc = subprocess.Popen(self.opts, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
        except Exception, e:
            self.log.error("Error executing GMencoder: %s" % e)
            return False

        try:
			while (self.proc and self.proc.poll() == None):
				r, w, x = select.select([self.proc.stdout], [], [], 0)
				if self.proc.stdout in r:
					progress = self.proc.stdout.readline()
					self.log.info ("stdout %s" % progress)
					if (progress.find ("PROGRESS") >= 0):
						self.status = progress.split (":")[1]
					#if (progress.find ("DONE") >= 0):
					#	break
			self.log.info ("Process exit")
        except Exception, e:
            self.log.error("Problems handling data: %s" % e)
            return False

        return True
    # start()


    def stop(self):
        if self.proc:
            self.log.info ("STOPED GMencoder plugin")
            try:
                self.proc.stdin.write ("QUIT\n")
            except Exception, e:
                pass

            try:
                self.proc.wait()
            except Exception, e:
                pass

            self.proc = None
    # stop()

# TranscoderGMencoder
