zsh-workers
 help / color / mirror / code / Atom feed
* Small patch for FFmpeg completion function
@ 2011-04-26 21:48 Haakon Riiser
  2011-04-28 14:46 ` Haakon Riiser
  0 siblings, 1 reply; 4+ messages in thread
From: Haakon Riiser @ 2011-04-26 21:48 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 157 bytes --]

 This is a patch for Completion/Unix/Command/_ffmpeg (CVS rev 1.2)
 It adds the "copy" keyword as an extra completion to -acodec and 
 -vcodec.

-- 
  Haakon

[-- Attachment #2: ffmpeg-codec-copy.patch --]
[-- Type: text/x-patch, Size: 1652 bytes --]

--- _ffmpeg	26 Apr 2011 21:36:04 -0000	1.9
+++ _ffmpeg	26 Apr 2011 21:36:17 -0000	1.10
@@ -11,27 +11,27 @@
 }
 
 _ffmpeg_presets() {
     local presets
     presets=(~/.ffmpeg/*.ffpreset(:t:r) "$FFMPEG_DATADIR"/*.ffpreset(:t:r))
     _ffmpeg_compadd 'select preset' presets ''
 }
 
 _ffmpeg_acodecs() {
     local acodecs
-    acodecs=(${${(M)${(f)"$(ffmpeg -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]A[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
+    acodecs=(copy ${${(M)${(f)"$(ffmpeg -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]A[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
     _ffmpeg_compadd 'force audio codec (''copy'' to copy stream)' acodecs ''
 }
 
 _ffmpeg_vcodecs() {
     local vcodecs
-    vcodecs=(${${(M)${(f)"$(ffmpeg -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]V[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
+    vcodecs=(copy ${${(M)${(f)"$(ffmpeg -codecs 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]]V[S[:space:]][D[:space:]][T[:space:]][[:space:]][^[:space:]]##*}//(#b)????????([^[:space:]]##)*/$match[1]})
     _ffmpeg_compadd 'force video codec (''copy'' to copy stream)' vcodecs ''
 }
 
 _ffmpeg_formats() {
     local formats
     formats=(${(ou)${=${(s:,:)${${(M)${(f)"$(ffmpeg -formats 2>/dev/null)"}:#[[:space:]][D[:space:]][E[:space:]][[:space:]][^[:space:]]##*}//(#b)????([^[:space:]]##)*/$match[1]}}}})
     _ffmpeg_compadd 'force format' formats ''
 }
 
 _ffmpeg_list_pix_fmts() {

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Small patch for FFmpeg completion function
  2011-04-26 21:48 Small patch for FFmpeg completion function Haakon Riiser
@ 2011-04-28 14:46 ` Haakon Riiser
  2011-04-30 20:59   ` Peter Stephenson
  0 siblings, 1 reply; 4+ messages in thread
From: Haakon Riiser @ 2011-04-28 14:46 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 775 bytes --]

 On Tue, 26 Apr 2011 23:48:21 +0200, Haakon Riiser 
 <haakon.riiser@fys.uio.no> wrote:
> This is a patch for Completion/Unix/Command/_ffmpeg (CVS rev 1.2)
> It adds the "copy" keyword as an extra completion to -acodec and 
> -vcodec.

 Decided to clean it up further. Obviously it is better to avoid having 
 Perl as a dependency, so the attached version does everything using zsh 
 scripting. It also uses _call_program and $words[1] instead of "ffmpeg" 
 directly.

 No differences other than that: The completion function should produce 
 the same results as the previous one that used Perl. Because of the 
 large diff, the entire completion function is attached. It is based on 
 the last version I sent (which again is based on the last version in 
 CVS).

-- 
  Haakon

[-- Attachment #2: _ffmpeg --]
[-- Type: application/octet-stream, Size: 6489 bytes --]

#compdef ffmpeg

local context state line
typeset -A opt_args

local -a _ffmpeg_argspecs

local BOLD=$'\e[1m'
local NORM=$'\e[m'

(( $+functions[_ffmpeg_compadd] )) || _ffmpeg_compadd() {
    compadd -X "${BOLD}$1${NORM}" -q -S "$3" -a $2
}

(( $+functions[_ffmpeg_presets] )) || _ffmpeg_presets() {
    local presets
    presets=(~/.ffmpeg/*.ffpreset(:t:r) "$FFMPEG_DATADIR"/*.ffpreset(:t:r))
    _ffmpeg_compadd 'select preset' presets ''
}

(( $+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]})
    _ffmpeg_compadd 'force audio codec (''copy'' to copy stream)' 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]})
    _ffmpeg_compadd 'force video codec (''copy'' to copy stream)' vcodecs ''
}

(( $+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]}}}})
    _ffmpeg_compadd 'force format' formats ''
}

(( $+functions[_ffmpeg_list_pix_fmts] )) || _ffmpeg_list_pix_fmts() {
    print -l ${${(M)${(f)"$(_call_program pix-fmts $words[1] -pix_fmts 2>/dev/null)"}:#[I.]*}//(#b)??????([^[:space:]]##)*/$match[1]}
}

(( $+functions[_ffmpeg_pix_fmts] )) || _ffmpeg_pix_fmts() {
    local pix_fmts
    pix_fmts=($(_ffmpeg_list_pix_fmts))
    _ffmpeg_compadd 'set pixel format' pix_fmts ''
}

(( $+functions[_ffmpeg_bsfs] )) || _ffmpeg_bsfs() {
    local bsfs
    bsfs=(${${(f)"$(_call_program bsfs $words[1] -bsfs 2>/dev/null)"}:#*:})
    _ffmpeg_compadd 'set bitstream filter' bsfs ''
}

{
    local lastopt
    local lastopt_description
    local lastopt_takesargs
    local -a lastopt_values

    _call_program options $words[1] -h 2>/dev/null | while IFS=$'\n' read -r; do
        if [[ $REPLY == -* ]]; then
            if [[ -n $lastopt ]]; then
                if (( lastopt_takesargs )); then
                    lastopt+=":$lastopt_description:"
                    if (( $#lastopt_values )); then
                        lastopt+="(${lastopt_values[*]})"
                    fi
                fi
                _ffmpeg_argspecs+=$lastopt
            fi
            lastopt=${REPLY%%[[:space:]]*}
            lastopt_description=${REPLY##-[^[:space:]]##[[:space:]]##}
            if [[ $lastopt_description == '<'* ]]; then
                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+=": :_ffmpeg_presets"
                elif [[ $lastopt == -acodec ]]; then
                    lastopt_takesargs=0
                    lastopt+=": :_ffmpeg_acodecs"
                elif [[ $lastopt == -vcodec ]]; then
                    lastopt_takesargs=0
                    lastopt+=": :_ffmpeg_vcodecs"
                elif [[ $lastopt == -f ]]; then
                    lastopt_takesargs=0
                    lastopt+=": :_ffmpeg_formats"
                elif [[ $lastopt == -pix_fmt ]]; then
                    lastopt_takesargs=0
                    lastopt+=": :_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
    if [[ -n $lastopt ]]; then
        if (( lastopt_takesargs )); then
            lastopt+=":$lastopt_description:"
            if (( $#lastopt_values )); then
                lastopt+="(${lastopt_values[*]})"
            fi
        fi
        _ffmpeg_argspecs+=$lastopt
    fi
}

_arguments -S \
    "${_ffmpeg_argspecs[@]}" \
    '*:output file:_files' \
    && return 0

[[ "$state" == "vfilters" ]] &&
    _values -s , -S = 'video filters' \
    'aspect:set aspect ratio (rational number X\:Y or decimal number):' \
    'crop:crop input video (x\:y\:width\:height):' \
    'format: :->format' \
    'noformat: :->noformat' \
    '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 0

[[ "$state" == "format" ]] &&
    _values -s : -S = 'convert input video to one of the specified pixel formats' $(_ffmpeg_list_pix_fmts) && return 0

[[ "$state" == "noformat" ]] &&
    _values -s : -S = 'disable specified pixel formats by force' $(_ffmpeg_list_pix_fmts) && return 0

return 1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Small patch for FFmpeg completion function
  2011-04-28 14:46 ` Haakon Riiser
