From: softworkz <ffmpegagent-at-gmail.com@ffmpeg.org> To: ffmpeg-devel@ffmpeg.org Cc: softworkz <softworkz@hotmail.com> Subject: [FFmpeg-devel] [PATCH 1/3] tools/ffmpeg-sg: Add show-graph wrapper script for Linux Date: Mon, 09 Jun 2025 19:23:46 +0000 Message-ID: <6f370ed59c04005e5b12d41bfa6efd153e0c829e.1749497028.git.ffmpegagent@gmail.com> (raw) In-Reply-To: <pull.95.ffstaging.FFmpeg.1749497028.ffmpegagent@gmail.com> From: softworkz <softworkz@hotmail.com> Signed-off-by: softworkz <softworkz@hotmail.com> --- tools/ffmpeg-sg | 249 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100755 tools/ffmpeg-sg diff --git a/tools/ffmpeg-sg b/tools/ffmpeg-sg new file mode 100755 index 0000000000..c8c298f8e0 --- /dev/null +++ b/tools/ffmpeg-sg @@ -0,0 +1,249 @@ +#!/bin/bash +# +# ffmpeg-sg - FFmpeg Show-Graph Wrapper (aka killer feature) +# Show the FFmpeg execution graph in default browser +# +# Copyright (c) 2025 softworkz +# +# This file is part of FFmpeg. +# +# FFmpeg is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# FFmpeg is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with FFmpeg; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# + +set -euo pipefail + +# Check for privilege level +check_privileges() { + # Check if running as root (UID 0) + if [ "$(id -u)" -eq 0 ]; then + echo "Error: This script should not be run as root for security reasons." >&2 + echo "Media processing and browser launching do not require root privileges." >&2 + exit 1 + fi + + # Check if running as sudo + if [ -n "${SUDO_USER:-}" ] || [ -n "${SUDO_UID:-}" ]; then + echo "Error: This script should not be run with sudo for security reasons." >&2 + echo "Please run as a regular user: ./ffmpeg-sg [options]" >&2 + exit 1 + fi + + # Check other privilege indicators + if [ -n "${PKEXEC_UID:-}" ]; then + echo "Error: This script should not be run with elevated privileges (pkexec)." >&2 + exit 1 + fi +} + +# Validate path chars +validate_path() { + local path="$1" + case "$path" in + *[!ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/_.-]*) + echo "Error: Invalid characters in path: $path" >&2 + return 1 + ;; + esac + return 0 +} + +# Get secure temp folder +get_temp_dir() { + local uid=$(id -u) + local temp_bases=("/tmp" "/var/tmp") + + for base in "${temp_bases[@]}"; do + local temp_dir="$base/ffmpeg-$uid" + + if ! validate_path "$temp_dir"; then + continue + fi + + # Verify perms and owner + if [ -d "$temp_dir" ]; then + local perms=$(stat -c %a "$temp_dir" 2>/dev/null || echo "") + if [ "$perms" != "700" ]; then + echo "Error: Temp directory exists with unsafe permissions ($perms). Expected 700." >&2 + exit 1 + fi + + local owner=$(stat -c %u "$temp_dir" 2>/dev/null || echo "") + if [ "$owner" != "$uid" ]; then + echo "Error: Temp directory not owned by current user." >&2 + exit 1 + fi + else + # Create folder + if ! mkdir -m 700 "$temp_dir" 2>/dev/null; then + continue + fi + fi + + echo "$temp_dir" + return 0 + done + + echo "Error: Unable to determine temp directory." >&2 + exit 1 +} + +# Create HTML filename and pre-create file +create_unique_html_file() { + local temp_dir="$1" + local base_timestamp=$(date '+%Y-%m-%d_%H-%M-%S') + local base_milliseconds=$(date '+%3N') + + local filename="ffmpeg_graph_${base_timestamp}_${base_milliseconds}.html" + local full_path="$temp_dir/$filename" + + if ! validate_path "$full_path"; then + echo "Error: Generated invalid file path." >&2 + exit 1 + fi + + if (set -C; echo "<!-- FFmpeg Graph Placeholder -->" > "$full_path") 2>/dev/null; then + echo "$full_path" + return 0 + fi + + echo "Error: Could not create unique HTML file." >&2 + exit 1 +} + +# Check for xdg-open +check_xdg_open() { + # Accept only standard system locations - no PATH lookup + local xdg_locations=("/usr/bin/xdg-open" "/bin/xdg-open" "/usr/local/bin/xdg-open") + + for location in "${xdg_locations[@]}"; do + if [ -x "$location" ]; then + echo "$location" + return 0 + fi + done + + echo "Error: xdg-open not found in standard system locations." >&2 + echo "Checked: ${xdg_locations[*]}" >&2 + return 1 +} + +# Launch browser +open_html_in_browser() { + local html_path="$1" + + if [ ! -f "$html_path" ]; then + echo "Warning: HTML file not found: $html_path" >&2 + return 1 + fi + + # Validate again + if ! validate_path "$html_path"; then + echo "Error: Invalid file path for browser: $html_path" >&2 + return 1 + fi + + local xdg_open_path + xdg_open_path=$(check_xdg_open) + if [ $? -ne 0 ]; then + return 1 + fi + + # Launch browser + "$xdg_open_path" "$html_path" </dev/null >/dev/null 2>&1 & + + if [ $? -eq 0 ]; then + echo "Execution graph opened in browser: $html_path" >&2 + return 0 + else + echo "Warning: Could not open '$html_path' in a browser." >&2 + return 1 + fi +} + +# Check for conflicting parameters +check_conflicting_params() { + local args=("$@") + + for arg in "${args[@]}"; do + case "$arg" in + -print_graphs_file) + echo "Error: -print_graphs_file parameter already provided. This script manages graph file generation automatically." >&2 + exit 1 + ;; + -print_graphs_format) + echo "Error: -print_graphs_format parameter already provided. This script uses mermaidhtml format automatically." >&2 + exit 1 + ;; + esac + done +} + +# Cleanup temp file on signal +cleanup_on_signal() { + local html_file="$1" + if [ -f "$html_file" ]; then + rm -f "$html_file" 2>/dev/null || true + fi + exit 130 # 128 + SIGINT +} + +main() { + check_privileges + + # Check if ffmpeg exists in current dir + if [ ! -x "./ffmpeg" ]; then + echo "Error: ./ffmpeg not found or not executable in current directory." >&2 + exit 1 + fi + + # Check params + check_conflicting_params "$@" + + local temp_dir + temp_dir=$(get_temp_dir) + + local html_file + html_file=$(create_unique_html_file "$temp_dir") + + trap "cleanup_on_signal '$html_file'" INT TERM + + # Set umask for file creation + umask 077 + + # Execute ffmpeg with graph printing options and all passed arguments + local ffmpeg_exit_code=0 + ./ffmpeg -print_graphs_file "$html_file" -print_graphs_format mermaidhtml "$@" || ffmpeg_exit_code=$? + + trap - INT TERM + + # Open browser + if [ -f "$html_file" ]; then + local file_size=$(stat -c%s "$html_file" 2>/dev/null || echo 0) + local placeholder_size=34 + + if [ "$file_size" -gt "$placeholder_size" ]; then + open_html_in_browser "$html_file" + else + echo "Warning: FFmpeg completed but no graph data was written." >&2 + fi + else + echo "Warning: FFmpeg completed but no graph file was found." >&2 + fi + + # Exit with ffmpeg exit code + exit $ffmpeg_exit_code +} + +main "$@" -- ffmpeg-codebot _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2025-06-09 19:24 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-06-09 19:23 [FFmpeg-devel] [PATCH 0/3] tools/ffmpeg-sg: Add show-graph wrapper scripts (aka killer feature) ffmpegagent 2025-06-09 19:23 ` softworkz [this message] 2025-06-09 19:23 ` [FFmpeg-devel] [PATCH 2/3] tools/ffmpeg-sg: Add show-graph wrapper script for Windows softworkz 2025-06-09 19:23 ` [FFmpeg-devel] [PATCH 3/3] tools/ffmpeg-sg: Include show-graph wrapper script in build output softworkz 2025-06-11 19:18 ` Marton Balint 2025-06-11 20:58 ` softworkz . 2025-06-11 21:14 ` Kieran Kunhya via ffmpeg-devel [not found] ` <CABGuwEm72Ynf=anVta4rj0pOPThHeM0aweAbYVTBuvLsQSbJ4Q@mail.gmail.com> 2025-06-11 21:39 ` softworkz . 2025-06-11 22:04 ` softworkz . 2025-06-12 7:40 ` Nicolas George 2025-06-12 18:42 ` softworkz . 2025-06-12 19:06 ` Nicolas George 2025-06-12 19:20 ` softworkz . 2025-06-09 22:49 ` [FFmpeg-devel] [PATCH 0/3] tools/ffmpeg-sg: Add show-graph wrapper scripts (aka killer feature) Kieran Kunhya via ffmpeg-devel 2025-06-11 14:42 ` Nicolas George [not found] ` <CABGuwEnDSAKEEP6e5yUzeXM_bp5EKV2bPHaL8+wM+Pbmm5KBPQ@mail.gmail.com> 2025-06-10 13:31 ` softworkz . 2025-06-10 15:28 ` softworkz .
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=6f370ed59c04005e5b12d41bfa6efd153e0c829e.1749497028.git.ffmpegagent@gmail.com \ --to=ffmpegagent-at-gmail.com@ffmpeg.org \ --cc=ffmpeg-devel@ffmpeg.org \ --cc=softworkz@hotmail.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git