Linking with FFmpeg

Johannes Pfau nospam at example.com
Sun Jan 6 10:39:31 PST 2013


Am Sun, 06 Jan 2013 09:43:11 -0800
schrieb Ali Çehreli <acehreli at yahoo.com>:

> 
> Ali
> 
> P.S. To prove the point that that 4 in the signature has no meaning,
> I tested the C function also with the following C program:

With C's arrays are pointers thing, that might be true. But the
signature (and ffmpeg) documentation suggest that the av_image_alloc
function will always write 4 ubyte* pointers to the pointers parameter.
So you can't use an array smaller than 4 pointers. You can use more, as
it doesn't matter for the ABI, but av_image_alloc will only use 4
pointers.

So I'd argue that ((ubyte*)[4])* is better as a type than ubyte** as it
allows the D compiler to do more checks. And the Interfacing to C page
recommends using ref for static arrays instead of a pointer, as that
allows using the code as in C:

void av_image_alloc(ref (ubyte*)[4]);
(ubyte*)[4] ptr;
av_image_alloc(ptr);

void av_image_alloc((ubyte*)[4]*);
(ubyte*)[4] ptr;
av_image_alloc(&ptr); //need &

void av_image_alloc(ubyte**);
(ubyte*)[3] ptr;
ubyte* test; //overwritten, BUG!
av_image_alloc(&ptr); //need &, and accepts to small arrays, bug prone



More information about the Digitalmars-d-learn mailing list