162 lines
5.9 KiB
Bash
Executable File
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"
|