#!/usr/bin/env bash # Shared bootstrap: ROOT, env defaults, encoding presets, pipe helpers. set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" export ROOT # shellcheck disable=SC1091 source "${ROOT}/lib/logging.sh" # shellcheck disable=SC1091 source "${ROOT}/lib/env.sh" apply_encoding_preset() { case "${OUTPUT_PRESET}" in 720p) WIDTH=1280 HEIGHT=720 FASTNESS=veryfast BV=2500k BUFSIZE=5000k ;; 1080p|*) WIDTH=1920 HEIGHT=1080 FASTNESS=faster BV=5000k BUFSIZE=10000k ;; esac export WIDTH HEIGHT FASTNESS BV BUFSIZE RES="${WIDTH}x${HEIGHT}" PROFILE=high KEYFRAMES_INTL="${FPS}" GOP_INTL=$((KEYFRAMES_INTL * 2)) PIX_FMT="-pix_fmt yuv420p" PRESET="-preset ${FASTNESS} -tune zerolatency -profile:v ${PROFILE} ${PIX_FMT} -x264-params keyint=${KEYFRAMES_INTL}:min-keyint=${KEYFRAMES_INTL} -g ${GOP_INTL} -flags +global_header" BITRATE="-b:v ${BV} -maxrate ${BV} -minrate ${BV}" VCODEC="-c:v libx264" ACODEC="-c:a aac -b:a 128k" export RES PROFILE PRESET BITRATE VCODEC ACODEC } apply_encoding_preset FFMPEG_TS_FLAGS=( -fflags +genpts+igndts -avoid_negative_ts make_zero -sn -movflags +faststart ) read_rate_flag() { if [[ "${NEAR_REALTIME}" == "1" ]]; then RE_FLAG=(-re) else RE_FLAG=() fi } ensure_storage() { mkdir -p "${STORAGE_DIR}" "${RUN_DIR}" } ensure_pipe() { if [[ ! -p "${PIPE_PATH}" ]]; then mkfifo "${PIPE_PATH}" if command -v perl >/dev/null 2>&1; then perl -MFcntl -e 'fcntl(STDIN, 1031, shift) or die $!' "${PIPE_FIFO_SIZE}" <> "${PIPE_PATH}" || true fi fi exec 7<> "${PIPE_PATH}" } remove_pipe() { exec 7>&- 7<&- 2>/dev/null || true rm -f "${PIPE_PATH}" 2>/dev/null || true } next_record_path() { local counter=0 name ensure_storage while true; do name="$(printf "video%04d.%s" "${counter}" "${RECORD_FORMAT}")" if [[ ! -f "${STORAGE_DIR}/${name}" ]]; then echo "${STORAGE_DIR}/${name}" return fi counter=$((counter + 1)) done } require_cmd() { command -v "$1" >/dev/null 2>&1 || die "required command not found: $1" } require_logo() { [[ -f "${LOGO_PATH}" ]] || die "logo not found at ${LOGO_PATH} (expected ${ROOT}/assets/pirate_drift.png)" }