aboutsummaryrefslogtreecommitdiff
path: root/.local/share/bin/ccpreview
blob: 914a6ad1caa54132ef5128faed1308fc0a5c52ed (plain)
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
#!/bin/sh

# capture card sysfs device path
SYSFS_PATH="/devices/pci0000:00/0000:00:14.0/usb1/1-12"

# script args
WIDTH="$1"
HEIGHT="$2"
FRAMERATE="$3"

# find audio device (pulseaudio)
PULSE_DEVICE="$(pactl -f json list sources | jq \
	--arg sysfs_path "$SYSFS_PATH" --raw-output \
	'.[] | select(.properties["sysfs.path"] | . != null and startswith($sysfs_path)) | .name')"
AUDIO_URL="av://pulse:$PULSE_DEVICE"

# find video device (video4linux)
V4L_PATH="$(find "/sys$SYSFS_PATH" -name 'video4linux' | head -n1)"
V4L_PATH="$(find "$V4L_PATH" -name 'index' | xargs grep -l '^0$')"
V4L_PATH="$(echo "$V4L_PATH" | sed 's#/index$#/uevent#')"
VIDEO_DEVICE="$(. "$V4L_PATH" ; echo "/dev/$DEVNAME")"
VIDEO_DEVICE="$(readlink -f "$VIDEO_DEVICE")"
VIDEO_URL="av://v4l2:$VIDEO_DEVICE"

RESOLUTION="${WIDTH}x${HEIGHT}"

fork() {
	JOBS="$JOBS $(
		"$@" > /dev/null 2> /dev/null &
		echo $!
	)"
}

# set capture card v4l parameters
v4l2-ctl --silent --device "$VIDEO_DEVICE" \
	--set-parm "$FRAMERATE" \
	--set-fmt-video "width=$WIDTH,height=$HEIGHT,pixelformat=MJPG" \
	--set-ctrl "brightness=0,contrast=128,saturation=128,hue=0"

_mpv() {
	fork mpv \
		--quiet --msg-level=input=no \
		--no-config --input-conf=/dev/null \
		--no-osc --no-border \
		--no-input-default-bindings --pause=no --force-seekable=no \
		--cache=no \
		"$@"
}

# audio preview
_mpv \
	--no-demuxer-thread \
	--audio-buffer=0 \
	--cache-pause=no \
	--interpolation=no \
	--stream-buffer-size=4k \
	--profile=low-latency \
	"$AUDIO_URL"

# video preview
_mpv \
	--untimed --no-correct-pts --no-demuxer-thread \
	--profile=low-latency \
	--demuxer-lavf-o-add=input_format=mjpeg \
	--demuxer-lavf-o-add=framerate="$FRAMERATE" \
	--demuxer-lavf-o-add=resolution="$RESOLUTION" \
	--demuxer-lavf-o-add=rw_timeout=30000000 \
	"$VIDEO_URL"

sleep infinity
kill -9 -- $JOBS