@@ -29,6 +29,9 @@ Fit/Output:
2929 stretch: force 1080x1920 (distorts)
3030 cropfill: crop to fill 9:16 using centered math, then scale (no safety clamp)
3131
32+ Safety margin:
33+ --safe-left N Left black margin in final 1080x1920 output (px). Default: 30. Use 0 to disable.
34+
3235Encoding:
3336 --fps N Output fps (default: 25)
3437 --speed auto|X.Y Speed-up factor (default: auto = max(1.0, dur/59))
@@ -57,6 +60,7 @@ PRESET="veryfast"
5760PROBE_S=" 6"
5861EXACT_CROP=" false"
5962DEBUG=" false"
63+ SAFE_LEFT=" 30"
6064
6165# --- Parse args ---
6266while [[ $# -gt 0 ]]; do
@@ -75,6 +79,7 @@ while [[ $# -gt 0 ]]; do
7579 --preset) PRESET=" ${2:- } " ; shift 2 ;;
7680 --probe-seconds) PROBE_S=" ${2:- } " ; shift 2 ;;
7781 --exact-crop) EXACT_CROP=" ${2:- false} " ; shift 2 ;;
82+ --safe-left) SAFE_LEFT=" ${2:- 30} " ; shift 2 ;;
7883 --debug) DEBUG=" true" ; shift 1 ;;
7984 -h|--help) usage ;;
8085 * ) echo " Unknown arg: $1 " ; usage ;;
@@ -180,6 +185,15 @@ IFS=',' read -r IW IH <<<"$(get_dims "$INPUT")"
180185vf_chain=()
181186CROP_SUFFIX=" " ; [[ " $EXACT_CROP " == " true" ]] && CROP_SUFFIX=" :exact=1"
182187
188+ # Normalize and validate left safety margin for final canvas
189+ SAFE_LEFT=" $( clamp " ${SAFE_LEFT} " 0 1078) "
190+ SAFE_LEFT=" $( floor_even " ${SAFE_LEFT} " ) " # keep even for yuv420 alignment
191+ TARGET_WIDTH=$(( 1080 - SAFE_LEFT ))
192+ if (( TARGET_WIDTH < 2 )) ; then
193+ echo " --safe-left too large; resulting width < 2"
194+ exit 1
195+ fi
196+
183197case " $CROP_MODE " in
184198 auto)
185199 DET=" $( autodetect_crop_whxy || true) "
@@ -222,6 +236,11 @@ case "$FIT" in
222236 * ) echo " Invalid --fit: $FIT " ; exit 1 ;;
223237esac
224238
239+ # Overlay left black margin on the final 1080x1920 frame without distorting content
240+ if (( SAFE_LEFT > 0 )) ; then
241+ vf_chain+=(" drawbox=x=0:y=0:w=${SAFE_LEFT} :h=ih:color=black:t=fill" )
242+ fi
243+
225244# Pixel/Display aspect
226245vf_chain+=(" setsar=1" )
227246vf_chain+=(" setdar=9/16" )
0 commit comments