Fix stallDurations metadata buffer, add web=true, rebuild provider

- Increase camera metadata buffer from 2048 to 4096 bytes to prevent
  silent truncation of stallDurations (required by Android 16)
- Add web=true to module.prop for KernelSU WebUI detection
- Rebuilt virtual_camera_provider with buffer fix
- Updated WebUI JS with improved status display
- Bump version to 3.1
This commit is contained in:
2026-05-14 20:23:36 +02:00
parent ef0d17680f
commit 0e399ce02f
7 changed files with 70 additions and 29 deletions
+45 -23
View File
@@ -1,62 +1,84 @@
#!/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" ] && . /data/adb/modules/alias/system/bin/shflags 2>/dev/null || true
[ -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:=rtsp} ${RTSP_URL:=rtsp://192.168.1.100:8554/stream}
: ${MP4_PATH:=/sdcard/Download/video.mp4} ${RES_W:=1920} ${RES_H:=1080} ${FPS:=30}
: ${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\|gst-launch.*video0" | head -1)
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)
insmod "$MODDIR/v4l2loopback.ko" devices=1 video_nr=0 card_label="VirtualCam" exclusive_caps=1 2>/dev/null || true
pkill -9 -f virtual_camera_provider 2>/dev/null || true
"$MODDIR/vendor/bin/virtual_camera_provider" -d /dev/video0 -w 1920 -h 1080 -i virtual &
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 -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\|gst-launch.*video0" 2>/dev/null || true
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
ffmpeg -rtsp_transport tcp -i "$RTSP_URL" -f v4l2 -input_format nv21 \
-video_size "${RES_W}x${RES_H}" -framerate "$FPS" -pix_fmt nv21 /dev/video0 &
elif [ "$SOURCE_TYPE" = "mp4" -a -f "$MP4_PATH" ]; then
ffmpeg -stream_loop -1 -re -i "$MP4_PATH" -f v4l2 -input_format nv21 \
-video_size "${RES_W}x${RES_H}" -framerate "$FPS" -pix_fmt nv21 /dev/video0 &
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\|gst-launch.*video0" 2>/dev/null || true
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,\"res_h\":$RES_H,\"fps\":$FPS}"
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}}"
;;
set_config|save)
cat > "$CONFIG_FILE" << DATA
{"source_type":"$2","rtsp_url":"$3","mp4_path":"$4","res_w":$5,"res_h":$6,"fps":$7}
DATA
echo '{"status":"saved"}'
*)
echo "Usage: $0 {status|start|stop|restart|start_feeder|stop_feeder|get_config}"
;;
esac
esac