Ottenere alcune informazioni sul dispositivo video di una webcam con le funzioni esterne del API di libv4l2
Vai alla navigazione
Vai alla ricerca
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 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)
' ...ma anche ad esempio così:
' "/dev/v4l/by-id/usb-Generic_Integrated_Camera_0001-video-index0"
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