made some good changes
This commit is contained in:
+81
-1
@@ -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 >/dev/null 2>&1 &
|
||||
log "service: provider launched"
|
||||
fi
|
||||
exit 0
|
||||
|
||||
# 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 >/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
|
||||
|
||||
Reference in New Issue
Block a user