Toon posts:

[Kylix/Delphi] C code omzetten naar pascal code

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig om C code om te zetten naar pascal code.

Alleen nu kom ik dit tegen:

C:
1
2
#define v4l2_fourcc(a,b,c,d) \
        (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))


Dit zeg mij dus niks (ja het heet een macro geloof ik in C).

Die '<<' betekent dat iets van SHL?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:39

Janoz

Moderator Devschuur®

!litemod

Het lijkt er op dat hier 4 bytes acter elkaar worden gezet in 1 dword..

u32 staat (waarschijnlijk) voor een unsigned 32bit integer. a word 0 posities verplaatst, b vervolgens 8 en door de bitwise or wordt ie er als het ware naast gezet.
Dit is eigenlijk gelijk aan:
code:
1
2
3
4
5
6
7
function v412_fourcc(a,b,c,d) Begin
  int32 = a;
  int32 = int32 + (256 * b);
  int32 = int32 + (256*256 * c);
  int32 = int32 + (256*256*256 *c);
  v412_fourcc = int32;
end;

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

janoz: het was v4L2_fourcc (), geen 1 ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Onno
  • Registratie: Juni 1999
  • Niet online
Verwijderd schreef op 16 May 2003 @ 10:25:
Die '<<' betekent dat iets van SHL?
Ja, en | is or. Je kunt dus gewoon hetzelfde doen in Pascal, waardoor je al die vermenigvuldigingen van Janoz niet nodig hebt. :)

Verwijderd

Topicstarter
Dus het wordt dit:

Delphi:
1
  V4L2_PIX_FMT_RGB332 = DWORD(Ord('R')) or DWORD(Ord('G') SHL 8) or DWORD(Ord('B') SHL 16) or DWORD(Ord('1') SHL 24);

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Oke bedankt allemaal.

Verwijderd

Topicstarter
Ik heb nog 2 vragen:

In c gebruikt men __u64, maarik kan in delphi/kylix alleen Signed 64 bit integer vinden (Int64). Hoe kan ik dat oplossen?

In c gebruikt men:

C:
1
2
3
4
5
6
7
8
  struct ......
  {
    __u32 index;
    union
    {
       __u32 offset;
    }
  }

Een struct is gewoon een record in Delphi/Kylix. Maar wat is de vervanger van union voor Delphi/Kylix?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je kan een signed getal natuurlijk in een unsigned stoppen. Het werkt hetzelfde, als je maar goed oppast bij het vergelijken met constanten en het weergeven.

