#!/bin/bash

fallback_mode=false   # global: survives recursive calls

ENCODE_STREAMS=(
)

# normalize name (replace space with underscore)
NORMALIZED_NAME=$(echo "$STREAM_NAME" | tr ' ' '_')

for s in "${ENCODE_STREAMS[@]}"; do
    if [ "$NORMALIZED_NAME" = "$s" ]; then
        fallback_mode=true
        echo "Channel $STREAM_NAME forced to ENCODE mode."
        break
    fi
done



preset_hls_drm() {
    FIFO="/tmp/${STREAM_NAME}_pipe"
    umask 0002

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$RS_PID_PATH" "$STREAM_PID_PATH" "$FIFO"

    # -------------------------------
    # NEW FIFO
    # -------------------------------
    mkfifo "$FIFO" || { echo "Failed to create FIFO"; exit 1; }

    # clear old logs
    : > file.txt

    # -------------------------------
    # MODE: COPY MODE (FFmpeg + RStreamer)
    # -------------------------------
    if [ "$fallback_mode" = false ]; then

        echo "Starting in COPY mode (FFmpeg + RStreamer)..."

        # FFmpeg FIRST
        ffmpeg -loglevel info \
            -i "$FIFO" \
            -map 0:v -map 0:a? \
            -c:v copy -c:a aac -copytb 1 \
            -f hls -hls_list_size 6 -hls_time 2 \
            -hls_flags delete_segments+append_list \
            index.m3u8 \
            > /dev/null 2> file.txt &
        FFPID=$!
        echo "$FFPID" > "$STREAM_PID_PATH"

        sleep 0.5
        kill -0 "$FFPID" || { echo "FFmpeg startup failed"; exit 1; }

        # RStreamer SECOND
        Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O file - > "$FIFO" &
        RSPID=$!
        echo "$RSPID" > "$RS_PID_PATH"

        sleep 0.5
        kill -0 "$RSPID" || {
            echo "RStreamer failed to start"
            kill -9 "$FFPID"
            exit 1
        }

        echo "Started COPY-MODE: FF=$FFPID  RS=$RSPID"


    # -------------------------------
    # MODE: ENCODE MODE (Standalone RStreamer)
    # -------------------------------
    else    
        echo "Starting in ENCODE mode (RStreamer HLS)..."

        umask 0002
        chmod -R 0777 /home/user/RIDSYSPACKAGE/riptv/live/


        echo "Starting in ENCODE mode (FFmpeg libx264)..."

        Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O file - > "$FIFO" &

        RSPID=$!
        echo "$RSPID" > "$RS_PID_PATH"

        sleep 0.5

        ffmpeg -loglevel info -fflags +genpts+discardcorrupt -re \
            -i "$FIFO" \
            -map 0:v -map 0:a? -vf "yadif=1" \
            -c:v libx264 -r 25 -preset superfast -tune film -b:v 4000k -maxrate 4000k -bufsize 10000k  \
            -muxrate 5000k \
            -c:a aac -b:a 128k \
            -f hls -hls_list_size 6 -hls_time 2 \
            -hls_flags delete_segments+append_list \
            index.m3u8 \
            > /dev/null 2> file.txt &

        FFPID=$!
        echo "$FFPID" > "$STREAM_PID_PATH"

        sleep 0.5
        kill -0 "$FFPID" || { echo "FFmpeg startup failed"; exit 1; }

        sleep 0.5
        kill -0 "$RSPID" || {
            echo "RStreamer failed to start"
            kill -9 "$FFPID"
            exit 1
        }

        echo "Started ENCODE-MODE: RS=$RSPID FF=$FFPID"

        chmod -R 0777 "$STREAM_PID_PATH"

    fi

    echo "Started $STREAM_NAME → RS=$RSPID  FF=$FFPID (fallback_mode=$fallback_mode)"
    echo "Preset completed successfully → NO restart needed."
}


