This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

add video-webcam tool and fix android-webcam lsmod check

video-webcam: stream video/gif files to v4l2loopback with proper
aspect ratio handling (letterboxing instead of cropping)

android-webcam: remove lsmod check that failed in nix wrapper,
use device file checks instead

+97 -12
+2 -11
tools/android-webcam/android-webcam.sh
··· 1 - #!/usr/bin/env bash 2 - 3 1 SHADER_PATH="@shaderPath@" 4 2 ASCII_MODE=false 5 3 ··· 17 15 esac 18 16 done 19 17 20 - # Check if v4l2loopback module is loaded 21 - if ! lsmod | grep -q v4l2loopback; then 22 - echo "Error: v4l2loopback kernel module is not loaded" >&2 23 - echo "Make sure you have rebooted after enabling the android-webcam module" >&2 24 - exit 1 25 - fi 26 - 27 18 if $ASCII_MODE; then 28 19 # ASCII mode needs both devices 29 20 if [[ ! -e /dev/video0 ]] || [[ ! -e /dev/video1 ]]; then ··· 40 31 41 32 cleanup() { 42 33 echo "Stopping..." 43 - kill $SCRCPY_PID 2>/dev/null || true 44 - [[ -n "${FFMPEG_PID:-}" ]] && kill $FFMPEG_PID 2>/dev/null || true 34 + kill "${SCRCPY_PID}" 2>/dev/null || true 35 + [[ -n "${FFMPEG_PID:-}" ]] && kill "${FFMPEG_PID}" 2>/dev/null || true 45 36 } 46 37 trap cleanup EXIT 47 38
-1
tools/android-webcam/flake-module.nix
··· 11 11 runtimeInputs = [ 12 12 pkgs.scrcpy 13 13 ffmpeg-placebo 14 - pkgs.kmod 15 14 ]; 16 15 text = builtins.replaceStrings 17 16 [ "@shaderPath@" ]
+14
tools/video-webcam/flake-module.nix
··· 1 + { ... }: 2 + { 3 + perSystem = 4 + { pkgs, ... }: 5 + { 6 + packages.video-webcam = pkgs.writeShellApplication { 7 + name = "video-webcam"; 8 + runtimeInputs = [ 9 + pkgs.ffmpeg 10 + ]; 11 + text = builtins.readFile ./video-webcam.sh; 12 + }; 13 + }; 14 + }
+81
tools/video-webcam/video-webcam.sh
··· 1 + DEVICE="/dev/video0" 2 + LOOP=true 3 + 4 + usage() { 5 + echo "Usage: video-webcam [OPTIONS] <video-file>" 6 + echo "" 7 + echo "Stream a video file to a virtual webcam device." 8 + echo "" 9 + echo "Options:" 10 + echo " -d, --device DEVICE v4l2 device to use (default: /dev/video0)" 11 + echo " --no-loop Don't loop the video" 12 + echo " -h, --help Show this help" 13 + echo "" 14 + echo "Examples:" 15 + echo " video-webcam funny.gif" 16 + echo " video-webcam -d /dev/video1 background.mp4" 17 + echo " video-webcam --no-loop intro.webm" 18 + } 19 + 20 + while [[ $# -gt 0 ]]; do 21 + case $1 in 22 + -d|--device) 23 + DEVICE="$2" 24 + shift 2 25 + ;; 26 + --no-loop) 27 + LOOP=false 28 + shift 29 + ;; 30 + -h|--help) 31 + usage 32 + exit 0 33 + ;; 34 + -*) 35 + echo "Unknown option: $1" >&2 36 + usage >&2 37 + exit 1 38 + ;; 39 + *) 40 + VIDEO_FILE="$1" 41 + shift 42 + ;; 43 + esac 44 + done 45 + 46 + if [[ -z "${VIDEO_FILE:-}" ]]; then 47 + echo "Error: No video file specified" >&2 48 + usage >&2 49 + exit 1 50 + fi 51 + 52 + if [[ ! -f "$VIDEO_FILE" ]]; then 53 + echo "Error: File not found: $VIDEO_FILE" >&2 54 + exit 1 55 + fi 56 + 57 + if [[ ! -e "$DEVICE" ]]; then 58 + echo "Error: Device $DEVICE does not exist" >&2 59 + echo "Make sure v4l2loopback kernel module is loaded" >&2 60 + exit 1 61 + fi 62 + 63 + echo "Streaming '$VIDEO_FILE' to $DEVICE" 64 + if $LOOP; then 65 + echo "Looping enabled (Ctrl+C to stop)" 66 + fi 67 + echo "" 68 + 69 + LOOP_ARG="" 70 + if $LOOP; then 71 + LOOP_ARG="-stream_loop -1" 72 + fi 73 + 74 + # shellcheck disable=SC2086 75 + exec ffmpeg \ 76 + $LOOP_ARG \ 77 + -re \ 78 + -i "$VIDEO_FILE" \ 79 + -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,format=yuv420p" \ 80 + -f v4l2 \ 81 + "$DEVICE"