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];
}


> Also, the commit message should state why is this useful.
> And reorder this commit, so that commits which depend on it follow immediately
> after.

Sure.

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

Reply via email to