preset_hls() {
    FIFO="/tmp/${STREAM_NAME}_pipe"
    umask 0002

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$RS_PID_PATH" "$STREAM_PID_PATH" "$FIFO"

    # -------------------------------
    # NEW FIFO
    # -------------------------------
    mkfifo "$FIFO" || { echo "Failed to create FIFO"; exit 1; }

    # clear old logs
    : > file.txt

    # -------------------------------
    # MODE: COPY MODE (FFmpeg + RStreamer)
    # -------------------------------
    if [ "$fallback_mode" = false ]; then

        echo "Starting in COPY mode (FFmpeg + RStreamer)..."

        # FFmpeg FIRST
        ffmpeg -loglevel info \
            -i "$FIFO" \
            -map 0:v -map 0:a? \
            -c:v copy -c:a aac  \
            -hls_key_info_file /home/user/RIDSYSPACKAGE/riptv/live/Testing_drm/file.keyinfo \
            -f hls -hls_list_size 6 -hls_time 2 \
            -hls_flags delete_segments+append_list \
            index.m3u8 \
            > /dev/null 2> file.txt &
        FFPID=$!
        echo "$FFPID" > "$STREAM_PID_PATH"

        sleep 0.5
        kill -0 "$FFPID" || { echo "FFmpeg startup failed"; exit 1; }

        # RStreamer SECOND
        Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O file - > "$FIFO" &
        RSPID=$!
        echo "$RSPID" > "$RS_PID_PATH"

        sleep 0.5
        kill -0 "$RSPID" || {
            echo "RStreamer failed to start"
            kill -9 "$FFPID"
            exit 1
        }

        echo "Started COPY-MODE: FF=$FFPID  RS=$RSPID"


    # -------------------------------
    # MODE: ENCODE MODE (Standalone RStreamer)
    # -------------------------------
    else    
        echo "Starting in ENCODE mode (RStreamer HLS)..."

        umask 0002
        chmod -R 0777 /home/user/RIDSYSPACKAGE/riptv/live/


        echo "Starting in ENCODE mode (FFmpeg libx264)..."

        Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O file - > "$FIFO" &

        RSPID=$!
        echo "$RSPID" > "$RS_PID_PATH"

        sleep 0.5

        ffmpeg -loglevel info -fflags +genpts+discardcorrupt -re \
            -i "$FIFO" \
            -map 0:v -map 0:a? -vf "yadif=1" \
            -c:v libx264 -r 25 -preset superfast -tune film -b:v 4000k -maxrate 4000k -bufsize 10000k  \
            -muxrate 5000k \
            -c:a aac -b:a 128k \
            -f hls -hls_list_size 6 -hls_time 2 \
            -hls_flags delete_segments+append_list \
            index.m3u8 \
            > /dev/null 2> file.txt &

        FFPID=$!
        echo "$FFPID" > "$STREAM_PID_PATH"

        sleep 0.5
        kill -0 "$FFPID" || { echo "FFmpeg startup failed"; exit 1; }

        sleep 0.5
        kill -0 "$RSPID" || {
            echo "RStreamer failed to start"
            kill -9 "$FFPID"
            exit 1
        }

        echo "Started ENCODE-MODE: RS=$RSPID FF=$FFPID"

        chmod -R 0777 "$STREAM_PID_PATH"

    fi

    echo "Started $STREAM_NAME → RS=$RSPID  FF=$FFPID (fallback_mode=$fallback_mode)"
    echo "Preset completed successfully → NO restart needed."
}


preset_udp_drm() {


    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH"

/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log -I ip -r $INPUT_URL \
 -P scrambler --ignore-scrambled --cw 0000000000000001 --partial-scrambling 7 "" \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P pmt --increment-version --add-ca-descriptor "0x4b19/0x03e8" \
 -P analyze -i 30 -o report.txt \
 -O ip --ttl 64 -l $OUTPUT_INTERFACE $OUTPUT_URL \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH 

}


preset_udp() {

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH"

/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log -I ip -r $INPUT_URL \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P analyze -i 30 -o report.txt  \
 -O ip --ttl 64 -l $OUTPUT_INTERFACE $OUTPUT_URL \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH  

}


preset_mpts_udp_drm() {
/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log -I ip -r $INPUT_URL \
 -P zap "$CH_NAME" \
 -P scrambler --ignore-scrambled --cw 0000000000000001 --partial-scrambling 7 "" \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P pmt --increment-version --add-ca-descriptor "0x4b19/0x03e8" \
 -P analyze -i 30 -o report.txt \
 -O ip --ttl 64 -l $OUTPUT_INTERFACE $OUTPUT_URL \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH

}


