[FFmpeg-devel] Escaping from the escaping madness
Michael Niedermayer
michaelni at gmx.at
Thu Nov 15 20:36:14 CET 2012
On Thu, Nov 15, 2012 at 07:43:10PM +0100, Nicolas George wrote:
> Le quintidi 25 brumaire, an CCXXI, Michael Niedermayer a écrit :
> > Maybe we should make a list of typical cases where escaping is needed
> > and then look at how they would look with alternatives.
>
> If I take the example of the drawtext filter and the new expansion options I
> am adding, which is probably one of the worst, that would look like that:
>
> Format string: %H:%M
> Expansion function call: %{localtime:%H\:%M} or %{localtime:'%H:%M'}
> drawtext argument: text=%{lt\:%H\\\:%M} or text=%{lt\:\'%H\:%M}
> filter graph: dt=t=%{lt\\:%H\\\\\\:%M} or dt=t=%{lt\\:\\\'%H\\:%M}
> command-line (shell): 'dt=t=%{lt\\:%H\\\\\\:%M}' or
> "dt=t=%{lt\\\\:\\\\\\'%H\\\\:%M}"
>
> Trying with balanced quotes:
>
> Format string: %H:%M
> Expansion function call: %{localtime:“%H:%M”}
> drawtext argument: text=“%{localtime:“%H:%M”}”
> filter graph: drawtext=“text=“%{localtime:“%H:%M”}””
> command-line (shell): 'drawtext=“text=“%{localtime:“%H:%M”}””'
>
> Same with only ASCII, $[...] used for quoting:
>
> Format string: %H:%M
> Expansion function call: %{localtime:$[%H:%M]}
> drawtext argument: text=$[%{localtime:$[%H:%M]}]
> filter graph: drawtext=$[text=$[%{localtime:$[%H:%M]}]]
> command-line (shell): 'drawtext=$[text=$[%{localtime:$[%H:%M]}]]'
Hmm, we have the following parts
1. Filter names
2. Filter option keys
3. Filter option values
We can easily enforce 1 and 2 to be pure lower case alpha nummeric if
we want, and they probably are already. The problem remaining is thus
only escaping of filter option values.
This shouldnt result in such a mess ...
trying something random, the following might work:
'drawtext=text(localtime:%H:%M)'
it does not use true escaping, but rather replaces the '=' char as
the start charter before a "Filter option value" with a '('.
At that point only a unpaired ) terminates the option value and nothing
else would need escaping.
As a sideeffect this suggestion would also eliminate the double '='
which may make it easier to understand.
Using the same syntax, a more devilish usecase would be a nested
filtergraph, that is having a full filter graph as a parameter to a
filter.
'scale=123:456,subgraph=graph(crop=456:789,drawtext=text(localtime:%H:%M):fontcolor(blue))'
or with some whitespace
'scale = 123 : 456,
subgraph = graph(
crop = 456 : 789,
drawtext = text(localtime:%H:%M) : fontcolor(blue)
)'
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
The bravest are surely those who have the clearest vision
of what is before them, glory and danger alike, and yet
notwithstanding go out to meet it. -- Thucydides
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121115/0471472b/attachment.asc>
More information about the ffmpeg-devel
mailing list