On Mon, 13 Jan 2014 18:00:17 +0100, Luca Barbato <[email protected]> wrote:
> On 13/01/14 15:49, Anton Khirnov wrote:
> > 
> > On Wed,  8 Jan 2014 03:25:39 +0100, Luca Barbato <[email protected]> wrote:
> >> From: Matthieu Bouron <[email protected]>
> >>
> >> Signed-off-by: Luca Barbato <[email protected]>
> >> ---
> >>  libavformat/mxf.c | 33 +++++++++++++++++++++++++++++++++
> >>  libavformat/mxf.h |  7 +++++++
> >>  2 files changed, 40 insertions(+)
> >>
> >> diff --git a/libavformat/mxf.c b/libavformat/mxf.c
> >> index 040d8a2..e51106f 100644
> >> --- a/libavformat/mxf.c
> >> +++ b/libavformat/mxf.c
> >> @@ -104,3 +104,36 @@ int ff_mxf_decode_pixel_layout(const char 
> >> pixel_layout[16], enum AVPixelFormat *
> >>  
> >>      return -1;
> >>  }
> >> +
> >> +static const MXFSamplesPerFrame mxf_spf[] = {
> >> +    { { 1001, 24000 }, { 2002, 0,    0,    0,    0,    0 } }, // FILM 
> >> 23.976
> >> +    { { 1, 24},        { 2000, 0,    0,    0,    0,    0 } }, // FILM 24
> >> +    { { 1001, 30000 }, { 1602, 1601, 1602, 1601, 1602, 0 } }, // NTSC 
> >> 29.97
> >> +    { { 1001, 60000 }, { 801,  801,  801,  801,  800,  0 } }, // NTSC 
> >> 59.94
> >> +    { { 1, 25 },       { 1920, 0,    0,    0,    0,    0 } }, // PAL 25
> >> +    { { 1, 50 },       { 960,  0,    0,    0,    0,    0 } }, // PAL 50
> >> +};
> >> +
> >> +const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s,
> >> +                                                       AVRational 
> >> time_base)
> >> +{
> >> +    int i;
> >> +    for (i = 0; i < FF_ARRAY_ELEMS(mxf_spf); i++) {
> >> +        if (!av_cmp_q(mxf_spf[i].time_base, time_base))
> >> +            return &mxf_spf[i];
> >> +    }
> >> +
> >> +    /* Find closest container time base for approximative codec time base 
> >> like
> >> +     * 1/29.97, 1/30, ... */
> >> +    for (i = 0; i < FF_ARRAY_ELEMS(mxf_spf); i++) {
> >> +        if (fabs(av_q2d(mxf_spf[i].time_base) - av_q2d(time_base)) < 
> >> 0.0001) {
> > 
> > float-based (and thus platform-dependent) guessing like this in a demuxer is
> > bound to lead to trouble later.
> > Please change this to pure integer (using suitable functions from 
> > rational.h)
> > 
> 
> Something alike
> 
> static const MXFSamplesPerFrame mxf_spf[] = {
>     { { 1001, 24000 }, { 2002, 0,    0,    0,    0,    0 } }, // FILM 23.976
>     { { 1, 24},        { 2000, 0,    0,    0,    0,    0 } }, // FILM 24
>     { { 1001, 30000 }, { 1602, 1601, 1602, 1601, 1602, 0 } }, // NTSC 29.97
>     { { 1001, 60000 }, { 801,  801,  801,  801,  800,  0 } }, // NTSC 59.94
>     { { 1, 25 },       { 1920, 0,    0,    0,    0,    0 } }, // PAL 25
>     { { 1, 50 },       { 960,  0,    0,    0,    0,    0 } }, // PAL 50
> };
> 
> static const AVRational mxf_time_base {
>     { 1001, 24000 },
>     { 1, 24},
>     { 1001, 30000 },
>     { 1001, 60000 },
>     { 1, 25 },
>     { 1, 50 },
>     { 0, 0}
> }
> 
> const MXFSamplesPerFrame *ff_mxf_get_samples_per_frame(AVFormatContext *s,
>                                                        AVRational time_base)
> {
>     int idx = av_find_nearest_q_idx(time_base, &mxf_time_base);
> 
>     if (av_cmp_q(av_sub_q(time_base, mxf_time_base[idx]),
>                  (AVRational){1, 1000}) < 0)
>         return NULL;
> 
>     if (av_cmp_q(time_base, mxf_time_base[i])
>         av_log(s, AV_LOG_WARNING,
>                "%d/%d input time base matched %d/%d container time base\n",
>                time_base.num, time_base.den,
>                mxf_spf[i].time_base.num,
>                mxf_spf[i].time_base.den);
> 
>     return &mxf_spf[i];

Yes, mostly along those lines.
Don't forget to take the absolute value of the difference.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to