preset_mpts_udp() {
/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log -I ip -r $INPUT_URL \
 -P zap "$CH_NAME" \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P svrename --provider "$PROVIDER" \
 -P analyze -i 30 -o report.txt  \
 -O ip --ttl 13 -l $OUTPUT_INTERFACE $OUTPUT_URL  \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH  


}



preset_mpts_hls_drm() {

    FIFO="/tmp/${STREAM_NAME}_pipe"

    umask 0002
    mkfifo "$FIFO"

    # Start RStreamer -> FIFO
        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I ip $INPUT_URL \
         -P zap "$CH_NAME" \
         -P analyze -i 30 -o report.txt  \
         -P regulate \
        -O file - > "$FIFO" &
    RSPID=$!

    # Start FFmpeg -> HLS
    ffmpeg -f mpegts -fflags +genpts+discardcorrupt+igndts -thread_queue_size 512 \
        -rw_timeout 5000000 \
        -i "$FIFO" -c copy \
        -f hls -hls_time 2 -hls_list_size 6 \
        -hls_key_info_file file.keyinfo \        
        -hls_flags +split_by_time+delete_segments+append_list \
        index.m3u8 \
        > /dev/null \
        2> file.txt &
    FFPID=$!

    #echo "$RSPID" > "$STREAM_PID_PATH"
    echo "$FFPID" > "$STREAM_PID_PATH"

    echo "Started stream $STREAM_NAME : RS=$RSPID  FF=$FFPID"
}

preset_mpts_hls() {

    FIFO="/tmp/${STREAM_NAME}_pipe"

    umask 0002
    mkfifo "$FIFO"

    # Start RStreamer -> FIFO
        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I ip $INPUT_URL \
         -P zap "$CH_NAME" \
         -P analyze -i 30 -o report.txt  \
         -P regulate \
        -O file - > "$FIFO" &
    RSPID=$!

    # Start FFmpeg -> HLS
    ffmpeg -f mpegts -fflags +genpts+discardcorrupt+igndts -thread_queue_size 512 \
        -rw_timeout 5000000 \
        -i "$FIFO" -c copy \
        -f hls -hls_time 2 -hls_list_size 6 \
        -hls_flags +split_by_time+delete_segments+append_list \
        index.m3u8 \
        > /dev/null \
        2> file.txt &
    FFPID=$!

    #echo "$RSPID" > "$STREAM_PID_PATH"
    echo "$FFPID" > "$STREAM_PID_PATH"

    echo "Started stream $STREAM_NAME : RS=$RSPID  FF=$FFPID"

}

preset_hls_to_udp_drm() {
    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH" 

/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I hls $INPUT_URL \
 -P svrename -i 10 \
 -P scrambler --ignore-scrambled --cw 0000000000000001 --partial-scrambling 7 "" \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P pmt --increment-version --add-ca-descriptor "0x4b19/0x03e8" \
 -P analyze -i 30 -o report.txt \
 -O ip --ttl 64 -l $OUTPUT_INTERFACE $OUTPUT_URL \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH  

}


preset_hls_to_udp() {

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH" 

/etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I hls $INPUT_URL \
 -P filter --pid 0x0014 --pid 0x0010 --pid 0x0001 --negate \
 -P analyze -i 30 -o report.txt  \
 -O ip --ttl 64 -l $OUTPUT_INTERFACE $OUTPUT_URL  \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH 

}

preset_hls_to_hls() {

    FIFO="/tmp/${STREAM_NAME}_pipe"

    umask 0002
    mkfifo "$FIFO"

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH" 

    # Start RStreamer -> FIFO
        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I hls $INPUT_URL \
         -P analyze -i 30 -o report.txt  \
         -P regulate \
        -O file - > "$FIFO" &
    RSPID=$!

    # Start FFmpeg -> HLS
    ffmpeg -f mpegts -fflags +genpts+discardcorrupt+igndts -thread_queue_size 512 \
        -rw_timeout 5000000 \
        -i "$FIFO" -c copy \
        -f hls -hls_time 2 -hls_list_size 6 \
        -hls_flags +split_by_time+delete_segments+append_list \
        index.m3u8 \
        > /dev/null \
        2> file.txt &
    FFPID=$!

    #echo "$RSPID" > "$STREAM_PID_PATH"
    echo "$FFPID" > "$STREAM_PID_PATH"

    echo "Started stream $STREAM_NAME : RS=$RSPID  FF=$FFPID"

}

