Toon posts:

[Kylix] Video4Linux interface

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik moet voor een bepaald project capture's maken i.c.m. Kylix 3.

Nu heb je onder linux de Video4Linux interface waarmee je de capture kaart kan aansturen. Echter deze API's zijn allemaal in C geschreven en wij gebruiken hier Kylix (de delphi interface).

Ik heb al een tijd gezocht op het internet maar ik kan nergens een conversie unit vinden. Ik ben zelf ook al even bezig geweest om te kijken of ik het zelf kan omzetten. Maar het probleem is dat ik te weinig c kennis daarvoor beschik.

Is er misschien iemand die ook bezig geweest is met V4L en een unit heeft gevonden waarmee je rechtstreeks de API calls kan aanspreken?

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 10:21

Exirion

Gadgetfetisjist

Ik heb Kylix versie 3 nog niet bekeken maar Kylix zou naast een Object Pascal compiler toch ook een C++ compiler krijgen zodat het zowel Delphi als C++ Builder kan vervangen?

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


Verwijderd

Topicstarter
Exirion schreef op 25 February 2003 @ 15:47:
Ik heb Kylix versie 3 nog niet bekeken maar Kylix zou naast een Object Pascal compiler toch ook een C++ compiler krijgen zodat het zowel Delphi als C++ Builder kan vervangen?
Klopt maar wij programmeren dus in de delphi versie van kylix en niet in de c versie.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23-08 21:27

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 25 February 2003 @ 15:48:
[...]
Klopt maar wij programmeren dus in de delphi versie van kylix en niet in de c versie.
De header files opzich zijn vrij makkelijk om te zetten naar Pascal hoor.. ik gok dat er vast wel een V4L Kylix variant te vinden is.. En anders zul je zelf de boel moeten omzetten...als je een klein beetje C kan is dat dus niet eens zo moeilijk.

"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


Verwijderd

Topicstarter
Nou ik krijg te maken met dingen zoals:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
  struct video_channel
  {
          int channel;
          char name[32];
          int tuners;
          __u32  flags;
  #define VIDEO_VC_TUNER          1       /* Channel has a tuner */
  #define VIDEO_VC_AUDIO          2       /* Channel has audio */
          __u16  type;
  #define VIDEO_TYPE_TV           1
  #define VIDEO_TYPE_CAMERA       2
          __u16 norm;                     /* Norm set by channel */
  };


bijvoorbeeld __u32 zegt mij niks.

  • Exirion
  • Registratie: Februari 2000
  • Laatst online: 10:21

Exirion

Gadgetfetisjist

Verwijderd schreef op 25 februari 2003 @ 16:24:
bijvoorbeeld __u32 zegt mij niks.
Da's gewoon een 32-bits unsigned integer (dword). Die __u16 dus een 16-bits unsigned integer (word).

"Logica brengt je van A naar B, verbeelding brengt je overal." - Albert Einstein


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23-08 21:27

Creepy

Tactical Espionage Splatterer

zo te zien is het een unsigned 32 bit integer, maar dit is vast wel op ze zoeken in de documentatie van de desbetreffende compiler (wilde gok: GCC).

"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


Verwijderd

Topicstarter
Bedankt,

ik ga het maar gewoon proberen, misschien dat het gaat lukken....

Verwijderd

Topicstarter
Ik heb de C code inmiddels omgezet naar kylix (pascal).

Maar het werkt nog niet echt lekker. Volgens mij klopt er iets niet met de datatypen.

Dit is de c code:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
The video capture card is represented by /dev/video0.
        fd = open("/dev/video0", O_RDONLY)

Get information on the capability of the video device.
        struct video_capability cap
        ioctl(fd, VIDIOCGCAP, ?)

#define VIDIOCGCAP              _IOR('v',1,struct video_capability)     /* Get capabilities */

