Files
2024-07-11 14:16:35 +02:00

162 lines
5.9 KiB
Bash
Executable File

#!/bin/sh
function print_debug() {
echo "[exec]: $@"
}
function pty_exec() {
cmd=$1
pty=$(tty > /dev/null 2>&1; echo $?)
if [ $pty -eq 0 ]; then
cmd=$(echo $cmd | sed "s#\"#'#g")
event_cmd=$(echo /usr/local/demo/bin/touch-event-gtk-player -w $SCREEN_WIDTH -h $SCREEN_HEIGHT --graph \"$cmd\")
eval $event_cmd > /dev/null 2>&1
else
# no pty
echo "NO PTY"
event_cmd=$(echo /usr/local/demo/bin/touch-event-gtk-player -w $SCREEN_WIDTH -h $SCREEN_HEIGHT --graph \'$cmd\')
script -qc "$event_cmd" > /dev/null 2>&1
fi
}
is_dcmipp_present() {
DCMIPP_SENSOR="NOTFOUND"
# on disco board ov5640 camera can be present on csi connector
for video in $(find /sys/class/video4linux -name "video*" -type l);
do
if [ "$(cat $video/name)" = "dcmipp_dump_capture" ]; then
cd $video/device/
mediadev=/dev/$(ls -d media*)
cd -
for sub in $(find /sys/class/video4linux -name "v4l-subdev*" -type l);
do
subdev_name=$(tr -d '\0' < $sub/name | awk '{print $1}')
if [ "$subdev_name" = "gc2145" ] || [ "$subdev_name" = "ov5640" ]; then
DCMIPP_SENSOR=$subdev_name
V4L_DEVICE="device=/dev/$(basename $video)"
sensorsubdev=$(tr -d '\0' < $sub/name)
#bridge is connected to output of sensor (":0 [ENABLED" with media-ctl -p)
bridgesubdev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep ":0 \[ENABLED" | awk -F\" '{print $2}')
#interface is connected to input of postproc (":1 [ENABLED" with media-ctl -p)
interfacesubdev=$(media-ctl -d $mediadev -p -e "dcmipp_dump_postproc" | grep ":1 \[ENABLED" | awk -F\" '{print $2}')
if [ "$subdev_name" = "gc2145" ]; then
sensorbuscode_constrain="BE"
parallelbuscode="RGB565_2X8_BE"
else
sensorbuscode_constrain="LE"
parallelbuscode="RGB565_2X8_LE"
fi
echo "media device: "$mediadev
echo "video device: "$V4L_DEVICE
echo "sensor subdev: " $sensorsubdev
echo "bridge subdev: " $bridgesubdev
echo "interface subdev: " $interfacesubdev
return
fi
done
fi
done
}
is_dcmi_present() {
DCMI_SENSOR="NOTFOUND"
# on disco board ov5640 camera can be present on // connector
for video in $(find /sys/class/video4linux -name "video*" -type l);
do
if [ "$(cat $video/name)" = "stm32_dcmi" ]; then
V4L_DEVICE="device=/dev/$(basename $video)"
DCMI_SENSOR="$(basename $video)"
echo "video DCMI device: "$V4L_DEVICE
return
fi
done
}
get_webcam_device() {
found="NOTFOUND"
for video in $(find /sys/class/video4linux -name "video*" -type l | sort);
do
if [ "$(cat $video/name)" = "dcmipp_dump_capture" ]; then
found="FOUND"
else
V4L_DEVICE="device=/dev/$(basename $video)"
break;
fi
done
}
# ------------------------------
# main
# ------------------------------
# graphic brackend detection
if [ -f /etc/default/weston ] && $(grep "^OPTARGS" /etc/default/weston | grep -q "use-pixman" ) ;
then
echo "Without GPU"
ADDONS="videoconvert ! queue !"
else
echo "With GPU"
ADDONS=""
fi
# Detect size of screen
SCREEN_WIDTH=$(wayland-info | grep logical_width | sed -r "s/logical_width: ([0-9]+),.*/\1/")
SCREEN_HEIGHT=$(wayland-info | grep logical_width | sed -r "s/.*logical_height: ([0-9]+).*/\1/")
# camera detection
is_dcmipp_present
if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then
WIDTH=640
HEIGHT=480
FPS=30
sensordev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep "node name" | awk -F\name '{print $2}')
sensorbuscode=`v4l2-ctl --list-subdev-mbus-codes -d $sensordev | grep RGB565 | grep "$sensorbuscode_constrain" | awk -FMEDIA_BUS_FMT_ '{print $2}'| head -n 1`
echo "sensor mbus-code: "$sensorbuscode
print_debug media-ctl -d $mediadev --set-v4l2 "'$sensorsubdev':0[fmt:$sensorbuscode/${WIDTH}x${HEIGHT}@1/${FPS} field:none]"
media-ctl -d $mediadev --set-v4l2 "'$sensorsubdev':0[fmt:$sensorbuscode/${WIDTH}x${HEIGHT}@1/${FPS} field:none]"
print_debug media-ctl -d $mediadev --set-v4l2 "'$bridgesubdev':2[fmt:$sensorbuscode/${WIDTH}x${HEIGHT}]"
media-ctl -d $mediadev --set-v4l2 "'$bridgesubdev':2[fmt:$sensorbuscode/${WIDTH}x${HEIGHT}]"
print_debug media-ctl -d $mediadev --set-v4l2 "'$interfacesubdev':1[fmt:$parallelbuscode/${WIDTH}x${HEIGHT}]"
media-ctl -d $mediadev --set-v4l2 "'$interfacesubdev':1[fmt:$parallelbuscode/${WIDTH}x${HEIGHT}]"
print_debug media-ctl -d $mediadev --set-v4l2 "'dcmipp_dump_postproc':1[fmt:$parallelbuscode/${WIDTH}x${HEIGHT}]"
media-ctl -d $mediadev --set-v4l2 "'dcmipp_dump_postproc':1[fmt:$parallelbuscode/${WIDTH}x${HEIGHT}]"
V4L2_CAPS="video/x-raw, format=RGB16, width=$WIDTH, height=$HEIGHT"
V4L_OPT=""
else
is_dcmi_present
if [ "$DCMI_SENSOR" != "NOTFOUND" ]; then
COMPATIBLE_BOARD=$(cat /proc/device-tree/compatible | sed "s|st,|,|g" | cut -d ',' -f2)
case $COMPATIBLE_BOARD in
stm32mp15*)
WIDTH=640
HEIGHT=480
;;
*)
WIDTH=640
HEIGHT=480
;;
esac
else
get_webcam_device
# suppose we have a webcam
WIDTH=640
HEIGHT=480
fi
V4L2_CAPS="video/x-raw, width=$WIDTH, height=$HEIGHT"
V4L_OPT="io-mode=4"
v4l2-ctl --set-parm=30
fi
echo "Gstreamer graph:"
GRAPH="v4l2src $V4L_DEVICE $V4L_OPT ! $V4L2_CAPS ! queue ! $ADDONS gtkwaylandsink name=gtkwsink"
echo " $GRAPH"
pty_exec "$GRAPH"