preset_hls_to_hls_drm() {

    FIFO="/tmp/${STREAM_NAME}_pipe"

    umask 0002
    mkfifo "$FIFO"

    # -------------------------------
    # CLEAN & KILL HELPER
    # -------------------------------
    stop_pid() {
        local pid="$1"
        local name="$2"

        [ -z "$pid" ] && return
        if ! kill -0 "$pid" 2>/dev/null; then return; fi

        kill "$pid" 2>/dev/null || true

        for i in {1..5}; do
            kill -0 "$pid" 2>/dev/null || return
            sleep 1
        done

        kill -9 "$pid" 2>/dev/null || true
    }

    # -------------------------------
    # KILL OLD PIPELINE
    # -------------------------------
    for pid in $(pgrep -f "$INPUT_URL" 2>/dev/null); do
        stop_pid "$pid" "old pipeline"
    done

    rm -f "$STREAM_PID_PATH" 
    
    # Start RStreamer -> FIFO
        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6  -v -m --synchronous-log -I hls $INPUT_URL \
         -P analyze -i 30 -o report.txt  \
         -P regulate \
        -O file - > "$FIFO" &
    RSPID=$!

    # Start FFmpeg -> HLS
    ffmpeg -f mpegts -fflags +genpts+discardcorrupt+igndts -thread_queue_size 512 \
        -rw_timeout 5000000 \
        -i "$FIFO" -c copy \
        -f hls -hls_time 2 -hls_list_size 6 \
        -hls_key_info_file file.keyinfo \        
        -hls_flags +split_by_time+delete_segments+append_list \
        index.m3u8 \
        > /dev/null \
        2> file.txt &
    FFPID=$!

    #echo "$RSPID" > "$STREAM_PID_PATH"
    echo "$FFPID" > "$STREAM_PID_PATH"

    echo "Started stream $STREAM_NAME : RS=$RSPID  FF=$FFPID"

}



preset_hls_360p() {

if [ ! -d playlist ]; then
  mkdir playlist
fi

if [ ! -d playlist/360p ]; then
  mkdir playlist/360p
fi

ffmpeg -threads 3 -i "$INPUT_URL?overrun_nonfatal=1&fifo_size=2000000" \
 -r 25 -g 25 -sc_threshold 0 -aspect 16:9 \
  -s:v 640x360 -c:v libx264 -preset superfast -crf 26 -b:v 400k \
  -c:a aac -b:a 128k -ac 2 \
  -threads 4 -f hls -hls_time 3 -hls_wrap 15 \
  "playlist/360p/manifest.m3u8" \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH


}


preset_hls_720p() {

if [ ! -d playlist ]; then
  mkdir playlist
fi


if [ ! -d playlist/720p ]; then
  mkdir playlist/720p
fi

ffmpeg -threads 3 -i "$INPUT_URL?overrun_nonfatal=1&fifo_size=2000000" \
 -r 25 -g 25 -sc_threshold 0 -aspect 16:9 \
  -s:v 720x576 -c:v libx264 -preset superfast -crf 26 -b:v 400k \
  -c:a aac -b:a 128k -ac 2 \
  -threads 4 -f hls -hls_time 3 -hls_wrap 15 \
  "playlist/720p/manifest.m3u8" \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH

}


preset_hls_1080p() {

if [ ! -d playlist ]; then
  mkdir playlist
fi


if [ ! -d playlist/1080p ]; then
  mkdir playlist/1080p
fi

ffmpeg -threads 3 -i "$INPUT_URL?overrun_nonfatal=1&fifo_size=2000000" \
 -r 25 -g 25 -sc_threshold 0 -aspect 16:9 \
  -s:v 1920x1080 -c:v libx264 -preset superfast -crf 26 -b:v 400k \
  -c:a aac -b:a 128k -ac 2 \
  -threads 4 -f hls -hls_time 3 -hls_wrap 15 \
  "playlist/1080p/manifest.m3u8" \
</dev/null > /dev/null 2>&1 2>file.txt & echo $! > $STREAM_PID_PATH

}


