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

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'La risorsa '''libv4l''' è una raccolta di librerie per la gestione dei dispositivi ''video4linux2'' evitando che si debba scrivere del codice separato, nella stessa classe, p...')
 
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 3: Riga 3:
 
La libreria ''libv4l2'', che qui ci interessa, mette a disposizione l'API ''v4l2'' per i dispositivi ''v4l2''.
 
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''"
+
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:
 
Mostriamo di seguito un possibile codice per conoscere alcune informazioni generali sul dispositivo d'Entrata video di una webcam:
Riga 25: Riga 24:
 
  <FONT Color=gray>' ''int v4l2_ioctl(int fd, unsigned long int request, ...)''
 
  <FONT Color=gray>' ''int v4l2_ioctl(int fd, unsigned long int request, ...)''
 
  ' ''Query or select the current video input.''</font>
 
  ' ''Query or select the current video input.''</font>
  Private Extern v4l2_ioctl(fd As Integer, request As Long, arg As Pointer) As Integer Exec "v4l2_ioctl"
+
  Private Extern v4l2_ioctl(fd As Integer, request As Long, arg As Pointer) As Integer
 
   
 
   
 
   
 
   
Riga 35: Riga 34:
 
   Dim tp As String
 
   Dim tp As String
 
    
 
    
  fd = v4l2_open("/dev/video0", O_RDWR Or O_NONBLOCK, 0)
+
  fd = v4l2_open("/dev/video0", O_RDWR Or O_NONBLOCK, 0)
  If fd < 0 Then Error.Raise("Impossibile aprire il file-device !")
+
  If fd < 0 Then Error.Raise("Impossibile aprire il file-device !")
 
      
 
      
  err = v4l2_ioctl(fd, VIDIOC_G_INPUT, VarPtr(index))
+
  err = v4l2_ioctl(fd, VIDIOC_G_INPUT, VarPtr(index))
  If err < 0 Then Error.Raise("Errore !")
+
  If err < 0 Then Error.Raise("Errore !")
 
      
 
      
  p = Alloc(80)
+
  p = Alloc(SizeOf(gb.Byte), 80)
  st = Memory p For Write
+
  st = Memory p For Write
   
+
  Write #st, index As Integer
  Write #st, index As Integer
+
   
+
  err = v4l2_ioctl(fd, VIDIOC_ENUMINPUT, p)
  err = v4l2_ioctl(fd, VIDIOC_ENUMINPUT, p)
+
  If err < 0 Then Error.Raise("Errore !")
  If err < 0 Then Error.Raise("Errore !")
 
 
    
 
    
  Print "== Informazioni sull'Entrata video ==\n"
+
  Print "== Informazioni sull'Entrata video ==\n"
  Print "Nome:";; String@(p + 4)
+
  Print "Nome:                 "; String@(p + 4)
 
    
 
    
  p += 36
+
  p += 36
  If Int@(p) = 1 Then
+
  If Int@(p) == 1 Then
    tp = "Questa Entrata video utilizza un sintonizzatore (RF demodulator)."
+
    tp = "Questa Entrata video utilizza un sintonizzatore (RF demodulator)."
  Else
+
  Else
    tp = "Entrata analogica in banda base (per esempio CVBS / Composite Video, S-Video, RGB)."
+
    tp = "Entrata analogica in banda base (per esempio CVBS / Composite Video, S-Video, RGB)."
  Endif
+
  Endif
  Print "Tipo:";; tp
+
  Print "Tipo:                 "; tp
 
      
 
      
  p += 4
+
  p += 4
  Print "Audioset:";; Int@(p)
+
  Print "Audioset:             "; Int@(p)
 
      
 
      
  p += 4
+
  p += 4
  Print "Sintonizzatore:";; Int@(p)
+
  Print "Sintonizzatore:       "; Int@(p)
 
      
 
      
  p += 4
+
  p += 4
  Print "Video standard:";; Long@(p)
+
  Print "Video standard:       "; Long@(p)
 
    
 
    
  p += 8
+
  p += 8
  Print "Stato del dispositivo:";; Long@(p)
+
  Print "Stato del dispositivo: "; Int@(p)
 
      
 
      
  p += 4
+
  p += 4
  Print "Funzionalità:";; Long@(p)
+
  Print "Funzionalità:         "; Int@(p)
 
      
 
      
  st.Close
+
  st.Close
  Free(p)
+
  Free(p)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione attuale delle 20:02, 2 dic 2021

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