#!/bin/bash

fallback_mode=false   # global: survives recursive calls

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" 

    # 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 -hide_banner -f mpegts \
            -i "$FIFO" \
            -map 0:v -map 0:a:2 \
            -c:v copy -c:a aac \
            -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

        # 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"
        }

        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/

        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O hls --duration 2 --live 15 -p index.m3u8 index.ts \
            </dev/null > /dev/null 2>&1 2>file.txt &

        RSPID=$!
        echo "$RSPID" > "$STREAM_PID_PATH"

        chmod -R 0777 "$STREAM_PID_PATH"

        sleep 0.5

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

    fi

    echo "Started $STREAM_NAME → RS=$RSPID  FF=$FFPID (fallback_mode=$fallback_mode)"

    # -------------------------------
    # ONE-SHOT FREEZE CHECK
    # -------------------------------
    dead_start=$(date +%s)
    restart=false

    while true; do
        sleep 10

        # # If user manually kills ffmpeg → exit normally  //only if ffmpeg run in fallback mode
        # if ! kill -0 "$FFPID" 2>/dev/null; then
        #     echo "FFmpeg manually stopped → exiting without restart."
        #     return
        # fi

        # If RStreamer dies → exit normally
        if ! kill -0 "$RSPID" 2>/dev/null; then
            echo "RStreamer stopped → exiting without restart."
            return
        fi

        LINE=$(grep "frame=" file.txt | tail -1)
        frame=$(echo "$LINE" | sed -n 's/.*frame=\s*\([0-9]*\).*/\1/p')
        fps=$(echo "$LINE" | sed -n 's/.*fps=\s*\([0-9.]*\).*/\1/p')

        echo "DEBUG: frame=$frame fps=$fps"

        # If logs do NOT contain fps/frame → treat as healthy
        if [ -z "$frame" ] || [ -z "$fps" ]; then
            echo "No frame/fps found → treating as healthy → exiting check."
            break
        fi

        # Real data → healthy
        if [ "$frame" != "0" ] || [ "$fps" != "0.0" ]; then
            echo "Stream healthy → exiting check."
            break
        fi

        # Frozen (frame=0 & fps=0.0)
        if [ $(( $(date +%s) - dead_start )) -ge 10 ]; then
            echo "Frozen for 10s → restart encode mode."
            restart=true
            break
        fi
    done

    # -------------------------------
    # RESTART IF NEEDED
    # -------------------------------
    if [ "$restart" = true ]; then
        fallback_mode=true
        stop_pid "$FFPID" "FFmpeg"
        stop_pid "$RSPID" "RStreamer"
        rm -f "$FIFO" "$STREAM_PID_PATH" "$RS_PID_PATH"

        echo "Restarting in ENCODE mode..."
        preset_hls_drm
        return
    fi

    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" 

    # 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 -hide_banner -f mpegts \
            -i "$FIFO" \
            -map 0:v -map 0:a:2 \
            -c:v copy -c:a aac \
            -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

        # 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"
        }

        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/

        /etc/systemd/ridsys_engine/Ridsys-RStreamer_Engine-1.6 -v -m --synchronous-log \
            -I ip "$INPUT_URL" \
            -P analyze -i 30 -o report.txt \
            -P regulate \
            -O hls --duration 2 --live 15 -p index.m3u8 index.ts \
            </dev/null > /dev/null 2>&1 2>file.txt &

        RSPID=$!
        echo "$RSPID" > "$STREAM_PID_PATH"

        chmod -R 0777 "$STREAM_PID_PATH"

        sleep 0.5

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

    fi

    echo "Started $STREAM_NAME → RS=$RSPID  FF=$FFPID (fallback_mode=$fallback_mode)"

    # -------------------------------
    # ONE-SHOT FREEZE CHECK
    # -------------------------------
    dead_start=$(date +%s)
    restart=false

    while true; do
        sleep 10

        # # If user manually kills ffmpeg → exit normally  //only if ffmpeg run in fallback mode
        # if ! kill -0 "$FFPID" 2>/dev/null; then
        #     echo "FFmpeg manually stopped → exiting without restart."
        #     return
        # fi

        # If RStreamer dies → exit normally
        if ! kill -0 "$RSPID" 2>/dev/null; then
            echo "RStreamer stopped → exiting without restart."
            return
        fi

        LINE=$(grep "frame=" file.txt | tail -1)
        frame=$(echo "$LINE" | sed -n 's/.*frame=\s*\([0-9]*\).*/\1/p')
        fps=$(echo "$LINE" | sed -n 's/.*fps=\s*\([0-9.]*\).*/\1/p')

        echo "DEBUG: frame=$frame fps=$fps"

        # If logs do NOT contain fps/frame → treat as healthy
        if [ -z "$frame" ] || [ -z "$fps" ]; then
            echo "No frame/fps found → treating as healthy → exiting check."
            break
        fi

        # Real data → healthy
        if [ "$frame" != "0" ] || [ "$fps" != "0.0" ]; then
            echo "Stream healthy → exiting check."
            break
        fi

        # Frozen (frame=0 & fps=0.0)
        if [ $(( $(date +%s) - dead_start )) -ge 10 ]; then
            echo "Frozen for 10s → restart encode mode."
            restart=true
            break
        fi
    done

    # -------------------------------
    # RESTART IF NEEDED
    # -------------------------------
    if [ "$restart" = true ]; then
        fallback_mode=true
        stop_pid "$FFPID" "FFmpeg"
        stop_pid "$RSPID" "RStreamer"
        rm -f "$FIFO" "$STREAM_PID_PATH" "$RS_PID_PATH"

        echo "Restarting in ENCODE mode..."
        preset_hls_drm
        return
    fi

    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_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_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 -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 -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 -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=1500ms
