From aa5a690bdfe957653f9b44e59e0390cd56e3bb09 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Mon, 28 Jul 2014 23:43:35 +0530 Subject: Add some examples for using the transcoding proxy --- examples/list-tokens.sh | 34 +++++++++++++++ examples/streams-stress-test.py | 93 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100755 examples/list-tokens.sh create mode 100755 examples/streams-stress-test.py diff --git a/examples/list-tokens.sh b/examples/list-tokens.sh new file mode 100755 index 0000000..1dfc051 --- /dev/null +++ b/examples/list-tokens.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# vim: set sts=2 sw=2 et tw=0 : +# + +HOST="http://localhost:8000" + +caps="application/x-rtp, media=(string)video" +start_port=5004 +end_port=5018 +udp_clients="localhost:$start_port" + +set -e + +add_tokens() { + local id + for port in $(seq $((start_port)) $end_port); do + id=$(date +%H%M%S)-$RANDOM + curl -s -X POST "$HOST/add-token?sessionid=$id&type=http,rtp-udp&udp-clients=localhost:$port" + done +} + +list_tokens() { + curl -s -X GET "$HOST/list-tokens" + echo +} + +revoke_tokens() { + local id + list_sessionids | while read id; do + curl -s -X DELETE "$HOST/revoke-token?sessionid=$id" + done +} + +list_tokens diff --git a/examples/streams-stress-test.py b/examples/streams-stress-test.py new file mode 100755 index 0000000..33cc20c --- /dev/null +++ b/examples/streams-stress-test.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +# vim: set sts=2 sw=2 et tw=0 : +# + +import json +import time +import random +import atexit +import datetime +import subprocess +import http.client +from itertools import zip_longest + +PROXY_HOST = "localhost:8000" +GST_LAUNCH_BASE = "gst-launch-1.0 -e videotestsrc is-live=TRUE ! videoscale ! \ + video/x-raw, height=120, width=160 ! timeoverlay font-desc=80px ! tee name=t \ + t. ! queue ! videoconvert ! vp8enc ! webmmux ! tee name=s \ + " +GST_LAUNCH_STREAMER = "" + +rtp_caps = "application/x-rtp, media=(string)video" +start_port = 5004 +end_port = 5104 +token_table = {} +processes = [] +stream_count = 0 + +for port in range(start_port, end_port+1): + someid = "{}-{}".format(datetime.datetime.now().strftime("%H%M%S.%f"), + random.randint(0, 100)) + clients = "localhost:{}".format(port) + token_table.update({someid: clients}) + +def cleanup(): + for p in processes: + p.term() + for sid, clients in token_table.items(): + revoke_token(conn, sid).read() + +def grouper(n, iterable, fillvalue=None): + "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" + args = [iter(iterable)] * n + return zip_longest(fillvalue=fillvalue, *args) + +def add_token(conn, someid, clients): + conn.request("POST", "/add-token?sessionid={}&type=http,rtp-udp&udp-clients={}".format(someid, clients)) + return conn.getresponse() + +def list_tokens(conn): + conn.request("GET", "/list-tokens") + return conn.getresponse() + +def revoke_token(conn, someid): + conn.request("DELETE", "/revoke-token?sessionid={}".format(someid)) + return conn.getresponse() + +def list_sessionids(conn): + r = list_tokens(conn) + l = json.loads(r) + return [e['sessionid'] for e in l] + +def list_udp_clients(conn): + r = list_tokens(conn) + l = json.loads(r) + return [e['udp-clients'] for e in l] + +def generate_souphttpclientsink(sid, clients): + base = "s. ! queue ! souphttpclientsink location=\"http://" + PROXY_HOST + return "{}/{}?type=http,rtp-udp&udp-clients={}\" ".format(base, sid, clients) + +conn = http.client.HTTPConnection(PROXY_HOST) +atexit.register(cleanup) + +# Add tokens to valid list +for sid, clients in token_table.items(): + add_token(conn, sid, clients).read() +list_tokens(conn).read() + +for group in grouper(10, token_table.items(), fillvalue=(None, None)): + sinks = [] + for sid, clients in group: + if not sid or not clients: + continue + sink = generate_souphttpclientsink(sid, clients) + sinks.append(sink) + stream_count += 1 + streamer = GST_LAUNCH_BASE + " ".join(sinks) + print(streamer) + processes.append(subprocess.Popen(streamer, shell=True)) + print("Currently streaming {} HTTP streams".format(stream_count)) + time.sleep(2) + +[p.wait() for p in processes] -- cgit v0.11.2-2-gd1dd