[FFmpeg-devel] [PATCH 10/10] Document how av_cmp_q() deal when one of the values to be compared is 0/0.

Michael Niedermayer michaelni
Sun Oct 3 23:37:19 CEST 2010


On Sun, Oct 03, 2010 at 11:07:22PM +0200, Stefano Sabatini wrote:
> On date Saturday 2010-10-02 21:56:49 +0200, Michael Niedermayer encoded:
> > On Fri, Oct 01, 2010 at 09:16:55AM +0200, Tomas H?rdin wrote:
> > > On Thu, 2010-09-30 at 23:58 +0200, Michael Niedermayer wrote:
> > > > On Thu, Sep 30, 2010 at 09:45:41PM +0200, Stefano Sabatini wrote:
> > > > > ---
> > > > >  libavutil/rational.h |    4 ++++
> > > > >  1 files changed, 4 insertions(+), 0 deletions(-)
> > > > > 
> > > > > diff --git a/libavutil/rational.h b/libavutil/rational.h
> > > > > index 2dd0c2c..bd2e711 100644
> > > > > --- a/libavutil/rational.h
> > > > > +++ b/libavutil/rational.h
> > > > > @@ -41,6 +41,10 @@ typedef struct AVRational{
> > > > >  
> > > > >  /**
> > > > >   * Compare two rationals.
> > > > > + * If one of the compared values is 0/0, the result of the comparison
> > > > > + * is always 0, so you should do an explicit check for that case
> > > > > + * rather than use this function.
> > > > 
> > > > is there any return value that would in any case avoid an additional check?
> > > 
> > > Perhaps AVERROR_INVALIDDATA?
> > 
> > I think that if we do detect NAN then the most sensible value to return would
> > be INT_MIN because INT_MIN == -INT_MIN thus in some sense it is the best
> > non zero element that has both + and -
> 
> Check attached patch. I have a slightly preference for the first patch
> I sent, as I like the idea of having a special value which results
> equal to all other rationals (0/0), also I fear that people may do
> something of the kind:
> if (av_cmp_q(...) < 0)
> 
> in which case returning -INT_MIN with 0/0 will fail. On the other hand
> I have no strong objection, so if Michael prefer this form I won't
> object.
> 
> Regards.
> -- 
> FFmpeg = Freak Fabulous Mean Prodigious Eretic Gigant

>  rational.h |    5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 3a4323eb3fa490c69b78a1c662132d36ef75d66e  0004-Add-a-special-case-for-av_cmp_q-when-one-of-the-valu.patch
> From 9de2a819d33b0a5f35315ac07a2df2b22c6e86fb Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> Date: Thu, 30 Sep 2010 21:42:56 +0200
> Subject: [PATCH 04/13] Add a special case for av_cmp_q() when one of the values to be
>  compared is 0/0.
> 
> ---
>  libavutil/rational.h |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
> 
> diff --git a/libavutil/rational.h b/libavutil/rational.h
> index 21542a8..e9933f4 100644
> --- a/libavutil/rational.h
> +++ b/libavutil/rational.h
> @@ -43,9 +43,12 @@ typedef struct AVRational{
>   * Compare two rationals.
>   * @param a first rational
>   * @param b second rational
> - * @return 0 if a==b, 1 if a>b and -1 if a<b
> + * @return 0 if a==b, 1 if a>b, -1 if a<b, and INT_MIN if one of the
> + * values is of the form 0/0
>   */
>  static inline int av_cmp_q(AVRational a, AVRational b){
> +    if (a.num == 0 && a.den == 0 || b.num == 0 && b.den == 0)
> +        return INT_MIN;
>      const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;

you mix declaration and statement
i dont care but gcc 2.95 will hate you and maybe some other obscure compilers

[...]
-- 
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: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101003/20fc0891/attachment.pgp>



More information about the ffmpeg-devel mailing list