Rev 177 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
174 | giacomo | 1 | Guida all'uso del driver BTTV per S.Ha.R.K |
2 | Giacomo Guidi <giacomo@gandalf.sssup.it> |
||
3 | |||
4 | DIRECTORY DEL DRIVER: shark/drivers/bttv/ |
||
5 | SIMBOLO NEL MAKEFILE PER INSERIRE LA LIBRERIA: __BTTV__ |
||
6 | |||
7 | Il nuovo driver per Frame Grabbers e' preso al 90% dall'analogo |
||
8 | driver linux e supporta buona parte delle schede dotate di BT848 |
||
9 | in commercio. |
||
10 | |||
11 | E' stato integrato anche un supporto al bus I2C necessario |
||
12 | per accedere ai sotto-sistemi interni al Frame Grabber, |
||
13 | come chip audio o sintonizzatori televisivi. |
||
14 | |||
15 | Per utilizzare questo driver si puo' passare dai comandi base |
||
16 | del driver BTTV, definiti dentro bttv-driver.c oppure usare una |
||
17 | veloce interfaccia (fg.c) che ho creato per ridurre al minimo le |
||
18 | operazioni di inizializzazione e uso della periferica. |
||
19 | |||
20 | ------------------------------------------------------------------------------- |
||
21 | Header e funzioni per l'uso semplificato |
||
22 | ------------------------------------------------------------------------------- |
||
23 | |||
24 | //Header delle funzioni per l'uso facilitato del Frame Grabber |
||
25 | #include <drivers/fg.h> |
||
26 | |||
27 | //Header per le strutture e funzioni a basso livello del BTTV |
||
28 | #include <driver/bttv.h> |
||
29 | |||
30 | //Istruzione di inizializzazione semplificata |
||
31 | FG_init(period,wcet,width,height); |
||
32 | |||
33 | --- |
||
34 | period: periodo del grabbing, ovvero quanti microsecondi passano |
||
35 | fra ogni campianamento dell'immagine |
||
36 | |||
37 | wcet: durata massima del task di grabbing. Definisce quanto |
||
38 | deve durare al massimo il campionamento + l'elaborazione |
||
39 | dell'immagine. |
||
40 | |||
41 | width: larghezza finestra di campionamento |
||
42 | |||
43 | height: altezza finestra di campionamento |
||
44 | |||
45 | Esempio: |
||
46 | --- |
||
47 | |||
48 | FG_init(50000,15000,400,300); |
||
49 | |||
50 | --- |
||
51 | |||
52 | Attenzione al periodo di campionamento, e' buona regola non scendere |
||
53 | sotto i 40000 us ovvero 25 fps. Bisogna tenere presente che il frame |
||
54 | grabber usa massicciamente il bus PCI e il DMA per spostare il flusso |
||
55 | delle immagini. Va sempre settato il massimo periodo possibile che la |
||
56 | vostra applicazione richiede, evitate di sprecare risorse con grabbing |
||
57 | a 25 fps se poi non c'e' il tempo di gestire tutte le immagini raccolte. |
||
58 | |||
59 | Il pricipio base e' che nessuna immagine va sprecata. Per cui se il |
||
60 | processore permette di elaborare solo 1 immagine ogni 120000 us, non |
||
61 | settate il FG a 40000 us per poi usare 1 immagine su 3. |
||
62 | |||
63 | Per cercare di usare bene le risorse di sistema ed evitare una gestione |
||
64 | errara dei buffer del FG ho inserito una funzione virtuale |
||
65 | |||
66 | elaborate_frame_hook <fg.c> |
||
67 | |||
68 | che viene chiamata ad ogni inizio del ciclo di grabbing. Questa funzione |
||
69 | di default e' inizializzata a dummy_elaborate_frame, per cui non fa |
||
70 | niente, ma puo' essere usata dall'utente se e' richiesta una qualche |
||
71 | elaborazione dell'immagine... puo' essere una copia del buffer nella |
||
72 | memoria video per vedere il grabbing in azione o un complicato |
||
73 | algoritmo di tracking. |
||
74 | |||
75 | Se ad esempio creo una funzione tipo |
||
76 | |||
77 | frame_elaborate(void *imageptr) { |
||
78 | |||
79 | //Codice di elaborazione |
||
80 | |||
81 | } |
||
82 | |||
83 | dove lavoro l'immagine presa. Posso chiamare |
||
84 | |||
85 | FG_sethook(frame_elaborate) |
||
86 | |||
87 | per fare in modo che frame_elaborate venga chiamata automaticamente |
||
88 | ad ogni immagine acquisita. Se ad esempio frame elaborate e' troppo |
||
89 | complicata puo' capitare che venga mancata la deadline del task di |
||
90 | grabbing (hard_task). A quel punto o si riducono i calcoli di questa |
||
91 | funzione o si aumenta il periodo di grabbing. |
||
92 | |||
93 | Se non si ottengono deadline miss significa che tutto funziona bene |
||
94 | e sicuramente la funzione elabora sempre l'ultima immagine registrata. |
||
95 | Il grabber infatti usa il sistema del Double Buffer, per cui l'immagine |
||
96 | su cui si lavora e' sempre completa ed integra. |
||
97 | |||
98 | Per passare parametri alla funzione frame_elaborate penso sia piu' |
||
99 | facile ricorrere a variabili globali piuttosto a passaggi di variabili |
||
100 | generiche ridefinite volta per volta. Per cui la funzione di elaborazione |
||
101 | deve essere sempre definita in questo modo: |
||
102 | |||
103 | void nome_funzione(void *imageptr); |
||
104 | |||
105 | L'inizializzazione di default imposta il grabbing in modalita' GREY8 |
||
106 | ovvero 8 bpp e a toni di grigio. Non ho ancora sperimentato completamente |
||
107 | la modalita' a colori, per cui se volete fare dei test andate a cambiare |
||
108 | "fg.c" provando a modificare i diversi tipi di palette a seconda di cosa |
||
109 | permette il vostro frame grabber. Teoricamente settando la modalita' a |
||
110 | colori e usando una telecamera a colori tutto dovrebbe funzionare bene. |
||
111 | |||
112 | Tenete conto che invece di 1 byte per pixel nel buffer passate ad |
||
113 | una modalita' RGB. |
||
114 | |||
115 | ------------------------------------------------------------------------------- |
||
116 | Consigli per il Frame Grabber in generale. |
||
117 | ------------------------------------------------------------------------------- |
||
118 | |||
119 | Giocando con i paramentri di luminosita', contrasto e saturazione si |
||
120 | riesce a rendere l'immagine piu' semplice da elaborare (ad esempio per fare |
||
121 | il tracking di un oggetto in moto) senza ricorre a complicati algoritmi che |
||
122 | andrebbero a pesare sul processore. |
||
123 | |||
124 | Queste funzioni vengono chiamate da bttv_ioctl definita in bttv-driver.c |
||
125 | |||
126 | Prima di inizializzare il FG con la grafica provate a farlo partire in |
||
127 | modalita' testo, cosi' l'output a schermo vi permette di vedere se la |
||
128 | routine di init va a buon fine o se ci sono delle anomalie. |
||
129 | |||
130 | Una volta che sieti sicuri venga riconosciuta la vostra scheda e' buona |
||
131 | regola inizializzare il FG DOPO LA SCHEDA VIDEO. Questo perche' ho |
||
132 | riscontrato alcuni problemi con gli interrupt chiamati dalla VESA se il FG |
||
133 | e' gia' in funzione. |
||
134 | |||
135 | ------------------------------------------------------------------------------- |
||
136 | Programma di esempio: BTTVDEMO |
||
137 | ------------------------------------------------------------------------------- |
||
138 | |||
139 |