#!/usr/bin/python3
import gi
import os
import argparse

gi.require_version('Gst', '1.0')
gi.require_version('GLib', '2.0')
gi.require_version('GObject', '2.0')
from gi.repository import Gst

Gst.debug_set_active(True)
Gst.debug_set_default_threshold(3)
Gst.init(None)

import socketserver

def eos_probe(pad, info, bus):
    event = info.get_event()
    if event.type == Gst.EventType.EOS:
        bus.post(Gst.Message.new_eos())
        return Gst.PadProbeReturn.REMOVE
    return Gst.PadProbeReturn.OK

class MyTCPHandler(socketserver.BaseRequestHandler):

    def handle(self):
        # self.request is the TCP socket connected to the client
        print("Received stream from {}:".format(self.client_address[0]))
        fd = self.request.fileno()
        pipeline_string = os.environ.get("MULTITCPSRC_PIPELINE")
        print(f'\tusing pipeline: {pipeline_string}')
        pipeline = Gst.parse_launch(
            f'fdsrc do-timestamp=true name=vidsrc ! {pipeline_string}'
        )
        src = pipeline.get_by_name('vidsrc')
        src.props.fd = fd
        pipeline.set_state(Gst.State.READY)
        pipeline.set_state(Gst.State.PAUSED)
        pipeline.set_state(Gst.State.PLAYING)
        bus = pipeline.get_bus()
        src.get_static_pad('src').add_probe(Gst.PadProbeType.EVENT_BOTH, eos_probe, bus)
        bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS)
        print('pipeline ready to stop')

        pipeline.set_state(Gst.State.NULL)
        print('ending')
        
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Trigger Gstreamer pipeline per incoming tcp stream')
    parser.add_argument('--port', help="Listening to port", default=9999, type=int)
    parser.add_argument('--host', type=str, help="Bind to address", default="0.0.0.0")
    parser.add_argument('pipeline', nargs="*")
    args = parser.parse_args()
    if args.pipeline:
        os.environ["MULTITCPSRC_PIPELINE"] = ' '.join(args.pipeline)

    with socketserver.ThreadingTCPServer((args.host, args.port), MyTCPHandler) as server:
        server.serve_forever()

