| from .gst import * |
| |
| def image_file(filename): |
| return ( |
| Filter('filesrc', location=filename), |
| Filter('decodebin'), |
| ) |
| |
| def video_file(filename): |
| return ( |
| Filter('filesrc', location=filename), |
| Filter('qtdemux'), |
| Filter('h264parse'), |
| Filter('vpudec'), |
| ) |
| |
| def v4l2_camera(fmt): |
| return ( |
| Filter('v4l2src', device=fmt.device), |
| Caps('video/x-raw', format=fmt.pixel, width=fmt.size.width, height=fmt.size.height, |
| framerate='%d/%d' % fmt.framerate), |
| ) |
| |
| def display_sink(fullscreen, sync=False): |
| return Filter('kmssink' if fullscreen else 'waylandsink', sync=sync), |
| |
| def h264_sink(display_decoded=False): |
| appsink = Filter('appsink', name='h264sink', emit_signals=True, max_buffers=1, drop=False, sync=False), |
| |
| if display_decoded: |
| return Tee(pads=( |
| (Queue(), appsink), |
| (Queue(), Filter('vpudec'), Filter('kmssink', sync=False)) |
| )) |
| |
| return appsink |
| |
| def inference_pipeline(render_size, inference_size): |
| size = max_inner_size(render_size, inference_size) |
| return ( |
| Filter('glfilterbin', filter='glcolorscale'), |
| Caps('video/x-raw', format='RGBA', width=size.width, height=size.height), |
| Filter('videoconvert'), |
| Caps('video/x-raw', format='RGB', width=size.width, height=size.height), |
| Filter('videobox', autocrop=True), |
| Caps('video/x-raw', width=inference_size.width, height=inference_size.height), |
| Filter('appsink', name='appsink', emit_signals=True, max_buffers=1, drop=True, sync=False) |
| ) |
| |
| # Display |
| def image_display_pipeline(filename, render_size, inference_size, fullscreen): |
| size = max_inner_size(render_size, inference_size) |
| return ( |
| image_file(filename), |
| Tee(pads=(( |
| Queue(), |
| Filter('imagefreeze'), |
| Filter('videoconvert'), |
| Filter('videoscale'), |
| Caps('video/x-raw', width=render_size.width, height=render_size.height), |
| Filter('rsvgoverlay', name='overlay'), |
| display_sink(fullscreen), |
| ),( |
| Queue(), |
| Filter('imagefreeze'), |
| Filter('videoconvert'), |
| Filter('videoscale'), |
| Caps('video/x-raw', format='RGB', width=size.width, height=size.height), |
| Filter('videobox', autocrop=True), |
| Caps('video/x-raw', width=inference_size.width, height=inference_size.height), |
| Filter('appsink', name='appsink', emit_signals=True, max_buffers=1, drop=True, sync=False) |
| ))) |
| ) |
| |
| def video_display_pipeline(filename, render_size, inference_size, fullscreen): |
| return ( |
| video_file(filename), |
| Filter('glupload'), |
| Tee(pads=(( |
| Queue(max_size_buffers=1), |
| Filter('glfilterbin', filter='glcolorscale'), |
| Filter('rsvgoverlay', name='overlay'), |
| Caps('video/x-raw', width=render_size.width, height=render_size.height), |
| display_sink(fullscreen), |
| ),( |
| Queue(max_size_buffers=1, leaky='downstream'), |
| inference_pipeline(render_size, inference_size), |
| ))) |
| ) |
| |
| def camera_display_pipeline(fmt, render_size, inference_size, fullscreen): |
| return ( |
| v4l2_camera(fmt), |
| Filter('glupload'), |
| Tee(pads=(( |
| Queue(max_size_buffers=1, leaky='downstream'), |
| Filter('glfilterbin', filter='glcolorscale'), |
| Filter('rsvgoverlay', name='overlay'), |
| display_sink(fullscreen), |
| ),( |
| Queue(max_size_buffers=1, leaky='downstream'), |
| inference_pipeline(render_size, inference_size), |
| ))) |
| ) |
| |
| # Headless |
| def image_headless_pipeline(filename, render_size, inference_size): |
| return ( |
| image_file(filename), |
| Filter('imagefreeze'), |
| Filter('glupload'), |
| inference_pipeline(render_size, inference_size), |
| ) |
| |
| def video_headless_pipeline(filename, render_size, inference_size): |
| return ( |
| video_file(filename), |
| Filter('glupload'), |
| inference_pipeline(render_size, inference_size), |
| ) |
| |
| def camera_headless_pipeline(fmt, render_size, inference_size): |
| return ( |
| v4l2_camera(fmt), |
| Filter('glupload'), |
| inference_pipeline(render_size, inference_size), |
| ) |
| |
| # Streaming |
| def video_streaming_pipeline(filename, render_size, inference_size): |
| return ( |
| Filter('filesrc', location=filename), |
| Filter('qtdemux'), |
| Tee(pads=(( |
| Queue(max_size_buffers=1), |
| Filter('h264parse'), |
| Caps('video/x-h264', stream_format='byte-stream', alignment='nal'), |
| h264_sink() |
| ), ( |
| Queue(max_size_buffers=1), |
| Filter('h264parse'), |
| Filter('vpudec'), |
| inference_pipeline(render_size, inference_size), |
| ))) |
| ) |
| |
| def camera_streaming_pipeline(fmt, profile, bitrate, render_size, inference_size): |
| size = max_inner_size(render_size, inference_size) |
| return ( |
| v4l2_camera(fmt), |
| Tee(pads=(( |
| Queue(max_size_buffers=1, leaky='downstream'), |
| Filter('videoconvert'), |
| Filter('x264enc', |
| speed_preset='ultrafast', |
| tune='zerolatency', |
| threads=4, |
| key_int_max=5, |
| bitrate=int(bitrate / 1000), # kbit per second. |
| aud=False), |
| Caps('video/x-h264', profile=profile), |
| Filter('h264parse'), |
| Caps('video/x-h264', stream_format='byte-stream', alignment='nal'), |
| h264_sink() |
| ), ( |
| Queue(), |
| inference_pipeline(render_size, inference_size) |
| ))) |
| ) |