diff options
Diffstat (limited to 'Completion/Unix/Command/_ffmpeg')
| -rw-r--r-- | Completion/Unix/Command/_ffmpeg | 268 |
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' |
