Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
July 09, 2015 Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Given extern(C): struct AVFrame { uint8_t*[AV_NUM_DATA_POINTERS] data; int[AV_NUM_DATA_POINTERS] linesize; int width, height; ... } void av_image_copy(ubyte *[4] dst_data, int[4] dst_linesizes, const ubyte *[4] src_data, const int[4] src_linesizes, AVPixelFormat pix_fmt, int width, int height) will `dst_data` will be C-ABI-fed to `image_copy()` as a C-style single pointer in constrast to what happens in D which calls it as fixed-size (4) array of ubyte-pointers? Further, is it correct to use it in D as void copyVideo(const AVFrame* source, AVFrame* target) { av_image_copy(target.data[0 .. 4], target.linesize[0 .. 4], source.data[0 .. 4], source.linesize[0 .. 4], format, source.width, source.height); } ? It compiles without warnings, at least. I haven't been able to test it yet, though. |
July 09, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | On Thursday, 9 July 2015 at 15:19:41 UTC, Nordlöw wrote:
> uint8_t*[AV_NUM_DATA_POINTERS] data;
> int[AV_NUM_DATA_POINTERS] linesize;
Forgot
enum AV_NUM_DATA_POINTERS = 8;
|
July 09, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nordlöw | On 07/09/2015 05:19 PM, "Nordlöw" wrote:
> Given
>
> extern(C):
>
> struct AVFrame
> {
> uint8_t*[AV_NUM_DATA_POINTERS] data;
> int[AV_NUM_DATA_POINTERS] linesize;
> int width, height;
> ...
> }
>
> void av_image_copy(ubyte *[4] dst_data, int[4] dst_linesizes,
> const ubyte *[4] src_data, const int[4]
> src_linesizes,
> AVPixelFormat pix_fmt, int width, int height)
>
>
> will `dst_data` will be C-ABI-fed to `image_copy()` as a C-style single
> pointer in constrast to what happens in D which calls it as fixed-size
> (4) array of ubyte-pointers?
No. You'll need explicit pass by reference on the D side.
|
July 09, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timon Gehr | On Thursday, 9 July 2015 at 16:12:27 UTC, Timon Gehr wrote:
> No. You'll need explicit pass by reference on the D side.
So, how should I modify my call to `image_copy` with respect to the four first parameters?
|
July 09, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Per Nordlöw | On Thursday, 9 July 2015 at 17:11:36 UTC, Per Nordlöw wrote: > On Thursday, 9 July 2015 at 16:12:27 UTC, Timon Gehr wrote: >> No. You'll need explicit pass by reference on the D side. > > So, how should I modify my call to `image_copy` with respect to the four first parameters? In C, array parameters are the same as pointers; i.e. `foo(T[] arg)` is the same as `foo(T* arg)` [1]. You should just be able to replace `[4]` with `*` in the arguments. [1]: http://stackoverflow.com/a/5573741/646619 |
July 10, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alex Parrill | On Thursday, 9 July 2015 at 17:42:33 UTC, Alex Parrill wrote: > On Thursday, 9 July 2015 at 17:11:36 UTC, Per Nordlöw wrote: >> On Thursday, 9 July 2015 at 16:12:27 UTC, Timon Gehr wrote: >>> No. You'll need explicit pass by reference on the D side. >> >> So, how should I modify my call to `image_copy` with respect to the four first parameters? > > In C, array parameters are the same as pointers; i.e. `foo(T[] arg)` is the same as `foo(T* arg)` [1]. > > You should just be able to replace `[4]` with `*` in the arguments. > > [1]: http://stackoverflow.com/a/5573741/646619 Static arrays in C function parameter lists should be declared as ref on the D side. See "Passinbg D Array Arguments to C Functions" at [1]. So the function declaration above in D should be: void av_image_copy(ref ubyte *[4] dst_data, ref int[4] dst_linesizes, ref const ubyte *[4] src_data, ref const int[4] src_linesizes, AVPixelFormat pix_fmt, int width, int height) [1]http://dlang.org/interfaceToC.html |
July 10, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Friday, 10 July 2015 at 03:18:23 UTC, Mike Parker wrote:
>> You should just be able to replace `[4]` with `*` in the arguments.
>
> [1]http://dlang.org/interfaceToC.html
Great!
One more thing: How shall my call to `avg_image_copy()` (from D) look then? Is the slicing syntax `[0 .. 4]` I use above as
av_image_copy(target.data[0 .. 4], target.linesize[0 .. 4],
source.data[0 .. 4], source.linesize[0 .. 4],
format, source.width, source.height);
the best way?
|
July 10, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Friday, 10 July 2015 at 03:18:23 UTC, Mike Parker wrote:
> [1]http://dlang.org/interfaceToC.html
Is there any tool out there that automatically creates D wrappers from C headers`?
|
July 10, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Per Nordlöw | On Friday, 10 July 2015 at 08:42:06 UTC, Per Nordlöw wrote: > On Friday, 10 July 2015 at 03:18:23 UTC, Mike Parker wrote: >> [1]http://dlang.org/interfaceToC.html > > Is there any tool out there that automatically creates D wrappers from C headers`? https://github.com/jacob-carlborg/dstep ? |
July 10, 2015 Re: Fixed Length Array Syntax in extern(C) Function Signatures | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrea Fontana | On Friday, 10 July 2015 at 08:54:57 UTC, Andrea Fontana wrote:
>> Is there any tool out there that automatically creates D wrappers from C headers`?
>
> https://github.com/jacob-carlborg/dstep ?
Great! I'll try that!
|
Copyright © 1999-2021 by the D Language Foundation