-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathv4l2loopbackInit
More file actions
executable file
·112 lines (90 loc) · 3.32 KB
/
v4l2loopbackInit
File metadata and controls
executable file
·112 lines (90 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#! /bin/bash
# Install v4l2loopback module if not loaded. Defaults to creating /dev/videoX
# and /dev/videoX+1 loopback devices, where X is the next available video
# number. To specify different video numbers, set VID1 and VID2 environment
# variables before running the script.
type -p pd || pd () {
${DEBUG:-false} && echo -ne "[$progn-${BASH_LINENO[0]}] $*\n" >&2 ; true
}
runfile=/tmp/v4l2loopback.run
# modCheck checks if the v4l2loopback module is loaded. Sets VID1, VID2, and modOptions.
modCheck () {
if lsmod | grep -q v4l2loopback ; then
echo "v4l2loopback module is already loaded." >&2
pushd /sys/devices/virtual/video4linux/ &> /dev/null
vids=( video* )
export VID1=${vids[0]#video}
export VID2=${vids[1]#video}
export modOptions=(video_nr=$VID1,$VID2 card_label='loopback1','loopback2')
echo "Using existing loopback devices: /dev/video$VID1 and /dev/video$VID2" >&2
echo -en "VID1=$VID1\nVID2=$VID2\n" > "$runfile"
popd &> /dev/null
return 0
else
echo "v4l2loopback module is not loaded." >&2
${DEBUG:-false} && modinfo -n v4l2loopback
# Get the next available video number for loopback devices
export VID1=${VID1:-$( vids=( /dev/video* ) ; echo $(( ${vids[-1]#/dev/video} +1 )) )}
export VID2=${VID2:-$(( VID1 + 1 ))}
export modOptions=(video_nr=$VID1,$VID2 card_label='loopback1','loopback2')
pd "Next available video numbers for loopback devices: $VID1 and $VID2"
[ -f "$runfile" ] && rm -f "$runfile"
return 1
fi
}
# Load the v4l2loopback module.
modLoad () {
modCheck && return 0
echo "Attempting to load v4l2loopback module with sudo privileges..." >&2
if sudo modprobe v4l2loopback "${modOptions[@]}" ; then
pd "v4l2loopback module loaded successfully."
modCheck
return 0
else
pd "Failed to load v4l2loopback module."
return 1
fi
}
# Remove the v4l2loopback module.
modDelete () {
if modCheck ; then
echo "Attempting to remove v4l2loopback module with sudo privileges..." >&2
if sudo modprobe -r v4l2loopback ; then
echo "v4l2loopback module removed successfully." >&2
modCheck
return 0
else
echo "Failed to remove v4l2loopback module." >&2
return 1
fi
else
pd "v4l2loopback module is not loaded, nothing to remove."
return 0
fi
}
main () {
progn=${0##*/} # basename
usage () {
cat <<_EOL_
Usage: $progn <remove>
Load the v4l2loopback module to create split video devices.
Run this script with the 'remove' argument to unload the
module.
This script set VID1 and VID2 to the next available video numbers for loopback
devices. If the module is already loaded, it will use the existing loopback
devices and set VID1 and VID2 accordingly. State information is saved to $runfile.
_EOL_
exit 1
}
case "$1" in
remove) modDelete ; exit $? ;;
-h|--help) usage ;;
*) ;;
esac
modLoad || {
echo "Error: Unable to load v4l2loopback module. Exiting." >&2
exit 1
}
pd "To remove the v4l2loopback module, run this script with the 'remove' argument: $0 remove"
}
return &> /dev/null || main "$@" # Run main() if called as a script