call_function() {
local func_name="$1"
if declare -f "$func_name" > /dev/null; then
$func_name
else
echo "Function $func_name not found"
fi

}

call_function "$FUNCTION_TO_CALL"      

=== UDP->HLS v4-OpenH264  ch=1  groups=1  seg=2s ===
=== build: Aug  4 2026 10:58:43 ===

[index] AES ready
[probe] lo: skipped (loopback)
[probe] eth0 (103.183.47.210): trying, timeout=1500ms...
[probe] eth0 (103.183.47.210): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth1 (192.168.81.2): trying, timeout=1500ms...
[probe] eth1 (192.168.81.2): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1501ms
[probe] eth2 (192.168.82.2): trying, timeout=1500ms...
[probe] eth2 (192.168.82.2): poll_result=1 got_n=1316 first_byte=0x47 match=YES elapsed=1ms
[probe] FINAL: matched (see iface above)
[index] joined 237.10.10.3:1025 iface=192.168.82.2  mode=in-process
[NIC:auto] watching 1 channels
[index] first dgram len=1316
[index] plain TS
[pmt] audio pid=0x1120 type=0x03 -> 0x0F (AAC) (descriptors stripped)
[index] audio_transcode: track1 src_pid=0x1120 codec=MP2->AAC bitrate=128000 coder=fast
[audxc] MP2->AAC 48kHz stereo 128kbps ready
[index] audxc track1: first AAC output: 376 bytes (2 TS pkts)

[22:21:31] ── stats ──────────────────────────────────
  [22:21:24][index] PAT pmt_pid=0x0061
  [22:21:25][index] PMT vid=0x1160 aud=0x1120 pcr=0x1160
  [22:21:25][index] CLEAN START vid=0x1160
  [22:21:25][index] opened  index0.ts
  [22:21:28][index] closed  index0.ts  2.460s  3562kbps
  [22:21:28][index] opened  index1.ts
  [22:21:30][index] closed  index1.ts  2.556s  3565kbps
  [22:21:30][index] opened  index2.ts
  [index         ] OK  segs=2      1658.0pkt/s   2493.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=2 pkts=16581  stalled=0 nosignal=0 / 1
[22:21:31] ──────────────────────────────────────────


[22:21:41] ── stats ──────────────────────────────────
  [22:21:33][index] closed  index2.ts  2.518s  3431kbps
  [22:21:33][index] opened  index3.ts
  [22:21:36][index] closed  index3.ts  3.159s  3481kbps
  [22:21:36][index] opened  index4.ts
  [22:21:39][index] closed  index4.ts  2.800s  3381kbps
  [22:21:39][index] opened  index5.ts
  [index         ] OK  segs=5      2321.7pkt/s   3491.8kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=5 pkts=39800  stalled=0 nosignal=0 / 1
[22:21:41] ──────────────────────────────────────────


=== UDP->HLS v4-OpenH264  ch=1  groups=1  seg=2s ===
=== build: Aug  4 2026 10:58:43 ===

[index] AES ready
[probe] lo: skipped (loopback)
[probe] eth0 (103.183.47.210): trying, timeout=1500ms...
[probe] eth0 (103.183.47.210): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth1 (192.168.81.2): trying, timeout=1500ms...
[probe] eth1 (192.168.81.2): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth2 (192.168.82.2): trying, timeout=1500ms...
[probe] eth2 (192.168.82.2): poll_result=1 got_n=1316 first_byte=0x47 match=YES elapsed=2ms
[probe] FINAL: matched (see iface above)
[index] joined 237.10.10.3:1025 iface=192.168.82.2  mode=in-process
[NIC:auto] watching 1 channels
[index] first dgram len=1316
[index] plain TS
[pmt] audio pid=0x1120 type=0x03 -> 0x0F (AAC) (descriptors stripped)
[index] audio_transcode: track1 src_pid=0x1120 codec=MP2->AAC bitrate=128000 coder=fast
[audxc] MP2->AAC 48kHz stereo 128kbps ready
[index] audxc track1: first AAC output: 376 bytes (2 TS pkts)

