diff --git a/Compare-Videos.ps1 b/Compare-Videos.ps1 index b146b90..102398c 100644 --- a/Compare-Videos.ps1 +++ b/Compare-Videos.ps1 @@ -53,6 +53,14 @@ .PARAMETER In4K Generate comparison video in 4K UHD (3840x2160) resolution instead of 1K HD (1920x1080). +.PARAMETER Clip + Reduces the output height to match the actual scaled height of the sources, removing + the top/bottom black letterbox padding. Only applies when exactly 2 source videos are + provided; ignored otherwise. + + Example: two 1280x720 (16:9) sources rendered at 1K HD become 1920x540 instead of + 1920x1080. The same pair rendered with -In4K becomes 3840x1080 instead of 3840x2160. + .EXAMPLE .\Compare-Videos.ps1 -S1 original.mp4 -S2 enhanced.mp4 -Output comparison.mp4 @@ -77,6 +85,11 @@ .\Compare-Videos.ps1 -S1 original.mp4 -S2 enhanced.mp4 -Output comparison_4k.mp4 -In4K Compare two videos in 4K UHD (3840x2160) resolution. + +.EXAMPLE + .\Compare-Videos.ps1 -S1 a_720p.mp4 -S2 b_720p.mp4 -Output side-by-side.mp4 -Clip + + Compare two 720p (1280x720) videos with no top/bottom letterboxing: output is 1920x540. #> [CmdletBinding(SupportsShouldProcess)] param( @@ -97,7 +110,9 @@ param( [switch]$NoAudio, - [switch]$In4K + [switch]$In4K, + + [switch]$Clip ) $ErrorActionPreference = "Stop" @@ -132,6 +147,11 @@ $videoCount = 2 if ($S4) { $videoCount = 4 } elseif ($S3) { $videoCount = 3 } +if ($Clip -and $videoCount -ne 2) { + Write-Warning "-Clip is only supported with exactly 2 source videos; ignoring." + $Clip = $false +} + # --- Detect orientation of S1 --- Write-Host "Detecting orientation of S1..." -ForegroundColor Cyan @@ -165,6 +185,42 @@ if ($isPortrait) { Write-Host "Landscape mode detected (${width}x${height}) - Output: $resolutionLabel" -ForegroundColor Green } +# --- Clip mode: shrink output height to the actual scaled height of the sources --- +if ($Clip) { + Write-Host "Probing S2 dimensions for -Clip..." -ForegroundColor Cyan + $probeOutput2 = & ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 $S2 2>&1 + if ($LASTEXITCODE -ne 0) { + Write-Error "Failed to probe video dimensions for S2: $probeOutput2" + exit 1 + } + $dim2 = $probeOutput2 -split ',' + $w2 = [int]$dim2[0] + $h2 = [int]$dim2[1] + + # Per-source cell width matches the 2-video branches below. + if ($isPortrait) { + $clipCellWidth = [int]($outputWidth * 0.6333 / 2) + } else { + $clipCellWidth = [int]($outputWidth / 2) + } + + # Height each source would naturally scale to inside its cell when fitted by width + # (force_original_aspect_ratio=decrease). Take the larger of the two so neither + # source loses content; cap at the original output height. + $h1Scaled = [int][Math]::Floor($clipCellWidth * $height / $width) + $h2Scaled = [int][Math]::Floor($clipCellWidth * $h2 / $w2) + $clippedHeight = [Math]::Max($h1Scaled, $h2Scaled) + if ($clippedHeight % 2) { $clippedHeight++ } # libx264/yuv420p requires even dimensions + if ($clippedHeight -gt $outputHeight) { $clippedHeight = $outputHeight } + + if ($clippedHeight -lt $outputHeight) { + Write-Host ("Clip mode: output height reduced from {0} to {1} ({2}x{1})" -f $outputHeight, $clippedHeight, $outputWidth) -ForegroundColor Yellow + $outputHeight = $clippedHeight + } else { + Write-Host "Clip mode: sources already fill the full output height; no clipping applied." -ForegroundColor Yellow + } +} + $filterComplex = "" $inputArgs = @("-i", $S1, "-i", $S2)