Оболочка С# для массива из трех указателей

В настоящее время я работаю над оболочкой C# для работы с Dallmeier Common API light.
См. предыдущую публикацию: Оболочка C# и обратные вызовы

У меня почти все «обернуто», но я застрял в обертке обратного вызова, который содержит массив из трех указателей и массив целых чисел:

dlm_setYUVDataCllback

int(int SessionHandle, void (*callback) (long IPlayerID, unsigned char** yuvData,  
    int* pitch, int width, int height, int64_t ts, char* extData))  

Функция Установить обратный вызов для получения текущего изображения YUV.
Аргументы SessionHandle: дескриптор текущего сеанса.
Вернуть PlayerID (см. обратный вызов ).
Обратный вызов - IPlayerId: идентификатор объекта Player
- yuvData: массив из трех указателей на Y, U и V часть изображения
Используемый формат YUV - планарный YUV420 (не упаковано).
char *y = yuvData[0];
char *u = yuvData[1];
char *v = yuvData[2];
- высота тона: массив целых чисел для шагов для частей Y, U и V изображения
- ширина: внутренняя ширина изображения.
- высота
- ts : метка времени текущего кадра
- extData: дополнительные данные для кадра

Как мне обернуть это в С#?

Любая помощь очень ценится.


person fergs    schedule 15.03.2010    source источник


Ответы (1)


unsigned char** yuvData следует определить как [MarshalAs(UnmanagedType.ByValArray,SizeConst=3)] IntPtr[] yuvData

Затем вы получите массив из 3 IntPtrs. Вы можете прочитать фактические данные, используя Marshal.Read или Marshal.Copy.

person logicnp    schedule 15.03.2010
comment
Спасибо logcnp. Просто продолжая это, я создал структуру с параметрами, как указано выше, но что должно быть «Int64_t» в С#, и я использую тот же MashalAs для «шага», который также является массивом целых чисел, например [MarshalAs(UnmanagedType.ByValArray,SizeConst=1)] шаг IntPtr[] - person fergs; 16.03.2010
comment
int64_t должен быть определен как длинный (который также является 64-битным в С#). Что касается шага, ваше определение верно, если «шаг» является одномерным массивом. - person logicnp; 16.03.2010
comment
Как и где я могу использовать Marshal.Read или Marshal.Copy - person fergs; 19.03.2010
comment
@logicnp: я думаю, вы имели в виду UnmanagedType.LPArray. ByValArray допустим только для полей структуры. - person Mattias S; 08.04.2010