[22:22:02] ── stats ──────────────────────────────────
  [22:21:55][index] PAT pmt_pid=0x0061
  [22:21:55][index] PMT vid=0x1160 aud=0x1120 pcr=0x1160
  [22:21:55][index] CLEAN START vid=0x1160
  [22:21:55][index] opened  index0.ts
  [22:21:58][index] closed  index0.ts  2.293s  3559kbps
  [22:21:58][index] opened  index1.ts
  [22:22:00][index] closed  index1.ts  2.195s  3563kbps
  [22:22:00][index] opened  index2.ts
  [index         ] OK  segs=2      1664.7pkt/s   2503.7kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=2 pkts=16648  stalled=0 nosignal=0 / 1
[22:22:02] ──────────────────────────────────────────

[index] final

=== UDP->HLS v4-OpenH264  ch=1  groups=1  seg=2s ===
=== build: Aug  4 2026 10:58:43 ===

[index] AES ready
[probe] lo: skipped (loopback)
[probe] eth0 (103.183.47.210): trying, timeout=1500ms...
[probe] eth0 (103.183.47.210): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth1 (192.168.81.2): trying, timeout=1500ms...
[probe] eth1 (192.168.81.2): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth2 (192.168.82.2): trying, timeout=1500ms...
[probe] eth2 (192.168.82.2): poll_result=1 got_n=1316 first_byte=0x47 match=YES elapsed=1ms
[probe] FINAL: matched (see iface above)
[index] joined 237.10.10.3:1025 iface=192.168.82.2  mode=in-process
[NIC:auto] watching 1 channels
[index] first dgram len=1316
[index] plain TS
[pmt] audio pid=0x1120 type=0x03 -> 0x0F (AAC) (descriptors stripped)
[index] audio_transcode: track1 src_pid=0x1120 codec=MP2->AAC bitrate=128000 coder=fast
[audxc] MP2->AAC 48kHz stereo 128kbps ready
[index] audxc track1: first AAC output: 376 bytes (2 TS pkts)

[22:22:52] ── stats ──────────────────────────────────
  [22:22:46][index] PAT pmt_pid=0x0061
  [22:22:46][index] PMT vid=0x1160 aud=0x1120 pcr=0x1160
  [22:22:46][index] CLEAN START vid=0x1160
  [22:22:46][index] opened  index0.ts
  [22:22:48][index] closed  index0.ts  2.532s  3560kbps
  [22:22:48][index] opened  index1.ts
  [22:22:51][index] closed  index1.ts  2.651s  3562kbps
  [22:22:51][index] opened  index2.ts
  [index         ] OK  segs=2      1676.3pkt/s   2521.2kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=2 pkts=16764  stalled=0 nosignal=0 / 1
[22:22:52] ──────────────────────────────────────────


[22:23:02] ── stats ──────────────────────────────────
  [22:22:53][index] closed  index2.ts  2.308s  3564kbps
  [22:22:53][index] opened  index3.ts
  [22:22:56][index] closed  index3.ts  2.137s  3574kbps
  [22:22:56][index] opened  index4.ts
  [22:22:59][index] closed  index4.ts  3.017s  3426kbps
  [22:22:59][index] opened  index5.ts
  [22:23:01][index] closed  index5.ts  2.126s  3001kbps
  [22:23:01][index] opened  index6.ts
  [index         ] OK  segs=6      2277.6pkt/s   3425.5kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=6 pkts=39542  stalled=0 nosignal=0 / 1
[22:23:02] ──────────────────────────────────────────


[22:23:12] ── stats ──────────────────────────────────
  [22:23:03][index] closed  index6.ts  2.258s  3487kbps
  [22:23:03][index] opened  index7.ts
  [22:23:05][index] closed  index7.ts  2.494s  3281kbps
  [22:23:05][index] opened  index8.ts
  [22:23:08][index] closed  index8.ts  2.339s  3568kbps
  [22:23:08][index] opened  index9.ts
  [22:23:10][index] closed  index9.ts  2.316s  3572kbps
  [22:23:10][index] opened  index10.ts
  [index         ] OK  segs=10     2349.5pkt/s   3533.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=10 pkts=63039  stalled=0 nosignal=0 / 1
[22:23:12] ──────────────────────────────────────────


