Ottenere alcune informazioni sul dispositivo video di una webcam con le funzioni esterne del API di libv4l2

Da Gambas-it.org - Wikipedia.

La risorsa libv4l è una raccolta di librerie per la gestione dei dispositivi video4linux2 evitando che si debba scrivere del codice separato, nella stessa classe, per i diversi dispositivi. libv4l è composta da tre librerie differenti: libv4lconvert, libv4l1 e libv4l2.

La libreria libv4l2, che qui ci interessa, mette a disposizione l'API v4l2 per i dispositivi v4l2.

Per poter fruire delle risorse fornite dalla libreria v4l2 è necessario richiamare nell'applicazione Gambas la seguente libreria dinamica condivisa: "libv4l2.so.0.0.0 ".

Mostriamo di seguito un possibile codice per conoscere alcune informazioni generali sul dispositivo d'Entrata video di una webcam:

Private Enum O_RDONLY = 0, O_WRONLY, O_RDWR, O_NONBLOCK = &2000


Library "libv4l2:0.0.0"

Private Const VIDIOC_G_INPUT As Long = 2147767846
Private Const VIDIOC_ENUMINPUT As Long = 3226490394
Private Const VIDIOC_G_OUTPUT As Long = 2147767854
Private Const VIDIOC_ENUMOUTPUT As Long = 3225966128

Private Enum V4L2_INPUT_TYPE_TUNER = 1, V4L2_INPUT_TYPE_CAMERA 

' int v4l2_open(const char * file, int oflag, ...)
' Open a V4L2 device.
Private Extern v4l2_open(fl As String, oflag As Integer, alterum As Integer) As Integer

' int v4l2_ioctl(int fd, unsigned long int request, ...)
' Query or select the current video input.
Private Extern v4l2_ioctl(fd As Integer, request As Long, arg As Pointer) As Integer


Public Sub Main()

 Dim fd, index, err As Integer
 Dim p As Pointer
 Dim st As Stream
 Dim tp As String
 
 fd = v4l2_open("/dev/video0", O_RDWR Or O_NONBLOCK, 0)
 If fd < 0 Then Error.Raise("Impossibile aprire il file-device !")
   
 err = v4l2_ioctl(fd, VIDIOC_G_INPUT, VarPtr(index))
 If err < 0 Then Error.Raise("Errore !")
   
 p = Alloc(SizeOf(gb.Byte), 80)
 st = Memory p For Write
 Write #st, index As Integer

 err = v4l2_ioctl(fd, VIDIOC_ENUMINPUT, p)
 If err < 0 Then Error.Raise("Errore !")
  
 Print "== Informazioni sull'Entrata video ==\n"
 Print "Nome:                  "; String@(p + 4)
  
 p += 36
 If Int@(p) == 1 Then
   tp = "Questa Entrata video utilizza un sintonizzatore (RF demodulator)."
 Else
   tp = "Entrata analogica in banda base (per esempio CVBS / Composite Video, S-Video, RGB)."
 Endif
 Print "Tipo:                  "; tp
   
 p += 4
 Print "Audioset:              "; Int@(p)
   
 p += 4
 Print "Sintonizzatore:        "; Int@(p)
   
 p += 4
 Print "Video standard:        "; Long@(p)
  
 p += 8
 Print "Stato del dispositivo: "; Int@(p)
   
 p += 4
 Print "Funzionalità:          "; Int@(p)
   
 st.Close
 Free(p)
  
End


Riferimenti