[probe] eth2 (192.168.82.2): trying, timeout=1500ms...
[probe] eth2 (192.168.82.2): poll_result=0 got_n=-1 first_byte=0x00 match=no elapsed=1502ms
[probe] eth3 (192.168.83.2): trying, timeout=1500ms...
[probe] eth3 (192.168.83.2): poll_result=1 got_n=1316 first_byte=0x47 match=YES elapsed=1ms
[probe] FINAL: matched (see iface above)
[index] joined 234.12.12.9:6666 iface=192.168.83.2  mode=in-process
[NIC:auto] watching 1 channels
[index] first dgram len=1316
[index] plain TS
[pmt] audio pid=0x02AF type=0x06 -> 0x0F (AAC) (descriptors stripped)
[index] audio_transcode: track1 src_pid=0x02AF codec=AC3->AAC bitrate=128000 coder=fast
[audxc] AC3->AAC 48kHz stereo (downmixed if needed) 128kbps ready
[index] audio_transcode: track2 src_pid=0x02B0 codec=AC3->AAC bitrate=128000 coder=fast
[audxc] AC3->AAC 48kHz stereo (downmixed if needed) 128kbps ready
[index] audio_transcode: track3 src_pid=0x05F1 codec=MP2->AAC bitrate=128000 coder=fast
[audxc] MP2->AAC 48kHz stereo 128kbps ready
[vidxc] decoder: h264 fps=0/0 crf=23
[index] video_transcode: 0x1B crf=23 fps=0/0
[audxc] AC3 source: 6 ch, 48000Hz -> downmixing to stereo 48kHz
[audxc] AC3 source: 6 ch, 48000Hz -> downmixing to stereo 48kHz
[index] audxc track3: first AAC output: 376 bytes (2 TS pkts)
[index] audxc track1: first AAC output: 752 bytes (4 TS pkts)
[index] audxc track2: first AAC output: 752 bytes (4 TS pkts)
[vidxc] I-slice found — decoder flushed and ready
[vidxc] first send_packet OK len=63172
[index] video_transcode: fps probe raw deltas (ticks): 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 1800 5400 5400 12600 16200 19800
[index] video_transcode: auto-detected fps=25/1 (25.000 fps, gcd=1800 ticks of 16 samples, mbs_only=0, extra_pkts=0)
[vidxc] frame1 decoded 1920x1080
[vidxc] encoder: libx264 1920x1080 25.00fps  bitrate=0kbps
[vidxc] frame2 decoded 1920x1080
[vidxc] frame3 decoded 1920x1080
[vidxc] first IDR — segment opened, streaming starts