[22:23:22] ── stats ──────────────────────────────────
  [22:23:12][index] closed  index10.ts  2.339s  3566kbps
  [22:23:12][index] opened  index11.ts
  [22:23:15][index] closed  index11.ts  2.518s  3566kbps
  [22:23:15][index] opened  index12.ts
  [22:23:17][index] closed  index12.ts  2.484s  3536kbps
  [22:23:17][index] opened  index13.ts
  [22:23:20][index] closed  index13.ts  2.561s  3496kbps
  [22:23:20][index] opened  index14.ts
  [index         ] OK  segs=14     2380.0pkt/s   3579.5kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=14 pkts=86841  stalled=0 nosignal=0 / 1
[22:23:22] ──────────────────────────────────────────


[22:23:32] ── stats ──────────────────────────────────
  [22:23:23][index] closed  index14.ts  2.718s  3562kbps
  [22:23:23][index] opened  index15.ts
  [22:23:25][index] closed  index15.ts  2.080s  2858kbps
  [22:23:25][index] opened  index16.ts
  [22:23:27][index] closed  index16.ts  2.559s  3283kbps
  [22:23:27][index] opened  index17.ts
  [22:23:30][index] closed  index17.ts  2.560s  3321kbps
  [22:23:30][index] opened  index18.ts
  [index         ] OK  segs=18     2170.6pkt/s   3264.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=18 pkts=108549  stalled=0 nosignal=0 / 1
[22:23:32] ──────────────────────────────────────────


[22:23:42] ── stats ──────────────────────────────────
  [22:23:33][index] closed  index18.ts  3.440s  3181kbps
  [22:23:33][index] opened  index19.ts
  [22:23:36][index] closed  index19.ts  2.374s  3572kbps
  [22:23:36][index] opened  index20.ts
  [22:23:38][index] closed  index20.ts  2.464s  3385kbps
  [22:23:38][index] opened  index21.ts
  [22:23:40][index] closed  index21.ts  1.960s  3125kbps
  [22:23:40][index] opened  index22.ts
  [22:23:42][index] closed  index22.ts  2.110s  3568kbps
  [22:23:42][index] opened  index23.ts
  [index         ] OK  segs=23     2262.1pkt/s   3402.2kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=23 pkts=131172  stalled=0 nosignal=0 / 1
[22:23:42] ──────────────────────────────────────────


[22:23:52] ── stats ──────────────────────────────────
  [22:23:45][index] closed  index23.ts  2.463s  3572kbps
  [22:23:45][index] opened  index24.ts
  [22:23:47][index] closed  index24.ts  2.200s  3566kbps
  [22:23:47][index] opened  index25.ts
  [22:23:50][index] closed  index25.ts  3.028s  3567kbps
  [22:23:50][index] opened  index26.ts
  [index         ] OK  segs=26     2374.0pkt/s   3570.4kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=26 pkts=154914  stalled=0 nosignal=0 / 1
[22:23:52] ──────────────────────────────────────────


[22:24:02] ── stats ──────────────────────────────────
  [22:23:53][index] closed  index26.ts  2.589s  3436kbps
  [22:23:53][index] opened  index27.ts
  [22:23:55][index] closed  index27.ts  2.087s  3326kbps
  [22:23:55][index] opened  index28.ts
  [22:23:58][index] closed  index28.ts  2.983s  3569kbps
  [22:23:58][index] opened  index29.ts
  [22:24:00][index] closed  index29.ts  2.108s  3568kbps
  [22:24:00][index] opened  index30.ts
  [index         ] OK  segs=30     2364.1pkt/s   3555.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=30 pkts=178557  stalled=0 nosignal=0 / 1
[22:24:02] ──────────────────────────────────────────


[22:24:12] ── stats ──────────────────────────────────
  [22:24:03][index] closed  index30.ts  2.905s  3568kbps
  [22:24:03][index] opened  index31.ts
  [22:24:05][index] closed  index31.ts  2.001s  3338kbps
  [22:24:05][index] opened  index32.ts
  [22:24:07][index] closed  index32.ts  2.091s  3569kbps
  [22:24:07][index] opened  index33.ts
  [22:24:09][index] closed  index33.ts  2.749s  2467kbps
  [22:24:09][index] opened  index34.ts
  [22:24:12][index] closed  index34.ts  2.560s  3473kbps
  [22:24:12][index] opened  index35.ts
  [index         ] OK  segs=35     2149.2pkt/s   3232.4kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=35 pkts=200051  stalled=0 nosignal=0 / 1
