[FFmpeg-devel] Extending AVOption system

Michael Niedermayer michaelni
Thu Jun 12 12:17:03 CEST 2008


On Thu, Jun 12, 2008 at 12:12:10AM +0200, Stefano Sabatini wrote:
> On date Monday 2008-06-09 19:23:49 +0200, Michael Niedermayer encoded:
> > On Mon, Jun 09, 2008 at 06:16:25PM +0200, Stefano Sabatini wrote:
> > > On date Monday 2008-06-09 17:06:55 +0200, Michael Niedermayer encoded:
> > > > On Mon, Jun 09, 2008 at 04:45:05PM +0200, Stefano Sabatini wrote:
> > > > > On date Sunday 2008-06-08 21:17:51 +0200, Michael Niedermayer encoded:
> > > > > > On Sun, Jun 08, 2008 at 07:53:07PM +0200, Stefano Sabatini wrote:
> > > > > > > Michael, eventual applications which work with non sorted arrays
> > > > > > > won't work anymore with bsearch(), so I have to provide all the required
> > > > > > > ifdeffery to keep backward compatibility, right?
> > > > > > 
> > > > > > hmm, who is using AVOptions arrays outside lav* ?
> > > > > 
> > > > > Who can say? Anyway since we're indeed breaking backward compatibility
> > > > > a major bump seems anyway the right thing to do (again: I can also
> > > > > live without such a major bump if you prefer like this, just making my
> > > > > point clear).
> > > > > 
> > > > > Rethinking at it the major bump would be required in libavutil, since
> > > > > we're requesting at some point these two things:
> > > > > 1) AVClass.option array has to be sorted
> > > > > 2) AVClass.option_count has to be correctly specified
> > > > > 
> > > > > If this is not true then the behaviour of the function which deal with
> > > > > AVClass is undefined.
> > > > 
> > > > Just store the length in the first entry of the AVOption array. No change
> > > > to AVClass no version bumps. And the length is where the corresponding array
> > > > is.
> > > > {" len", NULL, <array size>, FF_OPT_TYPE_CONST,
> > > 
> > > And still so we're requesting that:
> > > 1) AVClass.option array has to be sorted
> > > 2) AVClass.option_count has to contain a "len" option
> 
> mmh, it was:
> 2) AVClass.option has to contain a "len" option
> 
> > > With this option we save a minor bump for the introduction of
> > > option_count, not the major bump, also we're complicating the
> > > interface.
> > 
> > 1. AVClass.option[0].name == " len" -> array is sorted and option[0].offset
> >    contains the length
> > 2. AVClass.option[0].name != " len" -> array is not sorted and is NULL
> >    terminated
> > 
> > 2 is under #ifdef version < blah
> 
> Sorry to bother again, I'm not really happy with this solution too...
> 
> This still breaks compatibility in a very subtle way, suppose that a
> funky user from Mars already uses AVOption and has an AVClass with the
> first item set to
> 
> { " len", 42, ...}

This is ridiculous, command line options dont start with spaces
even less so ones using AVOption.


> 
> when 42 is not equal to sizeof(options)/sizeof(AVOptions) -1 and
> furthermore the array isn't sorted, yes you may wonder why someone
> should do such thing but you know people from mars do very weird
> things...
> 
> Even if possibly there aren't users affected by this problem, we're
> still complicating the API, what's even worst we can't define the size of
> the array in the options array itself like this:
> 
> static AVOption options[]={
>  {" len", NULL, sizeof(options)/sizoef(AVOption),
>  ...
> }
> 
> since it issues an incomplete type error.

{" len", NULL, 123,

will not


> 
> My solution is to set in the item the offset to -1 meaning
> "unspecified", then perform a sort of lazy initialization when
> performing the first av_opt_find():
[...]
> which requires also to eliminate the constness of both:

rejected


> 
>     const struct AVOption *option;
> 
> in log.h:AVClass and of:
> 
> static const AVOption options[]={
> 
> in the various utils.c.
> 

> For this I continue to prefer the solution contemplating a major bump.

We will not bump the major version so people can set
bt=b in the preset files

we could put the whole new code under #if version >= X though

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If a bugfix only changes things apparently unrelated to the bug with no
further explanation, that is a good sign that the bugfix is wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080612/957c28a6/attachment.pgp>



More information about the ffmpeg-devel mailing list