Linking with FFmpeg

Ali Çehreli acehreli at yahoo.com
Sun Jan 6 09:43:11 PST 2013


On 01/06/2013 01:48 AM, MrOrdinaire wrote:

 > My question is how this function declaration is written in D.
 > int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
 > int w, int h, enum AVPixelFormat pix_fmt, int align);

1) No array is passed to a function as-is in C. Even though there seem 
to be arrays of 4 elements above, they are both passed as pointers to 
their first elements. (That 4 has no bearing at all.)

2) uint8_t *pointers[4] means an array of elements of type 'uint8_t*'.

3) int linesizes[4] means an array of ints.

4) uint8_t and friends are defined in the std.stdint module in Phobos.

5) enum should not be used in that signature in D.

6) align is a keyword and cannot be used.

This is the declaration of that function in D:

extern(C)
int av_image_alloc(uint8_t** pointers, int* linesizes,
                    int w, int h, AVPixelFormat pix_fmt, int alignment);


Here is a program that I used to test it:

import std.stdint;

extern(C)
{

enum AVPixelFormat
{
     one, two
}

int av_image_alloc(uint8_t** pointers, int* linesizes,
                    int w, int h, AVPixelFormat pix_fmt, int alignment);

}

void main()
{
     uint8_t ui0 = 7;
     uint8_t ui1 = 8;

     uint8_t*[] pointers = [ &ui0, &ui1 ];

     // Ditto
     int[] linesizes = [ 20, 30, 40 ];

     int result = av_image_alloc(pointers.ptr, linesizes.ptr,
                                 44, 55, AVPixelFormat.two, 100);

     assert(result == 42);
}

I tested it with the following C file:

#include <stdint.h>
#include <assert.h>

enum AVPixelFormat
{
     AVPixelFormat_one, AVPixelFormat_two
};

int av_image_alloc(uint8_t *pointers[4], int linesizes[4],
                    int w, int h, enum AVPixelFormat pix_fmt, int align)
{
     assert(*pointers[0] == 7);
     assert(*pointers[1] == 8);

     assert(linesizes[0] == 20);
     assert(linesizes[1] == 30);
     assert(linesizes[2] == 40);

     assert(w == 44);
     assert(h == 55);

     assert(pix_fmt == AVPixelFormat_two);
     assert(align == 100);

     return 42;
}

I compiled the C file like this:

$ gcc -c deneme.c

Then compiled the D program like this (note that the C .o was in a 
different directory):

$ dmd ../c/deneme.o deneme.d

And ran it like this:

$ ./deneme

All assertions passed. Yay! :)

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:

int main()
{
     uint8_t ui0 = 7;
     uint8_t ui1 = 8;

     // Deliberately 10 (not 4) to prove a point
     uint8_t* pointers[10] = { &ui0, &ui1 };

     // Ditto
     int linesizes[10] = { 20, 30, 40 };

     av_image_alloc(pointers, linesizes, 44, 55, AVPixelFormat_two, 100);
}



More information about the Digitalmars-d-learn mailing list