Skip to content

Commit 024813f

Browse files
committed
QC Fixes
1 parent de292b8 commit 024813f

11 files changed

+5313
-8
lines changed

internal/ffmpeg/afd_analyzer_optimized.go

Lines changed: 719 additions & 0 deletions
Large diffs are not rendered by default.

internal/ffmpeg/dead_pixel_analyzer_optimized.go

Lines changed: 517 additions & 0 deletions
Large diffs are not rendered by default.

internal/ffmpeg/ffprobe.go

Lines changed: 102 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,18 @@ import (
1515
"github.com/rs/zerolog"
1616
)
1717

18-
// executeFFprobeCommand executes an ffprobe command and returns the output
18+
// executeFFprobeCommand executes an ffprobe command and returns the output.
19+
// This is a low-level utility function that wraps exec.CommandContext for FFprobe operations.
20+
//
21+
// Parameters:
22+
// - ctx: Context for cancellation and timeout control
23+
// - cmd: Command slice where first element is the binary and rest are arguments
24+
//
25+
// Returns:
26+
// - string: Combined stdout/stderr output from the command
27+
// - error: Error if command fails or context is cancelled
28+
//
29+
// The function ensures proper context handling and error reporting for all FFprobe calls.
1930
func executeFFprobeCommand(ctx context.Context, cmd []string) (string, error) {
2031
if len(cmd) == 0 {
2132
return "", fmt.Errorf("empty command")
@@ -30,7 +41,19 @@ func executeFFprobeCommand(ctx context.Context, cmd []string) (string, error) {
3041
return string(output), nil
3142
}
3243

33-
// FFprobe represents the ffprobe service
44+
// FFprobe represents the ffprobe service with enhanced video analysis capabilities.
45+
// This is the main service class that provides comprehensive video/audio analysis
46+
// through FFprobe integration with professional QC features.
47+
//
48+
// Key capabilities:
49+
// - Standard FFprobe analysis (format, streams, metadata)
50+
// - Enhanced QC analysis (20+ professional categories)
51+
// - Content-based analysis using FFmpeg filters
52+
// - LLM-powered intelligent analysis and reporting
53+
// - Broadcast-standard compliance checking
54+
//
55+
// The service supports configurable timeouts, output limits, and analysis modes
56+
// for both development and production environments.
3457
type FFprobe struct {
3558
binaryPath string
3659
logger zerolog.Logger
@@ -40,7 +63,23 @@ type FFprobe struct {
4063
enableContentAnalysis bool
4164
}
4265

43-
// NewFFprobe creates a new FFprobe instance with binary validation
66+
// NewFFprobe creates a new FFprobe instance with default configuration.
67+
// This constructor initializes the FFprobe service with sensible defaults for production use.
68+
//
69+
// Parameters:
70+
// - binaryPath: Path to the ffprobe binary. If empty, "ffprobe" is used (searches PATH)
71+
// - logger: Structured logger for operation tracking and debugging
72+
//
73+
// Returns:
74+
// - *FFprobe: Configured FFprobe instance ready for use
75+
//
76+
// Default configuration:
77+
// - Timeout: 5 minutes (suitable for large video files)
78+
// - Max output: 100MB (prevents memory exhaustion)
79+
// - Enhanced analysis: Enabled with all QC categories
80+
// - Content analysis: Disabled by default (enable explicitly for performance)
81+
//
82+
// The instance should be validated with ValidateBinaryAtStartup() before use.
4483
func NewFFprobe(binaryPath string, logger zerolog.Logger) *FFprobe {
4584
if binaryPath == "" {
4685
binaryPath = "ffprobe"
@@ -58,8 +97,24 @@ func NewFFprobe(binaryPath string, logger zerolog.Logger) *FFprobe {
5897
return ffprobe
5998
}
6099

61-
// ValidateBinaryAtStartup validates FFprobe binary is available and executable
62-
// This should be called during application initialization
100+
// ValidateBinaryAtStartup validates that the FFprobe binary is available and executable.
101+
// This critical validation should be called during application initialization to ensure
102+
// the service can function properly before accepting requests.
103+
//
104+
// Validation steps:
105+
// 1. Checks if binary exists at specified path or in PATH
106+
// 2. Verifies binary is executable with proper permissions
107+
// 3. Tests binary functionality by retrieving version information
108+
// 4. Logs successful validation with version details
109+
//
110+
// Parameters:
111+
// - ctx: Context for timeout control (recommended: 30 second timeout)
112+
//
113+
// Returns:
114+
// - error: Detailed error if validation fails, nil if successful
115+
//
116+
// This function should be called once at startup. Failure indicates
117+
// FFmpeg is not properly installed or configured.
63118
func (f *FFprobe) ValidateBinaryAtStartup(ctx context.Context) error {
64119
// First, try to resolve the binary path
65120
if f.binaryPath != "ffprobe" {
@@ -91,17 +146,56 @@ func (f *FFprobe) ValidateBinaryAtStartup(ctx context.Context) error {
91146
return nil
92147
}
93148

94-
// SetDefaultTimeout sets the default timeout for ffprobe operations
149+
// SetDefaultTimeout configures the default timeout for all FFprobe operations.
150+
// This timeout applies when no specific timeout is provided in the options.
151+
//
152+
// Parameters:
153+
// - timeout: Duration for FFprobe command execution (recommended: 5+ minutes for large files)
154+
//
155+
// Recommended timeouts by use case:
156+
// - Small files (<100MB): 1-2 minutes
157+
// - Standard files (<1GB): 5 minutes
158+
// - Large files (>1GB): 10+ minutes
159+
// - Broadcast files: 15+ minutes
160+
//
161+
// The timeout prevents hanging processes and ensures responsive service behavior.
95162
func (f *FFprobe) SetDefaultTimeout(timeout time.Duration) {
96163
f.defaultTimeout = timeout
97164
}
98165

99-
// SetMaxOutputSize sets the maximum output size limit
166+
// SetMaxOutputSize configures the maximum allowed output size from FFprobe commands.
167+
// This prevents memory exhaustion from extremely verbose output or malformed files.
168+
//
169+
// Parameters:
170+
// - size: Maximum output size in bytes (recommended: 100MB for production)
171+
//
172+
// Recommended limits by environment:
173+
// - Development: 50MB (fast feedback)
174+
// - Production: 100MB (handles complex files)
175+
// - Enterprise: 200MB+ (broadcast/professional content)
176+
//
177+
// Commands exceeding this limit will be terminated to protect system resources.
100178
func (f *FFprobe) SetMaxOutputSize(size int64) {
101179
f.maxOutputSize = size
102180
}
103181

104-
// EnableContentAnalysis enables content-based analysis using FFmpeg filters
182+
// EnableContentAnalysis enables advanced content-based analysis using FFmpeg filters.
183+
// This feature provides deep video content analysis but significantly increases processing time.
184+
//
185+
// Content analysis capabilities:
186+
// - Scene change detection and classification
187+
// - Motion vector analysis and complexity measurement
188+
// - Visual pattern recognition and analysis
189+
// - Content-aware quality assessment
190+
// - Advanced temporal analysis
191+
//
192+
// Performance impact:
193+
// - Processing time: 3-10x longer than standard analysis
194+
// - Memory usage: 2-5x higher memory consumption
195+
// - CPU intensive: Requires significant computational resources
196+
//
197+
// Recommended for: Quality assessment workflows, content research, detailed analysis.
198+
// Not recommended for: Real-time processing, high-throughput scenarios.
105199
func (f *FFprobe) EnableContentAnalysis() {
106200
f.enableContentAnalysis = true
107201
// Replace with content-enabled analyzer

0 commit comments

Comments
 (0)