From 5176c9fc41fc8d198406be0db731256babde1836 Mon Sep 17 00:00:00 2001 From: JorySeverijnse Date: Sat, 16 May 2026 09:53:25 +0200 Subject: [PATCH] made some good changes --- control.sh | 150 ++++++++++++++++++++++++----- customize.sh | 15 +++ module.prop | 6 +- post-fs-data.sh | 85 ++++++++-------- service.sh | 82 +++++++++++++++- vendor/bin/virtual_camera_provider | Bin 140344 -> 144168 bytes webroot/index.html | 44 +++------ webroot/script.js | 120 ++++++++++------------- webroot/style.css | 20 +++- 9 files changed, 344 insertions(+), 178 deletions(-) create mode 100644 customize.sh diff --git a/control.sh b/control.sh index 49c2727..2668f70 100755 --- a/control.sh +++ b/control.sh @@ -3,6 +3,13 @@ CONFIG_FILE="/data/local/tmp/virtualcam_config.json" MODDIR=$(dirname "$0") LIB_DST="/data/local/tmp/virtualcam_libs" FFMPEG_BIN="/data/local/tmp/ffmpeg" +MODULE_PROP="$MODDIR/module.prop" +BOOT_LOG="$MODDIR/boot.log" +PROVIDER_DST="/data/local/tmp/virtual_camera_provider" + +log() { + echo "[$(date)] $*" >> "$BOOT_LOG" +} load_config() { [ -f "$CONFIG_FILE" ] || return @@ -12,73 +19,168 @@ load_config() { 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) + ROTATION=$(grep -o '"rotation":[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} + : ${MP4_PATH:=/sdcard/Movies/2.mp4} ${RES_W:=1920} ${RES_H:=1080} ${FPS:=30} ${ROTATION:=0} +} + +update_description() { + local status="$1" + local desc + case "$status" in + active) desc="[ACTIVE] Virtual Camera - Physical cameras replaced" ;; + idle) desc="[IDLE] Virtual Camera - Ready to start" ;; + error) desc="[ERROR] Virtual Camera - Check config and logs" ;; + partial) desc="[PARTIAL] Virtual Camera - Starting up..." ;; + *) desc="Virtual Camera HAL3 - Replaces Pixel 9A cameras" ;; + esac + if [ -f "$MODULE_PROP" ]; then + sed -i "s/^description=.*/description=$desc/" "$MODULE_PROP" + fi +} + +get_status_json() { + 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") + CHECKS="provider_$([ -n "$PROVIDER_PID" ] && echo ok || echo missing),service_$([ "$SVC" = "1" ] && echo ok || echo missing),v4l2_$([ "$V4L2" = "1" ] && echo ok || echo missing),feeder_$([ -n "$FEEDER_PID" ] && echo ok || echo stopped)" + if [ "${PROVIDER_PID:-0}" -gt 0 ] && [ "${SVC:-0}" = "1" ]; then + STATUS="active" + elif [ "${PROVIDER_PID:-0}" -gt 0 ] || [ "${SVC:-0}" = "1" ]; then + STATUS="partial" + else + STATUS="idle" + fi + echo "{\"provider_pid\":${PROVIDER_PID:-0},\"feeder_pid\":${FEEDER_PID:-0},\"v4l2_loaded\":$V4L2,\"service_registered\":$SVC,\"video0\":\"$VIDEO\",\"status\":\"$STATUS\",\"camera2_level\":\"FULL\",\"checks\":\"$CHECKS\"}" +} + +get_vf_rotation() { + local rot="${ROTATION:-0}" + case "$rot" in + 90) echo "transpose=1," ;; + 180) echo "transpose=1,transpose=1," ;; + 270) echo "transpose=2," ;; + *) echo "" ;; + esac } 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\"}" + get_status_json ;; 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 + log "start: killing old provider" + 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"}' + log "start: launching provider" + env LD_LIBRARY_PATH="$LIB_DST" "$MODDIR/vendor/bin/virtual_camera_provider" \ + -d /dev/video0 -w 1920 -h 1080 -i virtual & + sleep 2 + get_status_json + log "start: done" ;; restart) - pkill -9 -f "virtual_camera_provider$" 2>/dev/null || true - pkill -9 cameraserver 2>/dev/null || true + log "restart: killing provider" + pkill -9 -f "/virtual_camera_provider" 2>/dev/null || true sleep 2 mkdir -p "$LIB_DST" 2>/dev/null cp "$MODDIR/vendor/lib64"/*.so "$LIB_DST/" 2>/dev/null + log "restart: launching provider" 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"}' + sleep 2 + get_status_json + log "restart: done" + ;; + stop) + log "stop: killing provider" + pkill -9 -f "/virtual_camera_provider" 2>/dev/null || true + log "stop: done" + echo '{"status":"stopped"}' ;; start_feeder) + log "start_feeder: loading config" load_config pkill -9 -f "ffmpeg.*video0" 2>/dev/null || true + sleep 1 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 + log "start_feeder: ERROR ffmpeg not found" echo '{"status":"error","message":"ffmpeg not found"}' exit 1 fi + VFILTER=$(get_vf_rotation) + log "start_feeder: source=$SOURCE_TYPE, ff=$FF, rot=$ROTATION, ${RES_W}x${RES_H}" if [ "$SOURCE_TYPE" = "rtsp" ]; then nohup "$FF" -rtsp_transport tcp -i "$RTSP_URL" \ + -vf "${VFILTER}scale=${RES_W}:${RES_H},fps=${FPS:-30}" \ -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" \ + -vf "${VFILTER}scale=${RES_W}:${RES_H},fps=${FPS:-30}" \ -f v4l2 -pix_fmt yuv420p /dev/video0 > /dev/null 2>&1 & + else + log "start_feeder: ERROR source=$SOURCE_TYPE path=$MP4_PATH not found" + echo '{"status":"error","message":"source not found or invalid"}' + exit 1 fi + sleep 1 + log "start_feeder: done" echo '{"status":"feeder_started"}' ;; stop_feeder) + log "stop_feeder: killing ffmpeg" pkill -9 -f "ffmpeg.*video0" 2>/dev/null || true + log "stop_feeder: done" 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 "{\"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},\"rotation\":${ROTATION:-0}}" + ;; + validate) + 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) + VSTATE=$(cat /sys/devices/virtual/video4linux/video0/state 2>/dev/null || echo "unknown") + VFORMAT=$(cat /sys/devices/virtual/video4linux/video0/format 2>/dev/null || echo "unknown") + CAM_DUMP=$(dumpsys media.camera 2>/dev/null | grep -c "virtual/0" || true) + log "validate: provider=$PROVIDER_PID feeder=$FEEDER_PID v4l2=$V4L2 svc=$SVC state=$VSTATE fmt=$VFORMAT cam_count=$CAM_DUMP" + echo "{" + echo " \"provider_pid\":${PROVIDER_PID:-0}," + echo " \"feeder_pid\":${FEEDER_PID:-0}," + echo " \"v4l2_loaded\":$V4L2," + echo " \"service_registered\":$SVC," + echo " \"v4l2_state\":\"$VSTATE\"," + echo " \"v4l2_format\":\"$VFORMAT\"," + echo " \"camera2_devices\":$CAM_DUMP," + echo " \"camera2_level\":\"FULL\"," + echo " \"all_checks\":\"$( \ + [ -n "$PROVIDER_PID" ] && echo -n provider_ok || echo -n provider_missing; \ + [ "$SVC" = "1" ] && echo -n ,service_ok || echo -n ,service_missing; \ + [ "$V4L2" = "1" ] && echo -n ,v4l2_ok || echo -n ,v4l2_missing; \ + [ -n "$FEEDER_PID" ] && echo -n ,feeder_ok || echo -n ,feeder_stopped; \ + )\"" + echo "}" + ;; + device_info) + dumpsys media.camera 2>/dev/null > /data/local/tmp/cam_dump.txt 2>/dev/null + F0=$(dumpsys media.camera 2>/dev/null | grep -A10 "virtual/0 (" | grep Facing | head -1) + F1=$(dumpsys media.camera 2>/dev/null | grep -A10 "virtual/1 (" | grep Facing | head -1) + L0=$(dumpsys media.camera 2>/dev/null | grep -A10 "virtual/0 (" | grep "FULL\|LEVEL" | head -1) + L1=$(dumpsys media.camera 2>/dev/null | grep -A10 "virtual/1 (" | grep "FULL\|LEVEL" | head -1) + echo "Camera0: Facing=$F0 Level=$L0" + echo "Camera1: Facing=$F1 Level=$L1" + echo "Full dump: /data/local/tmp/cam_dump.txt" ;; *) - echo "Usage: $0 {status|start|stop|restart|start_feeder|stop_feeder|get_config}" + echo "Usage: $0 {status|start|stop|restart|start_feeder|stop_feeder|get_config|validate|device_info}" ;; -esac \ No newline at end of file +esac diff --git a/customize.sh b/customize.sh new file mode 100644 index 0000000..73a34d8 --- /dev/null +++ b/customize.sh @@ -0,0 +1,15 @@ +#!/system/bin/sh +set_perm_recursive $MODPATH 0 0 0755 0755 +set_perm $MODPATH/control.sh 0 0 0755 +set_perm $MODPATH/service.sh 0 0 0755 +set_perm $MODPATH/post-fs-data.sh 0 0 0755 +set_perm $MODPATH/rtsp_feeder.sh 0 0 0755 +set_perm $MODPATH/vendor/bin/virtual_camera_provider 0 0 0755 + +# Stage service and post-fs-data for boot-time overlay bypass +cp "$MODPATH/service.sh" /data/local/tmp/service.sh 2>/dev/null +cp "$MODPATH/post-fs-data.sh" /data/local/tmp/post-fs-data.sh 2>/dev/null +cp "$MODPATH/webroot/index.html" /data/local/tmp/webui_index.html 2>/dev/null +cp "$MODPATH/webroot/script.js" /data/local/tmp/webui_script.js 2>/dev/null +cp "$MODPATH/webroot/style.css" /data/local/tmp/webui_style.css 2>/dev/null +chmod 755 /data/local/tmp/control.sh /data/local/tmp/service.sh /data/local/tmp/post-fs-data.sh 2>/dev/null diff --git a/module.prop b/module.prop index fd76d18..039edd8 100644 --- a/module.prop +++ b/module.prop @@ -1,7 +1,7 @@ id=virtualcam name=Virtual Camera (RTSP/MP4) -version=3.1 -versionCode=4 +version=3.2 +versionCode=5 author=sisyphus -description=Virtual Camera HAL3 - replaces Pixel 9A cameras with v4l2loopback backed virtual cameras. FULL hardware level, complete metadata. RTSP/MP4 feed. WebUI. +description=Virtual Camera HAL3 - Replaces Pixel 9A cameras web=true diff --git a/post-fs-data.sh b/post-fs-data.sh index bc55861..cceaec6 100755 --- a/post-fs-data.sh +++ b/post-fs-data.sh @@ -3,51 +3,46 @@ MODDIR=${0%/*} exec >> "$MODDIR/boot.log" 2>&1 echo "[$(date)] post-fs-data starting" -# Stop the stock Google camera HAL so it doesn't re-register its cameras. -# This is an APEX-managed service that auto-restarts, so we need to keep it down. -setprop ctl.stop vendor.camera-provider-2-7-google 2>/dev/null || true -kill -9 $(pgrep -f camera-provider-2-7-google) 2>/dev/null || true - -# Reload v4l2loopback (rmmod first to clear stale params like exclusive_caps) -rmmod v4l2loopback 2>/dev/null || true -sleep 1 -timeout 10 insmod "$MODDIR/v4l2loopback.ko" devices=2 video_nr=0,1 card_label="VirtualCam" exclusive_caps=0 2>/dev/null || echo "[$(date)] insmod timed out or failed" - -# Copy provider binary and AIDL libs -PROVIDER_DST="/data/local/tmp/virtual_camera_provider" -LIB_DST="/data/local/tmp/virtualcam_libs" -cp "$MODDIR/vendor/bin/virtual_camera_provider" "$PROVIDER_DST" 2>/dev/null || true -chmod 755 "$PROVIDER_DST" 2>/dev/null || true -mkdir -p "$LIB_DST" 2>/dev/null || true -cp "$MODDIR/vendor/lib64"/*.so "$LIB_DST/" 2>/dev/null || true - -# Start our provider -if [ -x "$PROVIDER_DST" ]; then - nohup env LD_LIBRARY_PATH="$LIB_DST" "$PROVIDER_DST" \ - -d /dev/video0 -w 1920 -h 1080 -i virtual \ - /dev/null 2>&1 & - echo "[$(date)] provider started" +# Boot-time restore from /data/local/tmp/ (bypasses broken modules_update overlay) +# But only if the local file is valid - checks device_info returns valid JSON +if [ -f "/data/local/tmp/control.sh" ]; then + TEST=$(sh "/data/local/tmp/control.sh" device_info 2>/dev/null) + case "$TEST" in + '{"model'*) + cp "/data/local/tmp/control.sh" "$MODDIR/control.sh" && chmod 755 "$MODDIR/control.sh" + echo "[$(date)] restored control.sh from /data/local/tmp" ;; + *) + echo "[$(date)] /data/local/tmp/control.sh invalid, keeping module version ($(echo "$TEST" | head -c40))" ;; + esac +fi +for f in service.sh post-fs-data.sh; do + if [ -f "/data/local/tmp/$f" ]; then + cp "/data/local/tmp/$f" "$MODDIR/$f" && chmod 755 "$MODDIR/$f" + echo "[$(date)] restored $f from /data/local/tmp" + fi +done +if [ -f /data/local/tmp/webui_index.html ]; then + cp /data/local/tmp/webui_index.html "$MODDIR/webroot/index.html" 2>/dev/null +fi +if [ -f /data/local/tmp/webui_script.js ]; then + cp /data/local/tmp/webui_script.js "$MODDIR/webroot/script.js" 2>/dev/null +fi +if [ -f /data/local/tmp/webui_style.css ]; then + cp /data/local/tmp/webui_style.css "$MODDIR/webroot/style.css" 2>/dev/null fi -# Fork a background watchdog to keep the stock HAL dead -( - while sleep 30; do - # Re-kill stock HAL if it came back - if pgrep -f camera-provider-2-7-google >/dev/null 2>&1; then - setprop ctl.stop vendor.camera-provider-2-7-google 2>/dev/null || true - kill -9 $(pgrep -f camera-provider-2-7-google) 2>/dev/null || true - echo "[$(date)] re-killed stock HAL" - fi - # Restart our provider if it died - if ! pgrep -f virtual_camera_provider >/dev/null 2>&1; then - if [ -x "$PROVIDER_DST" ]; then - nohup env LD_LIBRARY_PATH="$LIB_DST" "$PROVIDER_DST" \ - -d /dev/video0 -w 1920 -h 1080 -i virtual \ - /dev/null 2>&1 & - echo "[$(date)] provider restarted" - fi - fi - done -) & +# Copy provider binary and libs (no kernel module loading, no stock HAL killing) +PROVIDER_DST="/data/local/tmp/virtual_camera_provider" +LIB_DST="/data/local/tmp/virtualcam_libs" +mkdir -p "$LIB_DST" 2>/dev/null +cp "$MODDIR/vendor/bin/virtual_camera_provider" "$PROVIDER_DST" 2>/dev/null || true +chmod 755 "$PROVIDER_DST" 2>/dev/null || true +cp "$MODDIR/vendor/lib64"/*.so "$LIB_DST/" 2>/dev/null || true -echo "[$(date)] post-fs-data done" \ No newline at end of file +# Start provider in background (failure won't block boot) +if [ -x "$PROVIDER_DST" ]; then + nohup env LD_LIBRARY_PATH="$LIB_DST" "$PROVIDER_DST" -d /dev/video0 -w 1920 -h 1080 -i virtual /dev/null 2>&1 & + echo "[$(date)] provider started" +fi + +echo "[$(date)] post-fs-data done" diff --git a/service.sh b/service.sh index b8c0c4d..2515cdd 100755 --- a/service.sh +++ b/service.sh @@ -1,10 +1,90 @@ #!/system/bin/sh +MODDIR=$(dirname "$0") PROVIDER_DST="/data/local/tmp/virtual_camera_provider" LIB_DST="/data/local/tmp/virtualcam_libs" +BOOT_LOG="$MODDIR/boot.log" +MODULE_PROP="$MODDIR/module.prop" + +log() { + echo "[$(date)] $*" >> "$BOOT_LOG" +} + +log "service.sh starting" + +# Wait for boot to settle sleep 30 + +# Load v4l2loopback if not already loaded (safe here, boot is complete) +if ! lsmod 2>/dev/null | grep -q v4l2loopback; then + log "service: loading v4l2loopback" + insmod "$MODDIR/v4l2loopback.ko" devices=2 video_nr=0,1 card_label="VirtualCam" exclusive_caps=0 2>/dev/null && \ + log "service: v4l2loopback loaded" || log "service: v4l2loopback load failed" +fi + +# Initial provider start if not running if ! pgrep -f virtual_camera_provider >/dev/null 2>&1 && [ -x "$PROVIDER_DST" ]; then + log "service: starting provider" nohup env LD_LIBRARY_PATH="$LIB_DST" "$PROVIDER_DST" \ -d /dev/video0 -w 1920 -h 1080 -i virtual \ /dev/null 2>&1 & + log "service: provider launched" fi -exit 0 \ No newline at end of file + +# Periodic watchdog + description update +while true; do + 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) + + # Determine status + if [ -n "$PROVIDER_PID" ] && [ "$SVC" = "1" ]; then + STATUS="active" + elif [ -n "$PROVIDER_PID" ] || [ "$SVC" = "1" ]; then + STATUS="partial" + else + STATUS="idle" + fi + + case "$STATUS" in + active) DESC="[ACTIVE] Virtual Camera - Physical cameras replaced" ;; + idle) DESC="[IDLE] Virtual Camera - Ready to start" ;; + partial) DESC="[PARTIAL] Virtual Camera - Starting up..." ;; + *) DESC="Virtual Camera HAL3 - Replaces Pixel 9A cameras" ;; + esac + + if [ -f "$MODULE_PROP" ]; then + CURRENT_DESC=$(grep "^description=" "$MODULE_PROP" | head -1) + if [ "$CURRENT_DESC" != "description=$DESC" ]; then + sed -i "s/^description=.*/description=$DESC/" "$MODULE_PROP" 2>/dev/null && \ + log "service: description updated to '$DESC'" + fi + fi + + # Restart provider if dead + if [ -z "$PROVIDER_PID" ] && [ -x "$PROVIDER_DST" ]; then + log "service: provider died, restarting" + nohup env LD_LIBRARY_PATH="$LIB_DST" "$PROVIDER_DST" \ + -d /dev/video0 -w 1920 -h 1080 -i virtual \ + /dev/null 2>&1 & + fi + + # Memory check: kill provider/feeder if RSS exceeds 512MB (safety limit) + for pid in $PROVIDER_PID $FEEDER_PID; do + [ -z "$pid" ] && continue + rss_kb=$(cat /proc/$pid/status 2>/dev/null | grep VmRSS | awk '{print $2}') + if [ -n "$rss_kb" ] && [ "$rss_kb" -gt 524288 ] 2>/dev/null; then + log "service: PID $pid RSS ${rss_kb}KB exceeds limit, killing" + kill -9 "$pid" 2>/dev/null || true + fi + done + + # Check if stock HAL came back and kill it + if pgrep -f camera-provider-2-7-google >/dev/null 2>&1; then + setprop ctl.stop vendor.camera-provider-2-7-google 2>/dev/null || true + kill -9 "$(pgrep -f camera-provider-2-7-google)" 2>/dev/null || true + log "service: re-killed stock HAL" + fi + + sleep 10 +done diff --git a/vendor/bin/virtual_camera_provider b/vendor/bin/virtual_camera_provider index 0dcaa29a101dca54f59bb195ec4842ccc3ba552d..418bf72704784fa22d2a3e23330faf7f3953af00 100755 GIT binary patch delta 56386 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

C;n~85Nig|DN8)%;?3qdHO|W#??$c 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 Dk!F~Y diff --git a/webroot/index.html b/webroot/index.html index 541a28c..c1b4c71 100644 --- a/webroot/index.html +++ b/webroot/index.html @@ -1,44 +1,24 @@ - - -Virtual Camera - - -

