[FFmpeg-devel] [PATCH] Implement in lavc a flag which makes avcodec_open() to choose the best framerate

Michael Niedermayer michaelni
Mon Sep 22 02:16:28 CEST 2008


On Sun, Sep 21, 2008 at 11:21:23PM +0200, Stefano Sabatini wrote:
> On date Sunday 2008-09-21 22:16:56 +0200, Michael Niedermayer encoded:
> > On Sun, Sep 21, 2008 at 06:52:23PM +0200, Stefano Sabatini wrote:
> > > On date Sunday 2008-09-21 14:09:56 +0200, Michael Niedermayer encoded:
> > > > On Sun, Sep 21, 2008 at 12:52:57PM +0200, Stefano Sabatini wrote:
> > > [...]
> > > > > Index: libavutil/rational.c
> > > > > ===================================================================
> > > > > --- libavutil/rational.c	(revision 15372)
> > > > > +++ libavutil/rational.c	(working copy)
> > > > > @@ -101,3 +101,81 @@
> > > > >  
> > > > >      return a;
> > > > >  }
> > > > > +
> > > > > +int av_is_nearest_q(AVRational q, AVRational q1, AVRational q2)
> > > > > +{
> > > > > +    if (av_cmp_q(q1, q) * av_cmp_q(q, q2) > 0) {
> > > > > +        /* q1 and q2 on the opposite sides of q */
> > > > > +        /* N/D is q, A/B is the median between q1 and q2, A/B > N/D <=> A*D/B > N */
> > > > 
> > > > > +        int64_t x = av_rescale(q1.num * (int64_t)q2.den + q2.num * (int64_t)q1.den, q.den, 2 * (int64_t)q1.den * q2.den);
> > > > 
> > > > the rounding is not correct
> > > 
> > > I see that the type of rounding choosen may change the result of the
> > > comparation if the result isn't exact, but I can't currently figure
> > > out which is the correct one to apply.
> > > 
> > > Can you suggest which should I use?
> > 
> > to test A*D/B > N
> > the left side should be rounded toward inf
> 
> Sorry to insist on this, what if we have:
> 
> X = A*D/B
> X'= rnd(A*D/B, up), X' > X
> X < N but X' > N
> 
> Is this possible at all?

you have a real number r and a integer n
r' = rnd(r) = the smallest element x of Z that is x >= r

if we assume that there exists a r and n for which r < n and r' > n
then by the definition above r' is the smallest element of Z that is >= r
but n < r' and n > r
thus proof by contradiction



> 
> > > > > +        if (((x > q.num ? 1 : x < q.num ? -1 : 0) * av_cmp_q(q2, q1)) > 0)
> > > > > +            return 1;
> > > > > +    }
> > > > 
> > > > > +    /* q1 and q2 on the same side of q */
> > > > > +    else if (av_cmp_q(q, q1) * av_cmp_q(q1, q2) > 0)
> > > > 
> > > > i dont see why these special cases would be needed
> > > 
> > > The first condition:
> > > cmp(M, q) * cmp(q2, q1) == 1 
> > > 
> > > catches both the conditions:
> > > q1 ... q ... M ... q2
> > > M > q && q2 > q1
> > > and 
> > > q2 ... M ... q ... q1
> > > M < q && q2 < q1
> > > 
> > > (x > q.num ? 1 : x < q.num ? -1 : 0) corresponds to cmp(M, q).
> > > 
> > > The second condition:
> > > cmp(q, q1) * cmp(q1, q2) ==  1
> > > cathes both the conditions:
> > > q2 ... q1 ... q
> > > q > q1 && q1 > q2
> > > and 
> > > q ... q1 ... q2
> > > q < q1 && q1 < q2
> > > 
> > > I can't see how to simplify this...
> > 
> > what is the problem with the code for the first case handling the second?
> 
> Uh?
> 
> 1 if (q1 and q2 on opposite sides of q)
> 2    if (q1 nearest than q2)  // opposite sides context
> 3       return 1;
> 4 else // q1 and q2 are on the same side of q
> 5    if (q1 nearest than q2) // same side context)
> 6       return 1;
> 7 return 0;
> 
> Checks at points 1, 2 and 5 test different things, so I don't see how
> it would be possible to reuse the code of one test for another
> one. You we could make them parametric, but I'm not sure that would
> simplify the code, rather it would make it more obfuscated.
> 
> But I feel like I'm misunderstanding your point...

you have 2 point q1 and q2, the point exactly between them seperate
the 2 areas where q1 and q2 are closer.
Thus the code that finds out on whoch side of this seperating line q is
is sufficient and does not need a second special case to handly the case
of q1 and q2 being of the same side of q

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

I know you won't believe me, but the highest form of Human Excellence is
to question oneself and others. -- Socrates
-------------- 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/20080922/cbf131cf/attachment.pgp>



More information about the ffmpeg-devel mailing list