Een union kan in Delphi vervangen worden door een variant record:
Delphi:
1
2
3
4
5
6
7
8
9
10
type

  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
  TFigure = record
    case TShapeList of
      Rectangle: (Height, Width: Real);
      Triangle: (Side1, Side2, Angle: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
  end;

[ Voor 26% gewijzigd door LordLarry op 22-05-2003 09:20 ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

In pascal is de operator voor bitshifts shl voor schuiven van bits links en shr voor... je raad het al: bitshift rechts.

Misschien ten overvloede, de macro die je bent tegengekomen neemt een long als parameter en stopt het least significant byte in a. Het most significant byte wordt tenslotte in d gestopt.

In effect splitst het dus een long in 4 bytes. (Four CC is een kleurcodering)

Tip: Heb je al gekeken in de VCL source of Borland al niet een soortgelijke macro heeft opgenomen voor Delphi / Pascal? Vaak staan daar een heel hoop nuttige functies, vaak ook niet gedocumenteerd.

Jurrian de Valk
Sereon Technology
www.sereon.com

Verwijderd

Topicstarter
Een union is dus variant in Delphi/Kylix.

Alleen in c heb ik deze code:

C:
1
2
3
4
5
6
7
8
9
10
11
struct v4l2_format
{
   enum v4l2_buf_type type;
   union
   {
      struct v4l2_pix_format pix;
      struct v4l2_vbi_format vbi;
      struct v4l2_vbi_format vbi;
      __u8 raw_data[200];
   } fmt;
}


Dat union stuk is dus te benaderen via fmt, maar er is hier toch geen sprake van een "TShapeList type" zoals in jouw voorbeeld?

[ Voor 12% gewijzigd door Verwijderd op 22-05-2003 20:17 ]


Verwijderd

Topicstarter
Ik heb nu de record omgevormd tot:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  TV4l2_Buf_Type = (V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
                                V4L2_BUF_TYPE_VIDEO_OVERLAY = 3, V4L2_BUF_TYPE_VBI_CAPTURE = 4,
                                V4L2_BUF_TYPE_VBI_OUTPUT = 5, V4L2_BUF_TYPE_PRIVATE = 0x80);


  PV4l2_Format = ^TV4l2_Format;
  TV4l2_Format = packed record
    BufType: TV4l2_Buf_Type;
    case TV4l2_Buf_Type of
      V4L2_BUF_TYPE_VIDEO_CAPTURE: (Pix: PV4l2_Pix_Format);
      V4L2_BUF_TYPE_VIDEO_OVERLAY: (Win: PV4l2_Window);
      V4L2_BUF_TYPE_VBI_CAPTURE: (Vbi: PV4l2_Vbi_Format);
      V4L2_BUF_TYPE_PRIVATE: (Raw_Data: array[0..199] of Char);
  end;

En dit is hoe ik de variant record gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var V4l2_Format: PV4l2_Format;

  // Stel het formaat in
  V4l2_Format := AllocMem(SizeOf(V4l2_Format^));
  try
    V4l2_Format.BufType := V4L2_BUF_TYPE_VIDEO_CAPTURE;
    V4l2_Format.Pix := AllocMem(SizeOf(TV4l2_Pix_Format));
    try
      if ioctl(fd, VIDIOC_G_FMT, V4l2_Format) <> 0 then
        ShowMessage('Error bij VIDIOC_G_FMT ' + IntToStr(errno));

      V4l2_Format.Pix.Width := 640;
      V4l2_Format.Pix.Height := 480;
      V4l2_Format.Pix.PixelFormat := V4L2_PIX_FMT_RGB32;
      V4l2_Format.Pix.Field := V4L2_FIELD_ANY;
      V4l2_Format.Pix.BytesPerLine := 640 * 4;
      V4l2_Format.Pix.SizeImage := 640 * 4 * 480;
      //V4l2_Format.Pix.ColorSpace := ;
      V4l2_Format.Pix.Priv := 0;

      if ioctl(fd, VIDIOC_S_FMT, V4l2_Format) <> 0 then
        ShowMessage('Error bij VIDIOC_S_FMT ' + IntToStr(errno));
    finally
      FreeMem(V4l2_Format.Pix);
    end;
  finally
    FreeMem(V4l2_Format);
  end;

Alleen als ik deze record meestuur met IOCTL dan krijg een invalid argument fout.

Ik vermoed dat er een fout zit in dit record (denk bij het variant gedeelte), maar ik zie hem niet?

[ Voor 37% gewijzigd door Verwijderd op 24-05-2003 20:14 ]


Verwijderd

Topicstarter
Niemand?

(Het probleem is dat ik geen kennis heb van C en daarom ook niet precies kan weten wat hier fout aan kan zijn. Tevens is er niks te vinden over V4L i.c.m. Kylix).

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 26 mei 2003 @ 12:23:
Niemand?

(Het probleem is dat ik geen kennis heb van C en daarom ook niet precies kan weten wat hier fout aan kan zijn. Tevens is er niks te vinden over V4L i.c.m. Kylix).
Ik gok dat je het variant deel van fmt moet af laen hangen.

Dus
union {...} fmt word iets ala
case fmt of
...
end;
Buftype is zo te zien een normaal onderdeel van de struct/record.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Je recordstructuur zou er volgens mij als volgt moeten uitzien:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type
  TV4l2_Buf_Type = (V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
    V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
    V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
    V4L2_BUF_TYPE_VBI_CAPTURE = 4,
    V4L2_BUF_TYPE_VBI_OUTPUT = 5,
    V4L2_BUF_TYPE_PRIVATE = 0x80);


  PV4l2_Format = ^TV4l2_Format;
  TV4l2_Format = packed record
    case BufType: TV4l2_Buf_Type of
      V4L2_BUF_TYPE_VIDEO_CAPTURE: (Pix: PV4l2_Pix_Format);
      V4L2_BUF_TYPE_VIDEO_OVERLAY: (Win: PV4l2_Window);
      V4L2_BUF_TYPE_VBI_CAPTURE: (Vbi: PV4l2_Vbi_Format);
      V4L2_BUF_TYPE_PRIVATE: (Raw_Data: array[0..199] of Char);
  end;

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Creepy schreef op 26 mei 2003 @ 15:28:Ik gok dat je het variant deel van fmt moet af laen hangen.
Maar van welk type is fmt dan?
tomatoman schreef op 26 mei 2003 @ 15:40:
Je recordstructuur zou er volgens mij als volgt moeten uitzien:
Helaas geeft dit nog steeds dezelfde fout,

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 26 May 2003 @ 19:24:
[...]
Maar van welk type is fmt dan?
Mijn fout.. dat was dus onzin ;) Wat je zelf al hebt is opzich prima. Heb alleen geen idee waarom het nog zou crashen.. i

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1