@ 2011-04-30 20:59   ` Peter Stephenson
  2011-04-30 23:03     ` Haakon Riiser
  0 siblings, 1 reply; 4+ messages in thread
From: Peter Stephenson @ 2011-04-30 20:59 UTC (permalink / raw)
  To: zsh-workers

On Thu, 28 Apr 2011 16:46:19 +0200
Haakon Riiser <haakon.riiser@fys.uio.no> wrote:
>  On Tue, 26 Apr 2011 23:48:21 +0200, Haakon Riiser 
>  <haakon.riiser@fys.uio.no> wrote:
> > This is a patch for Completion/Unix/Command/_ffmpeg (CVS rev 1.2)
> > It adds the "copy" keyword as an extra completion to -acodec and 
> > -vcodec.
> 
>  Decided to clean it up further. Obviously it is better to avoid having 
>  Perl as a dependency, so the attached version does everything using zsh 
>  scripting. It also uses _call_program and $words[1] instead of "ffmpeg" 
>  directly.

Thanks, committed this without doing more than a cursory scan of it ---
no doubt someone will say if they're having problems.

-- 
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Small patch for FFmpeg completion function
  2011-04-30 20:59   ` Peter Stephenson
@ 2011-04-30 23:03     ` Haakon Riiser
  0 siblings, 0 replies; 4+ messages in thread