[22:24:12] ──────────────────────────────────────────


[22:24:22] ── stats ──────────────────────────────────
  [22:24:14][index] closed  index35.ts  2.118s  1912kbps
  [22:24:14][index] opened  index36.ts
  [22:24:16][index] closed  index36.ts  2.009s  3468kbps
  [22:24:16][index] opened  index37.ts
  [22:24:18][index] closed  index37.ts  2.201s  3281kbps
  [22:24:18][index] opened  index38.ts
  [22:24:20][index] closed  index38.ts  1.909s  3239kbps
  [22:24:20][index] opened  index39.ts
  [22:24:22][index] closed  index39.ts  1.810s  3433kbps
  [22:24:22][index] opened  index40.ts
  [index         ] OK  segs=40     2048.3pkt/s   3080.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=40 pkts=220536  stalled=0 nosignal=0 / 1
[22:24:22] ──────────────────────────────────────────


[22:24:32] ── stats ──────────────────────────────────
  [22:24:25][index] closed  index40.ts  2.668s  3331kbps
  [22:24:25][index] opened  index41.ts
  [22:24:27][index] closed  index41.ts  2.082s  3566kbps
  [22:24:27][index] opened  index42.ts
  [22:24:29][index] closed  index42.ts  2.277s  3528kbps
  [22:24:29][index] opened  index43.ts
  [22:24:31][index] closed  index43.ts  2.080s  3316kbps
  [22:24:31][index] opened  index44.ts
  [index         ] OK  segs=44     2314.8pkt/s   3481.4kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=44 pkts=243686  stalled=0 nosignal=0 / 1
[22:24:32] ──────────────────────────────────────────


[22:24:42] ── stats ──────────────────────────────────
  [22:24:34][index] closed  index44.ts  2.812s  3566kbps
  [22:24:34][index] opened  index45.ts
  [22:24:36][index] closed  index45.ts  2.028s  3453kbps
  [22:24:36][index] opened  index46.ts
  [22:24:38][index] closed  index46.ts  1.809s  3567kbps
  [22:24:38][index] opened  index47.ts
  [22:24:41][index] closed  index47.ts  2.847s  3565kbps
  [22:24:41][index] opened  index48.ts
  [index         ] OK  segs=48     2354.5pkt/s   3541.1kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=48 pkts=267233  stalled=0 nosignal=0 / 1
[22:24:42] ──────────────────────────────────────────


[22:24:52] ── stats ──────────────────────────────────
  [22:24:43][index] closed  index48.ts  1.862s  3283kbps
  [22:24:43][index] opened  index49.ts
  [22:24:45][index] closed  index49.ts  2.239s  2906kbps
  [22:24:45][index] opened  index50.ts
  [22:24:48][index] closed  index50.ts  2.883s  3100kbps
  [22:24:48][index] opened  index51.ts
  [22:24:50][index] closed  index51.ts  2.676s  3127kbps
  [22:24:50][index] opened  index52.ts
  [index         ] OK  segs=52     2028.7pkt/s   3051.2kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=52 pkts=287522  stalled=0 nosignal=0 / 1
[22:24:52] ──────────────────────────────────────────


[22:25:02] ── stats ──────────────────────────────────
  [22:24:53][index] closed  index52.ts  2.641s  2809kbps
  [22:24:53][index] opened  index53.ts
  [22:24:55][index] closed  index53.ts  2.279s  2713kbps
  [22:24:55][index] opened  index54.ts
  [22:24:57][index] closed  index54.ts  2.176s  3427kbps
  [22:24:57][index] opened  index55.ts
  [22:24:59][index] closed  index55.ts  2.022s  3566kbps
  [22:24:59][index] opened  index56.ts
  [22:25:02][index] closed  index56.ts  2.139s  3572kbps
  [22:25:02][index] opened  index57.ts
  [index         ] OK  segs=57     2179.5pkt/s   3278.0kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=57 pkts=309319  stalled=0 nosignal=0 / 1
[22:25:02] ──────────────────────────────────────────

[index] final
