[FFmpeg-devel] [PATCH] mxfdec: make it work with other calling conventions

Baptiste Coudurier baptiste.coudurier
Wed Jun 30 01:47:32 CEST 2010


On 6/29/10 2:35 PM, Reimar D?ffinger wrote:
> On Tue, Jun 29, 2010 at 01:02:05PM -0700, Baptiste Coudurier wrote:
>> On 6/29/10 11:51 AM, Reimar D?ffinger wrote:
>>> On Tue, Jun 29, 2010 at 08:30:01PM +0200, Reimar D?ffinger wrote:
>>>> Hello,
>>>> currently mxfdec assumes that it can unpunished pass more arguments to functions
>>>> than they were declared with.
>>>> This is not true in general, in particular not for stdcall.
>>>> While I am not aware of any FFmpeg platform using it, IMHO this code is still
>>>> wrong.
>>>> Attached is a patch that fixes it, and I think it is not particularly bad.
>>>> It also fixes the last remaining warnings ("function declaration is not a prototype")
>>>> in that file.
>>
>> I don't have this warning.
>> gcc version 4.4.4 (Ubuntu 4.4.4-6ubuntu2)
>
> Right, I had been using -Wstrict-prototypes
>
>>> +#define METADATA_READ_FUNC(name) int name(void *arg, ByteIOContext *pb, int tag, int size, UID uid)
>>
>> I don't like the #define.
>
> Well, the alternative is having to change every single read function
> manually in case you'd ever need an additional parameter.
> And I found it very hard to find them.

And when you add a new function, you have to look up for the define to 
know which parameters are available. This is even more painful.

>>> @@ -919,11 +931,14 @@
>>>               url_fseek(s->pb, klv.offset, SEEK_SET);
>>>               break;
>>>           }
>>> +        if (IS_KLV_KEY(klv.key, mxf_primer_pack_key)) {
>>> +            mxf_read_primer_pack(mxf);
>>> +            continue;
>>> +        }
>>>
>>>           for (metadata = mxf_metadata_read_table; metadata->read; metadata++) {
>>>               if (IS_KLV_KEY(klv.key, metadata->key)) {
>>> -                int (*read)() = klv.key[5] == 0x53 ? mxf_read_local_tags : metadata->read;
>>> -                if (read(mxf,&klv, metadata->read, metadata->ctx_size, metadata->type)<   0) {
>>> +                if (mxf_read_local_tags(mxf,&klv, metadata->read, metadata->ctx_size, metadata->type)<   0) {
>>
>> This mechanism makes it easier to add new functions.
>> Several metadata use 0x53 and it is needed later.
>
> Could I get that in understandable?
> klv.key[5] == 0x53 is true for all except one, and even if it was a
> second table would not be that much additional code, without having
> to rely on key[5] corresponding to what the code needs to do.
> The alternative is to change the signature of mxf_read_primer_pack to
> match mxf_read_local_tags.

The contrary, next time we add a function parsing metadata not using 
0x53, we will need an ugly if (key), and index tables do not use 0x53 
for example.

So the alternative solution is prefered.

-- 
Baptiste COUDURIER
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                                  http://www.ffmpeg.org



More information about the ffmpeg-devel mailing list