From: Haakon Riiser @ 2011-04-30 23:03 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 2249 bytes --]

 On Sat, 30 Apr 2011 21:59:44 +0100, Peter Stephenson 
 <p.w.stephenson@ntlworld.com> wrote:
> On Thu, 28 Apr 2011 16:46:19 +0200
> Haakon Riiser <haakon.riiser@fys.uio.no> wrote:
>>  Decided to clean it up further. Obviously it is better to avoid 
>> having
>>  Perl as a dependency, so the attached version does everything using 
>> zsh
>>  scripting. It also uses _call_program and $words[1] instead of 
>> "ffmpeg"
>>  directly.
>
> Thanks, committed this without doing more than a cursory scan of it 
> ---
> no doubt someone will say if they're having problems.

 Thank you for committing the patch so soon. Unfortunately, I found a 
 couple of more things to improve. :)

 First of all, there was a bug in the pixel format completion - it 
 included an invalid match. This bug was not introduced by my previous 
 patch, it has been there for a long time.

 The second thing I changed was not a bug, but probably something that 
 was poor form. Previously, I did this:

 local BOLD=$'\e[1m'
 local NORM=$'\e[m'
 compadd -X "${BOLD}description{NORM}" -q -S '' -a array

 Here, "array" contains a list of keywords to be completed (e.g., a list 
 of codec names), and "description" contains a description headline to be 
 displayed at the top, above the list of keywords. The $BOLD and $NORM 
 escape codes were used to make it visually identical to description 
 headers in other functions (e.g., _files). This method worked, but I 
 never liked hard-coding ANSI escape codes directly. Now, this is 
 replaced by:

 _wanted ffmpeg-XXX expl 'description' compadd -a array

 Seems to work just as well, and I don't need the ANSI escapes. 
 Hopefully, this is the correct way to insert matches directly. If you 
 notice something else that is poor form, let me know and I will fix it.

 PS: I have also recently written a completion function for nmcli (the 
 command-line interface to NetworkManager, which is used in a lot of 
 Linux distros). It was a bit tricky to get right, because a deep nesting 
 of subcommands and non-standard command line parsing. I think I got it 
 right, but I haven't posted it here yet. Thought I'd get the _ffmpeg 
 improvements out of the way first, so that I don't make the same 
 mistakes in _nmcli.

