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