[22:22:46] ── stats ──────────────────────────────────
  [22:22:41][index] PAT pmt_pid=0x0472
  [22:22:41][index] PMT vid=0x0111 aud=0x02AF pcr=0x0111
  [22:22:41][index] CLEAN START vid=0x0111
  [22:22:43][index] opened  index0.ts
  [22:22:45][index] closed  index0.ts  1.934s  7710kbps
  [22:22:45][index] opened  index1.ts
  [index         ] OK  segs=1      2572.3pkt/s   3868.7kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=1 pkts=25724  stalled=0 nosignal=0 / 1
[22:22:46] ──────────────────────────────────────────


[22:22:56] ── stats ──────────────────────────────────
  [22:22:47][index] closed  index1.ts  2.094s  4257kbps
  [22:22:47][index] opened  index2.ts
  [22:22:49][index] closed  index2.ts  1.974s  6195kbps
  [22:22:49][index] opened  index3.ts
  [22:22:51][index] closed  index3.ts  2.011s  6004kbps
  [22:22:51][index] opened  index4.ts
  [22:22:53][index] closed  index4.ts  1.947s  6868kbps
  [22:22:53][index] opened  index5.ts
  [22:22:55][index] closed  index5.ts  2.090s  8157kbps
  [22:22:55][index] opened  index6.ts
  [index         ] OK  segs=6      4691.2pkt/s   7055.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=6 pkts=72641  stalled=0 nosignal=0 / 1
[22:22:56] ──────────────────────────────────────────


[22:23:06] ── stats ──────────────────────────────────
  [22:22:57][index] closed  index6.ts  2.007s  8546kbps
  [22:22:57][index] opened  index7.ts
  [22:22:59][index] closed  index7.ts  1.990s  8991kbps
  [22:22:59][index] opened  index8.ts
  [22:23:01][index] closed  index8.ts  1.955s  9199kbps
  [22:23:01][index] opened  index9.ts
  [22:23:03][index] closed  index9.ts  1.990s  8047kbps
  [22:23:03][index] opened  index10.ts
  [22:23:05][index] closed  index10.ts  2.074s  7301kbps
  [22:23:05][index] opened  index11.ts
  [index         ] OK  segs=11     4698.0pkt/s   7065.7kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=11 pkts=119625  stalled=0 nosignal=0 / 1
[22:23:06] ──────────────────────────────────────────


[22:23:16] ── stats ──────────────────────────────────
  [22:23:06][index] closed  index11.ts  1.807s  8668kbps
  [22:23:06][index] opened  index12.ts
  [22:23:09][index] closed  index12.ts  2.190s  9283kbps
  [22:23:09][index] opened  index13.ts
  [22:23:11][index] closed  index13.ts  1.988s  10265kbps
  [22:23:11][index] opened  index14.ts
  [22:23:13][index] closed  index14.ts  1.916s  8386kbps
  [22:23:13][index] opened  index15.ts
  [22:23:15][index] closed  index15.ts  1.961s  7434kbps
  [22:23:15][index] opened  index16.ts
  [index         ] OK  segs=16     4690.5pkt/s   7054.5kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=16 pkts=166534  stalled=0 nosignal=0 / 1
[22:23:16] ──────────────────────────────────────────


[22:23:26] ── stats ──────────────────────────────────
  [22:23:17][index] closed  index16.ts  2.204s  3995kbps
  [22:23:17][index] opened  index17.ts
  [22:23:19][index] closed  index17.ts  1.879s  6355kbps
  [22:23:19][index] opened  index18.ts
  [22:23:21][index] closed  index18.ts  1.960s  7301kbps
  [22:23:21][index] opened  index19.ts
  [22:23:23][index] closed  index19.ts  1.960s  6878kbps
  [22:23:23][index] opened  index20.ts
  [22:23:25][index] closed  index20.ts  2.107s  5529kbps
  [22:23:25][index] opened  index21.ts
  [index         ] OK  segs=21     4686.1pkt/s   7047.9kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=21 pkts=213399  stalled=0 nosignal=0 / 1