struct video_capability
{
        char name[32];
        int type;
        int channels;   /* Num channels */
        int audios;     /* Num audio devices */
        int maxwidth;   /* Supported width */
        int maxheight;  /* And height */
        int minwidth;   /* Supported width */
        int minheight;  /* And height */
};


Kylix:

Delphi:
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
29
  PVideo_Capability = ^TVideo_Capability;
  TVideo_Capability = record
    Name: String[32];
    VideoType: Integer;
    Channels: Integer;
    Audios: Integer;
    MaxWidth: Integer;
    MaxHeight: Integer;
    MinWidth: Integer;
    MinHeight: Integer;
  end;

  VIDIOCGCAP    := __IOR(Ord('v'), 1, SizeOf(TVideo_Capability)); // Get capabilities

  // The video capture card is represented by /dev/video0.
  fd := open('/dev/video0', O_RDONLY);

  //FillChar(Video_Capability, SizeOf(Video_Capability), #0);
  // Get information on the capability of the video device.
  ioctl(fd, VIDIOCGCAP, Video_Capability);

  edt_VideoCapabilityNaam.Text := Video_Capability^.Name;
  edt_VideoCapabilityVideoType.Text := IntToStr(Video_Capability^.VideoType);
  edt_CapChannels.Text := IntToStr(Video_Capability^.Channels);
  edt_CapAudios.Text := IntToStr(Video_Capability^.Audios);
  edt_CapMaxWidth.Text := IntToStr(Video_Capability^.MaxWidth);
  edt_CapMaxHeight.Text := IntToStr(Video_Capability^.MaxHeight);
  edt_CapMinWidth.Text := IntToStr(Video_Capability^.MinWidth);
  edt_CapMinHeight.Text := IntToStr(Video_Capability^.MinHeight);


Ik krijg hele gekke waarden te zien bij het opvragen van die Video_Capability.

Weet iemand wat er fout gaat?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23-08 21:27

Creepy

Tactical Espionage Splatterer

Tja.. name gaat zoiezo al fout.. een string is niet hetzelfde als een array van char. Gebruik in Delphi/Kylix hier de PChar voor. De rest lijkt me ok..

"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


Verwijderd

Topicstarter
Als ik String[..] verander in PChar dan krijg ik nog steeds hele rare gegevens te zien. Tevens als ik de procedure FillChar uitvoer dan krijg ik een Access Violation error

