summaryrefslogtreecommitdiffstats
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
authorNuke <nuke@imnuke.dev>2026-06-16 14:44:43 +0800
committerdana <dana@dana.is>2026-06-20 21:08:28 -0500
commitd189bccac6a299eff6284c0810acafa4b90030de (patch)
tree56c67c0b71126f0b7fb54860c702b73886e675d8 /Completion/Unix/Command
parentgithub #174: completion: _gcc: coroutines-ts was merged in 2020 (diff)
downloadzsh-d189bccac6a299eff6284c0810acafa4b90030de.tar
zsh-d189bccac6a299eff6284c0810acafa4b90030de.tar.gz
zsh-d189bccac6a299eff6284c0810acafa4b90030de.tar.bz2
zsh-d189bccac6a299eff6284c0810acafa4b90030de.tar.lz
zsh-d189bccac6a299eff6284c0810acafa4b90030de.tar.xz
zsh-d189bccac6a299eff6284c0810acafa4b90030de.tar.zst
zsh-d189bccac6a299eff6284c0810acafa4b90030de.zip
54790 (tweaked): _ffmpeg: update for modern ffmpeg
fixed broken patch header and re-incorporated fix from dd4666d82 has some issues, to be followed by further improvements
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_ffmpeg268
1 files changed, 104 insertions, 164 deletions
diff --git a/Completion/Unix/Command/_ffmpeg b/Completion/Unix/Command/_ffmpeg
index 9c91fe386..7620007c8 100644
--- a/Completion/Unix/Command/_ffmpeg
+++ b/Completion/Unix/Command/_ffmpeg
@@ -10,31 +10,39 @@ typeset -A opt_args
}
(( $+functions[_ffmpeg_acodecs] )) || _ffmpeg_acodecs() {
- local acodecs
- acodecs=(copy ${${(M)${(f)"$(_call_program audio-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]A[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-audio-codecs expl 'force audio codec (''copy'' to copy stream)' compadd -a acodecs
+ local -a acodecs
+ acodecs=(copy ${(f)"$(_call_program audio-codecs \
+ $words[1] -encoders 2>/dev/null | awk 'NR>10 && /^ A/{print $2}')"})
+ _wanted ffmpeg-audio-codecs expl \
+ 'force audio codec (''copy'' to copy stream)' compadd -a acodecs
}
(( $+functions[_ffmpeg_vcodecs] )) || _ffmpeg_vcodecs() {
- local vcodecs
- vcodecs=(copy ${${(M)${(f)"$(_call_program video-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]V[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-video-codecs expl 'force video codec (''copy'' to copy stream)' compadd -a vcodecs
+ local -a vcodecs
+ vcodecs=(copy ${(f)"$(_call_program video-codecs \
+ $words[1] -encoders 2>/dev/null | awk 'NR>10 && /^ V/{print $2}')"})
+ _wanted ffmpeg-video-codecs expl \
+ 'force video codec (''copy'' to copy stream)' compadd -a vcodecs
}
(( $+functions[_ffmpeg_scodecs] )) || _ffmpeg_scodecs() {
- local scodecs
- scodecs=(copy ${${(M)${(f)"$(_call_program subtitle-codecs $words[1] -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]S[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
- _wanted ffmpeg-subtitle-codecs expl 'force subtitle codec (''copy'' to copy stream)' compadd -a scodecs
+ local -a scodecs
+ scodecs=(copy ${(f)"$(_call_program subtitle-codecs \
+ $words[1] -encoders 2>/dev/null | awk 'NR>10 && /^ S/{print $2}')"})
+ _wanted ffmpeg-subtitle-codecs expl \
+ 'force subtitle codec (''copy'' to copy stream)' compadd -a scodecs
}
(( $+functions[_ffmpeg_formats] )) || _ffmpeg_formats() {
- local formats
- formats=(${(ou)${=${(s:,:)${${(M)${(f)"$(_call_program formats $words[1] -formats 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]][[:space:]][^[:space:]]##*}//(#b)????([^[:space:]]##)*/$match[1]}}}})
+ local _out
+ _out=$(_call_program formats $words[1] -formats 2>/dev/null | \
+ awk 'NR>4 {name=($2=="d")?$3:$2; n=split(name,a,","); for(i=1;i<=n;i++) if(a[i]~/^[a-z0-9]/) print a[i]}')
+ local -a formats
+ formats=(${(ou)${(f)_out}})
_wanted ffmpeg-formats expl 'force format' compadd -a formats
}
(( $+functions[_ffmpeg_pix_fmts] )) || _ffmpeg_pix_fmts() {
- local pix_fmts
_wanted ffmpeg-pix-fmts expl 'pixel format' compadd "$@" - \
${${${(M)${(f)"$(_call_program formats $words[1] -pix_fmts 2>/dev/null)"}:#[I.][O.][H.][P.][B.] [^=[:space:]]*}#* }%% *}
}
@@ -45,156 +53,88 @@ typeset -A opt_args
_wanted ffmpeg-bsfs expl 'set bitstream filter' compadd -a bsfs
}
-typeset -A _ffmpeg_flags
-
-(( $+functions[_ffmpeg_flag_options] )) || _ffmpeg_flag_options() {
- local expl
- _wanted options expl 'flag' compadd -S '' -- {-,+}${^flag_options}
-}
-
-(( $+functions[_ffmpeg_more_flag_options] )) || _ffmpeg_more_flag_options() {
- compset -p $1 && _ffmpeg_flag_options
-}
-
-(( $+functions[_ffmpeg_new_flag_options] )) || _ffmpeg_new_flag_options() {
- compset -P '*' && _ffmpeg_flag_options
-}
-
-(( $+functions[_ffmpeg_flags] )) || _ffmpeg_flags() {
- local -a flag_options
- eval "flag_options=(\${=_ffmpeg_flags[$1]})"
-
- local match mbegin mend
- integer ret=1
-
- if [[ $PREFIX = (#b)(*)[-+]([^-+]#) ]]; then
- if [[ -n ${flag_options[(R)$match[2]]} ]]; then
- _ffmpeg_new_flag_options && ret=0
- fi
- if [[ -n ${flag_options[(R)$match[2]?*]} ]]; then
- _ffmpeg_more_flag_options ${#match[1]} && ret=0
- fi
- else
- _ffmpeg_flag_options && ret=0
- fi
-
- return ret
-}
-
-(( $+functions[_ffmpeg_register_lastopt_values] )) || _ffmpeg_register_lastopt_values() {
- if (( lastopt_takesargs )); then
- lastopt+=":$lastopt_description:"
- if (( $#lastopt_values )); then
- if [[ $lastopt_type == flags ]]; then
- lastopt="*$lastopt"
- flagtype=${${lastopt%%:*}#-}
- lastopt+="->$flagtype"
- _ffmpeg_flags[$flagtype]="${lastopt_values[*]}"
- else
- lastopt+="(${lastopt_values[*]})"
- fi
- fi
- fi
- _ffmpeg_argspecs+=$lastopt
-}
-
-local -a _ffmpeg_argspecs
-{
- local lastopt REPLY
- local lastopt_description
- local lastopt_takesargs
- local lastopt_type
- local -a lastopt_values
-
- _call_program options $words[1] -h 2>/dev/null | while IFS=$'\n' read -r; do
- if [[ $REPLY == -* ]]; then
- [[ -n $lastopt ]] && _ffmpeg_register_lastopt_values
- lastopt=${REPLY%%[[:space:]]*}
- lastopt_description=${REPLY##-[^[:space:]]##[[:space:]]##}
- if [[ $lastopt_description == (#b)'<'(?##)'>'* ]]; then
- lastopt_type=$match[1]
- lastopt_description=${lastopt_description##<[^[:space:]]##>[[:space:]]##[^[:space:]]##[[:space:]]#}
- if [[ -z $lastopt_description ]]; then
- lastopt_description=$lastopt
- fi
- lastopt_description=${lastopt_description//:/\\:}
- elif [[ $lastopt_description == [^[:space:]]##[[:space:]][[:space:]]* ]]; then
- local example=${lastopt_description%% *}
- example=${example//:/\\:}
- lastopt_description=${lastopt_description##[^[:space:]]##[[:space:]]##}
- lastopt_description=${lastopt_description//:/\\:}
- if [[ $example == filename ]]; then
- lastopt_takesargs=0
- lastopt+=":${lastopt_description}:_files"
- elif [[ $lastopt == -[asv]pre ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=": :_ffmpeg_presets"
- elif [[ $lastopt == -acodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_acodecs"
- elif [[ $lastopt == -vcodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_vcodecs"
- elif [[ $lastopt == -scodec ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_scodecs"
- elif [[ $lastopt == -f ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=": :_ffmpeg_formats"
- elif [[ $lastopt == -pix_fmt ]]; then
- lastopt_takesargs=0
- lastopt="*$lastopt"
- lastopt+=":set pixel format:_ffmpeg_pix_fmts"
- elif [[ $example == bitstream_filter ]]; then
- lastopt_takesargs=0
- lastopt+=": :_ffmpeg_bsfs"
- else
- lastopt_takesargs=1
- lastopt_description+=" ($example)"
- fi
- else
- lastopt_takesargs=0
- if [[ $lastopt == -vfilters ]]; then
- lastopt+=": :->vfilters"
- fi
- fi
- lastopt_values=()
- elif [[ $REPLY == ' '* ]]; then
- REPLY=${REPLY##[[:space:]]##}
- REPLY=${REPLY%%[[:space:]]##*}
- lastopt_takesargs=1
- lastopt_values+=$REPLY
- fi
- done
- [[ -n $lastopt ]] && _ffmpeg_register_lastopt_values
-}
-
_arguments -C -S \
- "${_ffmpeg_argspecs[@]}" \
- '*:output file:_files' \
- && return
-
-[[ "$state" == "vfilters" ]] &&
- _values -s , -S = 'video filter' \
- 'aspect:set aspect ratio (rational number X\:Y or decimal number):' \
- 'crop:crop input video (x\:y\:width\:height):' \
- 'format: :_sequence -s : _ffmpeg_pix_fmts' \
- 'noformat: :_sequence -s : _ffmpeg_pix_fmts' \
- 'null' \
- 'pad:add pads to the input image (width\:height\:x\:y\:color_string):' \
- 'pixelaspect:set pixel aspect ratio (rational number X\:Y or decimal number):' \
- 'scale:scale input video (width\:height):' \
- 'slicify:output slice height ("random" or a number of pixels):' \
- 'unsharp:luma_x\:luma_y\:luma_amount\:chroma_x\:chroma_y\:chroma_amount:' \
- 'vflip' \
- 'buffer' \
- 'nullsrc' \
- 'nullsink' \
- && return
-
-[[ -n $state && -n $_ffmpeg_flags[$state] ]] &&
- _ffmpeg_flags $state && return
-
-return 1
+ '(-y -n)-y[overwrite output files without asking]' \
+ '(-y -n)-n[never overwrite output files]' \
+ '-v[set logging level]:level:(quiet panic fatal error warning info verbose debug trace)' \
+ '-loglevel[set logging level]:level:(quiet panic fatal error warning info verbose debug trace)' \
+ '-report[generate a report]' \
+ '-hide_banner[suppress printing banner]' \
+ '-cpuflags[force specific cpu flags]:flags' \
+ '-stats[print encoding progress and statistics]' \
+ '-nostats[suppress encoding progress and statistics]' \
+ '-progress[write program-readable progress information]:URL' \
+ '-benchmark[add benchmarking information to the report]' \
+ '-timelimit[exit after specified number of seconds of CPU time]:seconds' \
+ '-dump[dump each input packet to stderr]' \
+ '-hex[dump each input packet in hexadecimal]' \
+ '-re[read input at native frame rate]' \
+ '-stream_loop[set number of times to loop the input]:count' \
+ '-i[input file or URL]:input file:_files' \
+ '*-f[force container format]:format:_ffmpeg_formats' \
+ '-c[select encoder or decoder]:codec' \
+ '-codec[select encoder or decoder]:codec' \
+ '-t[stop transcoding after duration]:duration' \
+ '-to[stop transcoding at time]:time' \
+ '-fs[set output file size limit in bytes]:bytes' \
+ '-ss[start at time offset]:time' \
+ '-sseof[start at time offset relative to EOF]:time' \
+ '-seek_timestamp[seek by timestamp with -ss when set to 1]:flag' \
+ '-itsoffset[set input time offset]:time' \
+ '-timestamp[set the recording timestamp]:time' \
+ '-metadata[add metadata to the output file]:key=value' \
+ '-program[add a program with specified streams]:title=outfile,key=value,...' \
+ '-target[specify target file type]:type:(vcd svcd dvd dv dv50)' \
+ '-apad[pad audio output with silence]' \
+ '-frames[stop writing after specified number of frames]:count' \
+ '-filter[set filtergraph for a stream]:filtergraph' \
+ '-filter_script[read filtergraph from file]:file:_files' \
+ '-reinit_filter[reinit filtergraph on input parameter changes]:flag' \
+ '-discard[discard matching stream packets]:type' \
+ '-disposition[set disposition flags for a stream]:flags' \
+ '-map[set input stream mapping]:stream_specifier' \
+ '-map_metadata[set metadata information of outfile]:outfile_spec' \
+ '-map_chapters[read chapters from input file]:input_file_index' \
+ '-copyts[copy timestamps from input to output]' \
+ '-start_at_zero[shift timestamps to start at 0 with -copyts]' \
+ '-copytb[copy input stream time base when stream copying]:mode' \
+ '-shortest[finish encoding when the shortest input stream ends]' \
+ '-dts_delta_threshold[timestamp discontinuity delta threshold]:threshold' \
+ '-muxdelay[set the maximum demux-decode delay in seconds]:seconds' \
+ '-muxpreload[set the initial demux-decode delay in seconds]:seconds' \
+ '-streamid[force a stream identifier]:ost_index:newval' \
+ '-bitexact[enable bitexact mode]' \
+ '-xerror[exit on error]' \
+ '-strict[how strictly to follow standards]:level:(very strict normal unofficial experimental)' \
+ '-max_muxing_queue_size[maximum packets in the muxing queue]:count' \
+ '-threads[number of threads to use]:count' \
+ '-vn[disable video]' \
+ '-vcodec[force video codec]:codec:_ffmpeg_vcodecs' \
+ '-vf[set video filtergraph]:filtergraph' \
+ '-b[set video bitrate]:bitrate' \
+ '-r[set video frame rate]:rate' \
+ '-s[set video frame size]:WxH' \
+ '-aspect[set video aspect ratio]:ratio' \
+ '*-pix_fmt[set pixel format]:format:_ffmpeg_pix_fmts' \
+ '-vframes[set number of video frames to output]:count' \
+ '-g[set group of picture size]:size' \
+ '*-vpre[set video preset options]:preset:_ffmpeg_presets' \
+ '-an[disable audio]' \
+ '-acodec[force audio codec]:codec:_ffmpeg_acodecs' \
+ '-af[set audio filtergraph]:filtergraph' \
+ '-ab[set audio bitrate]:bitrate' \
+ '-ar[set audio sampling rate in Hz]:rate' \
+ '-ac[set number of audio channels]:channels' \
+ '-aq[set audio quality]:quality' \
+ '-aframes[set number of audio frames to output]:count' \
+ '-atag[force audio tag or fourcc]:fourcc' \
+ '*-apre[set audio preset options]:preset:_ffmpeg_presets' \
+ '-sn[disable subtitle]' \
+ '-scodec[force subtitle codec]:codec:_ffmpeg_scodecs' \
+ '-stag[force subtitle tag or fourcc]:fourcc' \
+ '-fix_sub_duration[fix subtitle duration]' \
+ '-canvas_size[set canvas size]:WxH' \
+ '*-spre[set subtitle preset options]:preset:_ffmpeg_presets' \
+ '-bsf[set bitstream filter]:bitstream filter:_ffmpeg_bsfs' \
+ '-dn[disable data streams]' \
+ '*:output file:_files'