-- 
  Haakon

[-- Attachment #2: fixed_pix_fmt_completion.patch --]
[-- Type: text/x-patch, Size: 3485 bytes --]

Index: _ffmpeg
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_ffmpeg,v
retrieving revision 1.3
diff -u -1 -0 -r1.3 _ffmpeg
--- _ffmpeg	30 Apr 2011 20:58:49 -0000	1.3
+++ _ffmpeg	30 Apr 2011 22:46:59 -0000
@@ -1,64 +1,56 @@
 #compdef ffmpeg
 
-local context state line
+local context state line expl
 typeset -A opt_args
 
-local -a _ffmpeg_argspecs
-
-local BOLD=$'\e[1m'
-local NORM=$'\e[m'
-
-(( $+functions[_ffmpeg_compadd] )) || _ffmpeg_compadd() {
-    compadd -X "${BOLD}$1${NORM}" -q -S "$3" -a $2
-}
-
 (( $+functions[_ffmpeg_presets] )) || _ffmpeg_presets() {
     local presets
     presets=(~/.ffmpeg/*.ffpreset(:t:r) "$FFMPEG_DATADIR"/*.ffpreset(:t:r))
-    _ffmpeg_compadd 'select preset' presets ''
+    _wanted ffmpeg-presets expl 'select preset' compadd -a presets
 }
 
 (( $+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]})
-    _ffmpeg_compadd 'force audio codec (''copy'' to copy stream)' acodecs ''
+    _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]})
-    _ffmpeg_compadd 'force video codec (''copy'' to copy stream)' vcodecs ''
+    _wanted ffmpeg-video-codecs expl 'force video codec (''copy'' to copy stream)' compadd -a vcodecs
 }
 
 (( $+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]}}}})
-    _ffmpeg_compadd 'force format' formats ''
+    _wanted ffmpeg-formats expl 'force format' compadd -a formats
 }
 
 (( $+functions[_ffmpeg_list_pix_fmts] )) || _ffmpeg_list_pix_fmts() {
-    print -l ${${(M)${(f)"$(_call_program pix-fmts $words[1] -pix_fmts 2>/dev/null)"}:#[I.]*}//(#b)??????([^[:space:]]##)*/$match[1]}
+    echo - ${${${(M)${(f)"$(_call_program formats $words[1] -pix_fmts 2>/dev/null)"}:#[I.][O.][H.][P.][B.] [^=[:space:]]*}#* }%% *}
 }
 
 (( $+functions[_ffmpeg_pix_fmts] )) || _ffmpeg_pix_fmts() {
     local pix_fmts
     pix_fmts=($(_ffmpeg_list_pix_fmts))
-    _ffmpeg_compadd 'set pixel format' pix_fmts ''
+    _wanted ffmpeg-pix-fmts expl 'set pixel format' compadd -a pix_fmts
 }
 
 (( $+functions[_ffmpeg_bsfs] )) || _ffmpeg_bsfs() {
     local bsfs
     bsfs=(${${(f)"$(_call_program bsfs $words[1] -bsfs 2>/dev/null)"}:#*:})
-    _ffmpeg_compadd 'set bitstream filter' bsfs ''
+    _wanted ffmpeg-bsfs expl 'set bitstream filter' compadd -a bsfs
 }
 
+local -a _ffmpeg_argspecs
 {
     local lastopt
     local lastopt_description
     local lastopt_takesargs
     local -a lastopt_values
 
     _call_program options $words[1] -h 2>/dev/null | while IFS=$'\n' read -r; do
         if [[ $REPLY == -* ]]; then
             if [[ -n $lastopt ]]; then
                 if (( lastopt_takesargs )); then

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-04-30 23:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-26 21:48 Small patch for FFmpeg completion function Haakon Riiser
2011-04-28 14:46 ` Haakon Riiser
2011-04-30 20:59   ` Peter Stephenson
2011-04-30 23:03     ` Haakon Riiser

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).