Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
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".

  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