parse args, fix xauthority, clean up

Trey Moen 2 days ago
parent add5c1178d
commit 06a848c5d7
  1. 57
      tools/clip/run.py

@ -2,17 +2,16 @@
from argparse import ArgumentParser from argparse import ArgumentParser
from cereal.messaging import SubMaster from cereal.messaging import SubMaster
from openpilot.common.prefix import OpenpilotPrefix
from subprocess import DEVNULL
from random import randint
import atexit
import os import os
import signal import signal
import subprocess import subprocess
from subprocess import DEVNULL
import time import time
import atexit
from random import randint
from openpilot.common.prefix import OpenpilotPrefix
DEFAULT_DISPLAY = ":99"
RESOLUTION = "2160x1080" RESOLUTION = "2160x1080"
PIXEL_DEPTH = "24" PIXEL_DEPTH = "24"
FRAMERATE = 20 FRAMERATE = 20
@ -37,9 +36,11 @@ def main(route: str, output_filepath: str, start_seconds: int, end_seconds: int)
duration = end_seconds - start_seconds duration = end_seconds - start_seconds
env = os.environ.copy() env = os.environ.copy()
xauth = f'/tmp/clip-xauth--{display_num}'
env['XAUTHORITY'] = xauth
env["QT_QPA_PLATFORM"] = "xcb" env["QT_QPA_PLATFORM"] = "xcb"
ui_proc = subprocess.Popen(['xvfb-run', '-n', display_num, '-s', f'-screen 0 {RESOLUTION}x{PIXEL_DEPTH}', './selfdrive/ui/ui'], env=env) ui_proc = subprocess.Popen(['xvfb-run', '-f', xauth, '-n', display_num, '-s', f'-screen 0 {RESOLUTION}x{PIXEL_DEPTH}', './selfdrive/ui/ui'], env=env)
atexit.register(lambda: ui_proc.terminate()) atexit.register(lambda: ui_proc.terminate())
replay_proc = subprocess.Popen( replay_proc = subprocess.Popen(
@ -57,9 +58,9 @@ def main(route: str, output_filepath: str, start_seconds: int, end_seconds: int)
"-framerate", str(FRAMERATE), "-framerate", str(FRAMERATE),
"-f", "-f",
"x11grab", "x11grab",
"-i", f":{display_num}",
"-draw_mouse", "-draw_mouse",
"0", "0",
"-i", ":" + display_num,
"-c:v", "-c:v",
"libx264", "libx264",
"-preset", "-preset",
@ -68,7 +69,7 @@ def main(route: str, output_filepath: str, start_seconds: int, end_seconds: int)
"yuv420p", "yuv420p",
output_filepath, output_filepath,
] ]
ffmpeg_proc = subprocess.Popen(ffmpeg_cmd, env=env, stdout=DEVNULL, stderr=DEVNULL) ffmpeg_proc = subprocess.Popen(ffmpeg_cmd, env=env)
atexit.register(lambda: ffmpeg_proc.terminate()) atexit.register(lambda: ffmpeg_proc.terminate())
print('recording in progress...') print('recording in progress...')
@ -82,6 +83,28 @@ def main(route: str, output_filepath: str, start_seconds: int, end_seconds: int)
print(f"recording complete: {output_filepath}") print(f"recording complete: {output_filepath}")
def parse_args(parser: ArgumentParser):
args = parser.parse_args()
if not args.demo:
assert args.route is not None, 'must provide route'
assert args.route.count('/') == 1 or args.route.count('/') == 3, 'route must include or exclude timing, example: ' + DEMO_ROUTE
if args.demo:
args.route = DEMO_ROUTE
args.start = DEMO_START
args.end = DEMO_END
elif args.route.count('/') == 3:
parts = args.route.split('/')
args.start = int(parts[2])
args.end = int(parts[3])
args.route = '/'.join(parts[:2])
assert args.end > args.start, 'end must be greater than start'
return args
if __name__ == "__main__": if __name__ == "__main__":
p = ArgumentParser( p = ArgumentParser(
prog='clip.py', prog='clip.py',
@ -89,19 +112,15 @@ if __name__ == "__main__":
epilog='comma.ai' epilog='comma.ai'
) )
p.add_argument('-p', '--prefix', help='openpilot prefix', default=f'clip_{randint(100, 99999)}') p.add_argument('-p', '--prefix', help='openpilot prefix', default=f'clip_{randint(100, 99999)}')
p.add_argument('-r', '--route', help='Route', default=DEMO_ROUTE)
p.add_argument('-o', '--output', help='Output clip to (.mp4)', default=DEFAULT_OUTPUT) p.add_argument('-o', '--output', help='Output clip to (.mp4)', default=DEFAULT_OUTPUT)
p.add_argument('-s', '--start', help='Start clipping at <start> seconds', type=int, default=DEMO_START) p.add_argument('-s', '--start', help='Start clipping at <start> seconds', type=int)
p.add_argument('-e', '--end', help='Stop clipping at <end> seconds', type=int, default=DEMO_END) p.add_argument('-e', '--end', help='Stop clipping at <end> seconds', type=int)
args = p.parse_args() p.add_argument('-d', '--demo', help='Use the demo route', action='store_true')
assert args.end > args.start, 'end must be greater than start' p.add_argument('-r', '--route', help=f'The route (e.g. {DEMO_ROUTE} or {DEMO_ROUTE}/{DEMO_START}/{DEMO_END})')
assert args.route.count('/') == 1 or args.route.count('/') == 3, 'route must include or exclude timing, example: ' + DEMO_ROUTE
if args.route.count('/') == 3: args = parse_args(p)
parts = args.route.split('/')
args.start = int(parts[2])
args.end = int(parts[3])
args.route = '/'.join(parts[:2])
print(f'clipping route {args.route}, start={args.start} end={args.end}') print(f'clipping route {args.route}, start={args.start} end={args.end}')
try: try:
with OpenpilotPrefix(args.prefix, shared_download_cache=True) as p: with OpenpilotPrefix(args.prefix, shared_download_cache=True) as p:
main(args.route, args.output, args.start, args.end) main(args.route, args.output, args.start, args.end)

Loading…
Cancel
Save