[22:23:26] ──────────────────────────────────────────


[22:23:36] ── stats ──────────────────────────────────
  [22:23:27][index] closed  index21.ts  1.993s  8747kbps
  [22:23:27][index] opened  index22.ts
  [22:23:29][index] closed  index22.ts  1.903s  9746kbps
  [22:23:29][index] opened  index23.ts
  [22:23:30][index] closed  index23.ts  1.959s  11009kbps
  [22:23:30][index] opened  index24.ts
  [22:23:33][index] closed  index24.ts  2.139s  8817kbps
  [22:23:33][index] opened  index25.ts
  [22:23:35][index] closed  index25.ts  2.029s  8381kbps
  [22:23:35][index] opened  index26.ts
  [index         ] OK  segs=26     4698.9pkt/s   7067.2kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=26 pkts=260393  stalled=0 nosignal=0 / 1
[22:23:36] ──────────────────────────────────────────


[22:23:46] ── stats ──────────────────────────────────
  [22:23:37][index] closed  index26.ts  1.998s  7509kbps
  [22:23:37][index] opened  index27.ts
  [22:23:39][index] closed  index27.ts  1.873s  9173kbps
  [22:23:39][index] opened  index28.ts
  [22:23:40][index] closed  index28.ts  1.947s  8752kbps
  [22:23:40][index] opened  index29.ts
  [22:23:43][index] closed  index29.ts  2.074s  9493kbps
  [22:23:43][index] opened  index30.ts
  [22:23:45][index] closed  index30.ts  2.048s  8862kbps
  [22:23:45][index] opened  index31.ts
  [index         ] OK  segs=31     4689.4pkt/s   7052.9kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=31 pkts=307292  stalled=0 nosignal=0 / 1
[22:23:46] ──────────────────────────────────────────


[22:23:56] ── stats ──────────────────────────────────
  [22:23:47][index] closed  index31.ts  2.001s  7201kbps
  [22:23:47][index] opened  index32.ts
  [22:23:49][index] closed  index32.ts  2.037s  7681kbps
  [22:23:49][index] opened  index33.ts
  [22:23:51][index] closed  index33.ts  1.926s  10818kbps
  [22:23:51][index] opened  index34.ts
  [22:23:53][index] closed  index34.ts  1.956s  11705kbps
  [22:23:53][index] opened  index35.ts
  [22:23:55][index] closed  index35.ts  2.094s  6606kbps
  [22:23:55][index] opened  index36.ts
  [index         ] OK  segs=36     4693.4pkt/s   7058.8kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=36 pkts=354230  stalled=0 nosignal=0 / 1
[22:23:56] ──────────────────────────────────────────


[22:24:06] ── stats ──────────────────────────────────
  [22:23:57][index] closed  index36.ts  1.967s  6367kbps
  [22:23:57][index] opened  index37.ts
  [22:23:59][index] closed  index37.ts  2.067s  7364kbps
  [22:23:59][index] opened  index38.ts
  [22:24:01][index] closed  index38.ts  1.922s  13555kbps
  [22:24:01][index] opened  index39.ts
  [22:24:03][index] closed  index39.ts  1.949s  9335kbps
  [22:24:03][index] opened  index40.ts
  [22:24:05][index] closed  index40.ts  2.127s  7295kbps
  [22:24:05][index] opened  index41.ts
  [index         ] OK  segs=41     4679.3pkt/s   7037.7kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=41 pkts=401028  stalled=0 nosignal=0 / 1
[22:24:06] ──────────────────────────────────────────