FillChar(Video_Capability, SizeOf(Video_Capability), #0);

Maar volgens mij is er niks mis met deze aanroep?

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
In de C-code staat geen sterretje bij name, dus het is dan een array [0..31] of char (en niet een P(ointer to)Char). Je kunt dacht ik de array gebruiken als een PChar dmv PChar(@arr[0]). Het klopt dan ook dat je capabilities niet kloppen, want de array is 32 bytes, en de pointer 4.

Gebruik een PACKED record i.v.m. alignment van de bytes in het geheugen. Bij packed record staan alle elementen van een record in het geheugen pal achter elkaar. Als je packed niet gebruikt heb je te maken met 'uitlijning' op 8 bytes omdat dat sneller is.

Kijk ook eens op http://bdn.borland.com/article/0,1410,26451,00.html
Staat een stukje over een header-converter. Is wel Windows en niet perfect, maar kan je wel helpen.

P.S.
Als de Video_Capability een PVideo_Capability is zou je eerst geheugen moeten alloceren (en niet vergeten vrij te geven). Tevens moet je FillChar verwijzen naar de 1e byte van het record.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23-08 21:27

Creepy

Tactical Espionage Splatterer

Elissen schreef op 26 February 2003 @ 15:02:
In de C-code staat geen sterretje bij name, dus het is dan een array [0..31] of char (en niet een P(ointer to)Char).
Oops... my bad.

"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


Verwijderd

Topicstarter
Mooi, ik kan nu de juiste informatie opvragen.

Het moet nu ook mogelijk zijn om een foto te capturen, alleen zal dat nog ff duren voordat ik alles geconverteerd heb. Maar dat zal ongetwijfeld gaan lukken.

Bedankt allemaal voor jullie hulp.

Verwijderd

Interresant project! Zou je je delphi code ook beschikbaar willen stellen?

Misschien ook mogelijk: delphi kan iig .obj files gebruiken, kylix (delhi version) vast ook wel... Dus alles compileren met gcc oid en de object-files zelf gebruiken. Hoe precies werkt weet ik niet, maar kan wel nakijken

Verwijderd

Voorbeeld met twain:

=================
{$L eztwain.obj}
function TWAIN_SelectImageSource(hwnd: HWND): Integer; stdcall; external;
function TWAIN_AcquireNative(hwnd: HWND; pixmask: Integer): HBitmap; stdcall; external;
procedure TWAIN_FreeNative(hDIB: HBitmap); stdcall external;
=================

bovenstaande functies zijn dan de functies van de .obj. External geeft aan dat je extern bestand/dll gebruikt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23-08 21:27

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 26 February 2003 @ 16:58:
Voorbeeld met twain:

=================
{$L eztwain.obj}
function TWAIN_SelectImageSource(hwnd: HWND): Integer; stdcall; external;
function TWAIN_AcquireNative(hwnd: HWND; pixmask: Integer): HBitmap; stdcall; external;
procedure TWAIN_FreeNative(hDIB: HBitmap); stdcall external;
=================

bovenstaande functies zijn dan de functies van de .obj. External geeft aan dat je extern bestand/dll gebruikt.
Ik denk zomaar dat de V4L interface wat verwijzingen (met eventuele macro's) zijn naar een library. ;)
[sub]En natuurlijk niet vergeten dat .obj files e.d. niet zijn uit te wisselen tussen Delphi (windows) en Kylix (linux).

"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


Verwijderd

Topicstarter
Ik heb nog een probleem met het omzetten van pointer "acties".

De c code is:
C:
1
2
3
4
5
6
7
8
9
10
11
12
p = map;
        printf("P3\n%d %d\n255", img_w, img_h);

        for(i = 0; i < img_h; i++) {
           for(j = 0; j < img_w; j++) {
              if( (3*j%15) == 0 )
                 printf("\n");
              printf("%d %d %d ", *(p+2), *(p+1), *p);
              p = p + 3;
           }
           printf("\n");
        }


Dit is de kylix (pascal) code:
code:
1
2
3
4
5
6
7
8
9
10
11
  P := map;
  for x := 0 to 640 do
  begin
    for y := 0 to 480 do
    begin
      Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(P + 2)^);
      Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(P + 1)^);
      Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(P)^);
      p := p + 3;
    end;
  end;


De compiler geeft een foutmelding dat ik niet waarden mag optellen bij die P (pointer).

Maar je mag toch gewoon een waarde bij een pointer (=adres) optellen?

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
Je moet eerste de pointer typecasten naar een integer, dan optellen en dan weer typecasten naar een pointer. Algemeen voorbeeldje:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  p : Pointer;
  i : integer;
  s : string;
begin
  s := '1234';
  p := @s[1];
  // De typecast
  i := Integer(p);
  inc(i);
  // Maak er weer een pointer van
  p := ptr(i);
  ShowMessage(char(p^));  // Dit laat '2' zien
end;


Voor jouw code maak van je P een i (Integer):
Delphi:
1
2
3
4
5
6
7
8
9
10
11
i := Integer(map);
for x := 0 to 640 do
begin
  for y := 0 to 480 do
  begin
    Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(Ptr(i + 2)^));
    Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(Ptr(i + 1)^));
    Memo1.Lines.Text := Memo1.Lines.Text + IntToStr(Byte(Ptr(i)^));
    i := i + 3;
  end;
end;

Verwijderd

Topicstarter
Bedankt het is gelukt.
Pagina: 1