#!/system/bin/sh CONFIG_FILE="/data/local/tmp/virtualcam_config.json" MODDIR=$(dirname "$0") LIB_DST="/data/local/tmp/virtualcam_libs" FFMPEG_BIN="/data/local/tmp/ffmpeg" load_config() { [ -f "$CONFIG_FILE" ] || return SOURCE_TYPE=$(grep -o '"source_type":"[^"]*"' "$CONFIG_FILE" 2>/dev/null | cut -d'"' -f4) RTSP_URL=$(grep -o '"rtsp_url":"[^"]*"' "$CONFIG_FILE" 2>/dev/null | cut -d'"' -f4) MP4_PATH=$(grep -o '"mp4_path":"[^"]*"' "$CONFIG_FILE" 2>/dev/null | cut -d'"' -f4) RES_W=$(grep -o '"res_w":[0-9]*' "$CONFIG_FILE" 2>/dev/null | cut -d: -f2) RES_H=$(grep -o '"res_h":[0-9]*' "$CONFIG_FILE" 2>/dev/null | cut -d: -f2) FPS=$(grep -o '"fps":[0-9]*' "$CONFIG_FILE" 2>/dev/null | cut -d: -f2) : ${SOURCE_TYPE:=mp4} ${RTSP_URL:=rtsp://192.168.1.100:8554/stream} : ${MP4_PATH:=/sdcard/Movies/2.mp4} ${RES_W:=1920} ${RES_H:=1080} ${FPS:=30} } case "${1:-help}" in status) PROVIDER_PID=$(pgrep -f "virtual_camera_provider$" | head -1) FEEDER_PID=$(pgrep -f "ffmpeg.*video0" | head -1) V4L2=$(lsmod 2>/dev/null | grep -q v4l2loopback && echo 1 || echo 0) SVC=$(service list 2>/dev/null | grep -q "virtual/0" && echo 1 || echo 0) VIDEO=$(cat /sys/class/video4linux/video0/name 2>/dev/null || echo "not found") echo "{\"provider_pid\":${PROVIDER_PID:-0},\"feeder_pid\":${FEEDER_PID:-0},\"v4l2_loaded\":$V4L2,\"service_registered\":$SVC,\"video0\":\"$VIDEO\"}" ;; start) rmmod v4l2loopback 2>/dev/null; sleep 1 insmod "$MODDIR/v4l2loopback.ko" devices=1 video_nr=0 card_label="VirtualCam" 2>/dev/null || true pkill -9 -f "virtual_camera_provider$" 2>/dev/null || true mkdir -p "$LIB_DST" 2>/dev/null cp "$MODDIR/vendor/lib64"/*.so "$LIB_DST/" 2>/dev/null nohup env LD_LIBRARY_PATH="$LIB_DST" "$MODDIR/vendor/bin/virtual_camera_provider" \ -d /dev/video0 -w 1920 -h 1080 -i virtual > /dev/null 2>&1 & echo '{"status":"started"}' ;; stop) pkill -9 -f "virtual_camera_provider$" 2>/dev/null || true pkill -9 cameraserver 2>/dev/null || true echo '{"status":"stopped"}' ;; restart) pkill -9 -f "virtual_camera_provider$" 2>/dev/null || true pkill -9 cameraserver 2>/dev/null || true sleep 2 mkdir -p "$LIB_DST" 2>/dev/null cp "$MODDIR/vendor/lib64"/*.so "$LIB_DST/" 2>/dev/null nohup env LD_LIBRARY_PATH="$LIB_DST" "$MODDIR/vendor/bin/virtual_camera_provider" \ -d /dev/video0 -w 1920 -h 1080 -i virtual > /dev/null 2>&1 & echo '{"status":"restarted"}' ;; start_feeder) load_config pkill -9 -f "ffmpeg.*video0" 2>/dev/null || true if command -v "$FFMPEG_BIN" >/dev/null 2>&1; then FF="$FFMPEG_BIN" elif command -v ffmpeg >/dev/null 2>&1; then FF="ffmpeg" else echo '{"status":"error","message":"ffmpeg not found"}' exit 1 fi if [ "$SOURCE_TYPE" = "rtsp" ]; then nohup "$FF" -rtsp_transport tcp -i "$RTSP_URL" \ -f v4l2 -pix_fmt yuv420p /dev/video0 > /dev/null 2>&1 & elif [ "$SOURCE_TYPE" = "mp4" ] && [ -f "$MP4_PATH" ]; then nohup "$FF" -stream_loop -1 -re -i "$MP4_PATH" \ -f v4l2 -pix_fmt yuv420p /dev/video0 > /dev/null 2>&1 & fi echo '{"status":"feeder_started"}' ;; stop_feeder) pkill -9 -f "ffmpeg.*video0" 2>/dev/null || true echo '{"status":"feeder_stopped"}' ;; get_config) load_config echo "{\"source_type\":\"$SOURCE_TYPE\",\"rtsp_url\":\"$RTSP_URL\",\"mp4_path\":\"$MP4_PATH\",\"res_w\":${RES_W:-1920},\"res_h\":${RES_H:-1080},\"fps\":${FPS:-30}}" ;; *) echo "Usage: $0 {status|start|stop|restart|start_feeder|stop_feeder|get_config}" ;; esac