blob: fb06a4a743112806905c2f7ce1038e13f5bcba62 [file] [log] [blame]
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)
)))
)