diff --git a/clients/dash_client.py b/clients/dash_client.py index 236fba6..0e3da6e 100644 --- a/clients/dash_client.py +++ b/clients/dash_client.py @@ -137,7 +137,7 @@ async def fetchNextSegment(self, segment_list, bitrate = 0): for fname in sorted(glob(segment_list)): _, self.segment_baseName = fname.rsplit('/', 1) - self.args.urls[0] = self.baseUrl + '/' + str(os.stat(fname).st_size) + self.args.urls[0] = self.baseUrl.rstrip('manifest') + str(os.stat(fname).st_size) start = time.time() res = await perform_http_request(client=self.protocol, @@ -179,10 +179,12 @@ async def fetchNextSegment(self, segment_list, bitrate = 0): async def download_segment(self) -> None: if config.NUM_SERVER_PUSHED_FRAMES is not None: self.currentSegment = config.NUM_SERVER_PUSHED_FRAMES + 1 + for i in range(1, config.NUM_SERVER_PUSHED_FRAMES + 1): + await self.segmentQueue.put("Frame-pushed-" + str(i) + ".ppm") else: self.currentSegment += 1 - while self.currentSegment < self.totalSegments: + while self.currentSegment <= self.totalSegments: async with self.lock: currBuff = self.currBuffer diff --git a/config.py b/config.py index d2d87b6..7c6b278 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,7 @@ # Can provide a list of manifest to download via HTTP/3 URLS = ['https://localhost:4433/'] -NUM_SERVER_PUSHED_FRAMES = 10 +NUM_SERVER_PUSHED_FRAMES = 3 MANIFEST_FILE = "/home/aniketh/devel/src/abr-over-quic/htdocs/bbb_m.json" CA_CERTS = "tests/pycacert.pem" diff --git a/demo.py b/demo.py index 70c14d6..ea576dc 100644 --- a/demo.py +++ b/demo.py @@ -4,16 +4,19 @@ import datetime import os +import json from urllib.parse import urlencode import httpbin from asgiref.wsgi import WsgiToAsgi from starlette.applications import Starlette -from starlette.responses import PlainTextResponse, Response +from starlette.responses import PlainTextResponse, Response, JSONResponse from starlette.staticfiles import StaticFiles from starlette.templating import Jinja2Templates from starlette.websockets import WebSocketDisconnect +import config + ROOT = os.path.dirname(__file__) STATIC_ROOT = os.environ.get("STATIC_ROOT", os.path.join(ROOT, "htdocs")) STATIC_URL = "/" @@ -21,7 +24,7 @@ QVIS_URL = "https://qvis.edm.uhasselt.be/" templates = Jinja2Templates(directory=os.path.join(STATIC_ROOT, "templates")) -app = Starlette() +app = Starlette(debug=True) @app.route("/") @@ -32,6 +35,21 @@ async def homepage(request): await request.send_push_promise("/style.css") return templates.TemplateResponse("index.html", {"request": request}) +@app.route("/manifest/{filename:str}") +async def manifest(request): + server_pushed = 0 + + filename = request.path_params['filename'] + manifest = json.load(open(STATIC_ROOT + "/" + filename)) + segment = manifest['segment_size_bytes'][0][2] + + if config.NUM_SERVER_PUSHED_FRAMES is not None: + while server_pushed < config.NUM_SERVER_PUSHED_FRAMES: + await request.send_push_promise(str(segment)) + server_pushed += 1 + + return JSONResponse(manifest) + @app.route("/echo", methods=["POST"]) async def echo(request):