[22:24:16] ── stats ──────────────────────────────────
  [22:24:07][index] closed  index41.ts  2.037s  8831kbps
  [22:24:07][index] opened  index42.ts
  [22:24:09][index] closed  index42.ts  1.871s  14431kbps
  [22:24:09][index] opened  index43.ts
  [22:24:11][index] closed  index43.ts  2.038s  8767kbps
  [22:24:11][index] opened  index44.ts
  [22:24:13][index] closed  index44.ts  1.940s  7792kbps
  [22:24:13][index] opened  index45.ts
  [22:24:15][index] closed  index45.ts  2.078s  6886kbps
  [22:24:15][index] opened  index46.ts
  [index         ] OK  segs=46     4705.1pkt/s   7076.4kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=46 pkts=448083  stalled=0 nosignal=0 / 1
[22:24:16] ──────────────────────────────────────────


[22:24:26] ── stats ──────────────────────────────────
  [22:24:17][index] closed  index46.ts  2.018s  6488kbps
  [22:24:17][index] opened  index47.ts
  [22:24:19][index] closed  index47.ts  2.049s  7599kbps
  [22:24:19][index] opened  index48.ts
  [22:24:21][index] closed  index48.ts  1.931s  8162kbps
  [22:24:21][index] opened  index49.ts
  [22:24:23][index] closed  index49.ts  2.022s  8170kbps
  [22:24:23][index] opened  index50.ts
  [22:24:25][index] closed  index50.ts  1.986s  7113kbps
  [22:24:25][index] opened  index51.ts
  [index         ] OK  segs=51     4689.2pkt/s   7052.6kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=51 pkts=494979  stalled=0 nosignal=0 / 1
[22:24:26] ──────────────────────────────────────────


[22:24:36] ── stats ──────────────────────────────────
  [22:24:27][index] closed  index51.ts  1.968s  5261kbps
  [22:24:27][index] opened  index52.ts
  [22:24:29][index] closed  index52.ts  2.103s  6910kbps
  [22:24:29][index] opened  index53.ts
  [22:24:31][index] closed  index53.ts  1.901s  9163kbps
  [22:24:31][index] opened  index54.ts
  [22:24:33][index] closed  index54.ts  1.975s  10163kbps
  [22:24:33][index] opened  index55.ts
  [22:24:35][index] closed  index55.ts  1.987s  9173kbps
  [22:24:35][index] opened  index56.ts
  [index         ] OK  segs=56     4691.7pkt/s   7056.3kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=56 pkts=541901  stalled=0 nosignal=0 / 1
[22:24:36] ──────────────────────────────────────────


[22:24:46] ── stats ──────────────────────────────────
  [22:24:37][index] closed  index56.ts  2.089s  7739kbps
  [22:24:37][index] opened  index57.ts
  [22:24:39][index] closed  index57.ts  2.060s  7290kbps
  [22:24:39][index] opened  index58.ts
  [22:24:41][index] closed  index58.ts  1.884s  8172kbps
  [22:24:41][index] opened  index59.ts
  [22:24:43][index] closed  index59.ts  2.007s  8383kbps
  [22:24:43][index] opened  index60.ts
  [22:24:45][index] closed  index60.ts  2.100s  7664kbps
  [22:24:45][index] opened  index61.ts
  [index         ] OK  segs=61     4687.2pkt/s   7049.5kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=61 pkts=588777  stalled=0 nosignal=0 / 1
[22:24:46] ──────────────────────────────────────────


[22:24:56] ── stats ──────────────────────────────────
  [22:24:47][index] closed  index61.ts  1.898s  13807kbps
  [22:24:47][index] opened  index62.ts
  [22:24:49][index] closed  index62.ts  2.045s  7848kbps
  [22:24:49][index] opened  index63.ts
  [22:24:51][index] closed  index63.ts  1.985s  7800kbps
  [22:24:51][index] opened  index64.ts
  [22:24:53][index] closed  index64.ts  1.989s  8995kbps
  [22:24:53][index] opened  index65.ts
  [22:24:55][index] closed  index65.ts  1.963s  10402kbps
  [22:24:55][index] opened  index66.ts
  [index         ] OK  segs=66     4699.6pkt/s   7068.2kbps  idle= 0.0s  cc_new=0    cc_tot=0      mode=in-process
  ── total: segs=66 pkts=635777  stalled=0 nosignal=0 / 1
[22:24:56] ──────────────────────────────────────────