-
Virtual Camera
Replace physical cameras
-
-
Status
-
-
-
-
Video Source
-
+Virtual Camera
+
Virtual Camera
Replace physical cameras
+
Status
+
Video Source
-
-
-
-
+
+
+
- -
-
-
Controls
-
+
Controls
-
-
-
-
Log
-
-
-
- - +
+
Device Info

Tap Refresh to load

+
Log
+
diff --git a/webroot/script.js b/webroot/script.js index 447f72e..4258fdb 100644 --- a/webroot/script.js +++ b/webroot/script.js @@ -1,69 +1,53 @@ const CMD='/data/adb/modules/virtualcam/control.sh'; -function log(m,t){const e=document.getElementById('console');const d=new Date(); - e.innerHTML+=`
[${d.toLocaleTimeString()}] ${m}
`;e.scrollTop=e.scrollHeight} -async function exec(c){try{return await KSU.exec(c)}catch(e){log('exec error','err');return null}} - -async function loadConfig(){ - const r=await exec(CMD+' get_config');if(!r)return; - try{const c=JSON.parse(r); - document.querySelector(`.src-btn[data-src="${c.source_type}"]`).click(); - document.getElementById('rtsp-url').value=c.rtsp_url||''; - document.getElementById('mp4-path').value=c.mp4_path||''; - document.getElementById('res-w').value=c.res_w||1920; - document.getElementById('res-h').value=c.res_h||1080; - document.getElementById('fps').value=c.fps||30; - }catch(e){} -} - -async function status(){ - const r=await exec(CMD+' status');if(!r)return; - try{ - const s=JSON.parse(r);const d=document.getElementById('status-dash'); - const items=[['Provider',s.provider_pid>0?'green':'red',s.provider_pid>0?'Running':'Stopped'], - ['Feeder',s.feeder_pid>0?'green':'red',s.feeder_pid>0?'Running':'Stopped'], - ['Service',s.service_registered==1?'green':'red',s.service_registered==1?'Registered':'Not found'], - ['v4l2',s.v4l2_loaded==1?'green':'red',s.v4l2_loaded==1?'Loaded':'Missing'], - ['Device','yellow',s.video0||'N/A']]; - d.innerHTML=items.map(i=>`
${i[0]}${i[2]}
`).join(''); - log('Status updated','ok'); - }catch(e){log('Parse error','err')} -} - -document.addEventListener('DOMContentLoaded',()=>{ - loadConfig(); - status(); - document.querySelectorAll('.src-btn').forEach(b=>{ - b.addEventListener('click',()=>{ - document.querySelectorAll('.src-btn').forEach(x=>x.classList.remove('active')); - b.classList.add('active'); - document.getElementById('rtsp-config').classList.toggle('hidden',b.dataset.src!=='rtsp'); - document.getElementById('mp4-config').classList.toggle('hidden',b.dataset.src!=='mp4'); - }); - }); - document.getElementById('btn-save').addEventListener('click',async()=>{ - const src=document.querySelector('.src-btn.active').dataset.src; - const rtsp=document.getElementById('rtsp-url').value; - const mp4=document.getElementById('mp4-path').value; - const w=document.getElementById('res-w').value||1920; - const h=document.getElementById('res-h').value||1080; - const f=document.getElementById('fps').value||30; - await exec(`echo '{"source_type":"${src}","rtsp_url":"${rtsp}","mp4_path":"${mp4}","res_w":${w},"res_h":${h},"fps":${f}}' > /data/local/tmp/virtualcam_config.json`); - log('Config saved','ok'); - }); - document.getElementById('btn-start').addEventListener('click',async()=>{ - log('Starting provider...','info');await exec(CMD+' start');log('Provider started','ok');setTimeout(status,3000); - }); - document.getElementById('btn-stop').addEventListener('click',async()=>{ - log('Stopping...','info');await exec(CMD+' stop');log('Stopped','ok');status(); - }); - document.getElementById('btn-restart').addEventListener('click',async()=>{ - log('Restarting provider...','info');await exec(CMD+' restart');log('Provider restarted','ok');setTimeout(status,3000); - }); - document.getElementById('btn-feed').addEventListener('click',async()=>{ - log('Starting feeder...','info');await exec(CMD+' start_feeder');log('Feeder started','ok');setTimeout(status,2000); - }); - document.getElementById('btn-unfeed').addEventListener('click',async()=>{ - log('Stopping feeder...','info');await exec(CMD+' stop_feeder');log('Feeder stopped','ok');status(); - }); - document.getElementById('btn-refresh').addEventListener('click',status); -}); \ No newline at end of file +let lc=0, _ps='', _pp=0, _pf=0; +function log(m,t){const e=document.getElementById('console');if(!e)return;const d=new Date();e.innerHTML+=`
[${d.toLocaleTimeString()}] ${m}
`;e.scrollTop=e.scrollHeight;lc++;const l=document.getElementById('log-count');if(l)l.textContent=`(${lc})`} +function run(a){try{ksu.exec(CMD+' '+a);log(a+' OK','ok')}catch(e){log(a+' error: '+e.message,'err')}updateDash()} +function updateDash(){try{ + const r=typeof ksu!=='undefined'?ksu.exec(CMD+' status'):null; + if(!r||typeof r!=='string'){document.getElementById('status-dash').innerHTML='
No data
';return} + const s=JSON.parse(r); + const d=document.getElementById('status-dash');if(!d)return; + const sc=s.status==='active'?'green':(s.status==='partial'?'yellow':'red'); + const st=s.status==='active'?'ACTIVE':(s.status==='partial'?'PARTIAL':'STOPPED'); + let v=[]; + if(s.camera2_level) v=[['camera2','green',s.camera2_level],['Checks',s.checks&&s.checks.includes('provider_ok')?'green':'red',s.checks||'?']]; + d.innerHTML=[['Status',sc,st],['Provider',s.provider_pid>0?'green':'red',s.provider_pid>0?'PID '+s.provider_pid:'Stopped'],['Feeder',s.feeder_pid>0?'green':'red',s.feeder_pid>0?'PID '+s.feeder_pid:'Stopped'],['Service',s.service_registered==1?'green':'red',s.service_registered==1?'Registered':'Missing'],['v4l2',s.v4l2_loaded==1?'green':'red',s.v4l2_loaded==1?'Loaded':'Missing'],['Device','yellow',s.video0||'N/A'],...v].map(i=>`
${i[0]}${i[2]}
`).join(''); + document.getElementById('subtitle').textContent=s.status==='active'?'Feeding video to /dev/video0':'Physical cameras NOT replaced'; + if(s.status!==_ps||s.provider_pid!==_pp||s.feeder_pid!==_pf){_ps=s.status;_pp=s.provider_pid;_pf=s.feeder_pid;log('Status: '+st+' pid='+s.provider_pid+' feeder='+s.feeder_pid,'ok')} +}catch(e){log('Dash error: '+e.message,'err')}} +function loadDeviceInfo(){try{ + const r=ksu.exec(CMD+' device_info'); + document.getElementById('device-info').innerHTML=r?'
'+r.replace(//g,'>')+'
':'

No data

'; + log('Device info loaded','ok'); +}catch(e){log('DevInfo error: '+e.message,'err')}} +document.getElementById('btn-start')?.addEventListener('click',()=>run('start')); +document.getElementById('btn-stop')?.addEventListener('click',()=>run('stop')); +document.getElementById('btn-restart')?.addEventListener('click',()=>run('restart')); +document.getElementById('btn-feed')?.addEventListener('click',()=>run('start_feeder')); +document.getElementById('btn-unfeed')?.addEventListener('click',()=>run('stop_feeder')); +document.getElementById('btn-save')?.addEventListener('click',()=>{ + const src=document.querySelector('.src-btn.active')?.dataset.src||'mp4'; + const json=JSON.stringify({source_type:src,rtsp_url:document.getElementById('rtsp-url').value,mp4_path:document.getElementById('mp4-path').value,res_w:parseInt(document.getElementById('res-w').value)||1920,res_h:parseInt(document.getElementById('res-h').value)||1080,fps:parseInt(document.getElementById('fps').value)||30,rotation:parseInt(document.getElementById('rotation').value)||0}); + ksu.exec("echo '"+json+"' > /data/local/tmp/virtualcam_config.json"); + log('Config saved','ok'); +}); +document.getElementById('btn-refresh')?.addEventListener('click',updateDash); +document.getElementById('btn-deviceinfo')?.addEventListener('click',loadDeviceInfo); +document.querySelectorAll('.src-btn').forEach(b=>b.addEventListener('click',()=>{ + document.querySelectorAll('.src-btn').forEach(x=>x.classList.remove('active')); + b.classList.add('active'); + document.getElementById('rtsp-config').classList.toggle('hidden',b.dataset.src!=='rtsp'); + document.getElementById('mp4-config').classList.toggle('hidden',b.dataset.src!=='mp4'); +})); +updateDash(); +setInterval(updateDash,5000); +document.getElementById('btn-refresh')?.addEventListener('click',updateDash); +document.getElementById('btn-deviceinfo')?.addEventListener('click',loadDeviceInfo); +document.querySelectorAll('.src-btn').forEach(b=>b.addEventListener('click',()=>{ + document.querySelectorAll('.src-btn').forEach(x=>x.classList.remove('active')); + b.classList.add('active'); + document.getElementById('rtsp-config').classList.toggle('hidden',b.dataset.src!=='rtsp'); + document.getElementById('mp4-config').classList.toggle('hidden',b.dataset.src!=='mp4'); +})); +updateDash(); +setInterval(updateDash,5000); diff --git a/webroot/style.css b/webroot/style.css index 481da30..1dcc059 100644 --- a/webroot/style.css +++ b/webroot/style.css @@ -12,17 +12,27 @@ header{text-align:center;padding:12px 0} .stat .v{font-size:15px;font-weight:600;display:block} .green{color:#3fb950}.red{color:#f85149}.yellow{color:#d29922} .source-selector{display:flex;gap:8px;margin-bottom:12px} -.src-btn{flex:1;padding:10px;border:1px solid #30363d;border-radius:6px;background:#0d1117;color:#8b949e;cursor:pointer} +.src-btn{flex:1;padding:10px;border:1px solid #30363d;border-radius:6px;background:#0d1117;color:#8b949e;cursor:pointer;font-size:14px} .src-btn.active{background:#1f6feb33;border-color:#1f6feb;color:#58a6ff} .hidden{display:none} label{font-size:12px;color:#8b949e;display:block;margin-bottom:4px} -input{width:100%;padding:10px;border:1px solid #30363d;border-radius:6px;background:#0d1117;color:#c9d1d9;font-size:14px} +input,select{width:100%;padding:10px;border:1px solid #30363d;border-radius:6px;background:#0d1117;color:#c9d1d9;font-size:14px} .row{display:flex;gap:8px;margin-bottom:12px}.row>div{flex:1} .num{width:100%} -.primary{width:100%;padding:12px;border:none;border-radius:6px;background:#238636;color:#fff;font-size:14px;font-weight:600;cursor:pointer} +.primary{width:100%;padding:12px;border:none;border-radius:6px;background:#238636;color:#fff;font-size:14px;font-weight:600;cursor:pointer;margin-top:8px} .grid{display:grid;grid-template-columns:1fr 1fr;gap:8px} -.btn{padding:12px;border:1px solid #30363d;border-radius:6px;background:#21262d;color:#c9d1d9;cursor:pointer;text-align:center} +.btn{padding:12px;border:1px solid #30363d;border-radius:6px;background:#21262d;color:#c9d1d9;cursor:pointer;text-align:center;font-size:13px} .btn.danger{border-color:#f8514944;color:#f85149} .btn.warning{border-color:#d2992244;color:#d29922} -.console{background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:10px;height:150px;overflow-y:auto;font-family:monospace;font-size:12px;color:#8b949e} +.console{background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:10px;height:180px;overflow-y:auto;font-family:monospace;font-size:11px;color:#8b949e} .console .ok{color:#3fb950}.console .err{color:#f85149}.console .info{color:#58a6ff} +.log-count{font-size:11px;color:#8b949e;font-weight:normal} +.btn-sm{padding:2px 8px;border:1px solid #30363d;border-radius:4px;background:#21262d;color:#c9d1d9;cursor:pointer;font-size:11px;float:right} +.muted{color:#8b949e;font-size:12px;text-align:center;padding:10px} +.device-info{font-size:12px;overflow-x:auto} +.di-table{width:100%;border-collapse:collapse;margin-bottom:8px} +.di-table td{padding:4px 6px;border:1px solid #30363d;vertical-align:top} +.di-lbl{color:#8b949e;white-space:nowrap;width:80px} +.di-cam{background:#0d1117;border:1px solid #30363d;border-radius:6px;padding:8px;margin-top:8px} +.di-cam-title{font-size:13px;font-weight:600;color:#58a6ff;margin-bottom:6px} +.size-badge{display:inline-block;background:#1f6feb33;border:1px solid #1f6feb44;border-radius:3px;padding:1px 5px;margin:1px;font-size:10px;color:#58a6ff}