Source: http://es.tldp.org/Articulos-periodisticos/jantonio/video4linux/v4l_1.html
Timestamp: 2017-10-21 14:13:11+00:00

Document:
VideoForLinux: El canal del Pingüino
VideoForLinux: "The Penguin Channel"
Se inicia aquí una serie sobre uno de los componentes más novedosos del nuevo kernel de Linux, y que ya está disponible en la serie 2.0.XX: el soporte para dispositivos de vídeo, televisión y radio, conocido como VideoForLinux. En esta entrega se hace una introducción, se señalan los requerimientos y se aprenderán a configurar e instalar los drivers y las aplicaciones. En la segunda entrega se describirá el API y el modelo de programación, así como la implementación VideoForLinux2 del nuevo kernel 2.2.X
Un campo de actualidad e interés en el hardware es el mundo de la multimedia: Tarjetas de videoconferencia, sintonizadores de televisión, procesado digital de la señal... de un tiempo a esta parte los fabricantes de hardware han diseñado multitud de tarjetas para este propósito. Lejos están ya los tiempos en que para poder ver la televisión en el ordenador, había que conectar la salida de la VGA a otra tarjeta especial, que mezclaba la señal de la VGA con la que generaba un receptor de televisión.
Con el advenimiento del bus PCI, y las técnicas de DirectVideo y DirectDraw, las tarjetas de videoconferencia/televisión para PC se han vuelto mucho mas potentes. La calidad de señal es infinitamente mejor: ya no se mezclan señales analógicas, sino que se escribe directamente en la memoria de vídeo. Del mismo modo el procesado digital de la señal recibida se hace posible: compresores/descompresores MPEG, visualizadores de Canal +, posibilidad de grabar vídeo en tiempo real...
El mundo Linux no podía ser menos: En 1996 Ralp y Marcus Metzler idearon una serie de drivers para poder utilizar una tarjeta capturadora de vídeo desde Linux. El primitivo driver, se denominó "bttv" en relación al chip de vídeo que llevaba dicha tarjeta ( el BookTree Bt848 ). Rápidamente, dicho driver evolucionó de manera que se empezaron a soportar diversas tarjetas de vídeo , e incluso sintonizadoras de radio y televisión. Del primitivo driver "bttv" surgió una pléyade de módulos y soporte para diversas tarjetas y combinaciones
Otros autores, a partir del diseño original de "bttv" añadieron soporte a otros dispositivos de vídeo que no estaban basados en el Bt848: cámaras QuickCam, tarjetas basadas en el chipset Zoran ZR36120 , codificadoras MPEG, e incluso soporte de otras arquitecturas, como el Plan-B de Power MacIntosh. Era hora de definir un API estándar y unificado, y de ahí nació el Proyecto VideoForLinux ( v4l en forma abrebiada )
La evolución no se ha detenido. Alan Cox y Linus Torvalds han incluído VideoForLinux como parte integrante de los nuevos kernels 2.2.X, y se ha definido un nuevo estándar: el VideoForLinux2, que incluye diversas mejoras y cambios en el API para poder añadir prestaciones al subsistema de vídeo, así como poder definir nuevos dispositivos multimedia
El nuevo núcleo de Linux incluye de serie el soportde de los dispositivos de Video For Linux
En este artículo vamos a introducir al usuario en la versión VideoForLinux para kernels 2.0.3x, explicando como instalar los módulos, compilar las aplicaciones, y disfrutar de la televisión en la pantalla de nuestro ordenador. En el próximo número de Linux Actual, con el nuevo kernel ya estable, describiremos VideoForLinux2, y se explicará con detenimiento el API, y los drivers y dispositivos soportados.
Vamos a empezar con una descripción de los elementos integrantes del módulo de v4l:
Se definen una serie de nuevos dispositivos:
Dispositivos de vídeo ( /dev/videoXX ) que permiten la visualización , proceso y captura de señales de vídeo ( sintonizadores, cámaras, e incluso dispositivos "dummy" para manejo de imágenes )
Dispositivos de audio ( /dev/radioXX ) que permiten el manejo de dispositivos "solo audio" ( tarjetas de radio, descompresores mp3, sonido de videoconferencias, etc )
Dispositivos de información ( /dev/vtxXX ) , típicamente sistemas de videotexto y teletexto
Dispositivos de WebCast e InterCast ( /dev/vbiXX ), nueva tecnología de distribución de páginas web a través de la señal de televisión
Además VideoForLinux2 define otros dispositivos:
Generadores de efectos especiales de vídeo ( /dev/vfxXX )
Codecs, compresores/descompresores, etc ( /dev/codecXX )
Dispositivos de salida de vídeo ( /dev/voutXX )
La implementación actual de VideoForLinux consta de el módulo videodev, como corazón del sistema de vídeo. De éste dependen diversos módulos auxiliares:
i2c e i2c_chardev son dos módulos genéricos que sirven para gestionar el bus I2C en el que se basan la mayor parte de los chips de vídeo existentes en la actualidad. El segundo de estos drivers permite el manejo en modo carácter de un bus i2c ( si existe el dispositivo /dev/i2cXX )
bttv es el módulo de control de las tarjetas de vídeo basadas en el chip Bt848.
msp3400 controla el chip msp34XX que es un decodificador estéreo incluído en muchas tarjetas de vídeo
El módulo tuner permite el manejo de dispositivos de vídeo o audio sintonizables, proporcionando datos que el módulo bttv puede manejar
Además de los descritos, cada dispositivo particular dispone de su propio módulo, que a su vez interacciona con éstos y que proporciona el acceso a cada tarjeta.
la figura 1 ilustra las dependencias entre los diversos módulos
Figura 1: Módulos del driver bttv y sus dependencias
Las aplicaciones interactuan con el módulo videodev, que les proporciona información sobre los diversos dispositivos, y de las peculiaridades y posibilidades que ofrece cada uno. A grandes rasgos, se pueden especificar operaciones de:
Apertura/cierre de dispositivos
Identificación de prestaciones
Selección de modo de funcionamiento. Incluye especificación de formatos, selección de la ventana de captura, sintonización de canales, especificación de la fuente de señal, modo de vídeo, etc
Lectura de imágenes. Esta puede ser por "frames", ventanas de imagen ( si el dispositivo lo permite ), o bien continua, mendiante técnicas de "mmap()"
Las estructuras que definen el API de programación se encuentran en el fichero videodev.h
Como conclusión videodev nos proporciona un API unificado para todas las tareas relacionadas con la selección, manejo y adquisición de señales de video, audio, teletexto, o Webcast
Ahora que ya sabemos qué es y qué hace VideoForLinux, vamos a ver los requerimientos del sistema.
Pentium 120 o superior
Algunas aplicaciones de procesado de señal de vídeo requieren que el microprocesador soporte MMX. No es el caso de la distribución "estándard", pero sí el de algunas específicas ( compresor/descompresor MPEG, visualizador de Canal +, etc )
Tarjeta de vídeo PCI o AGP que soporte Direct-Video ( acceso directo al frame buffer), vía bus PCI. Estas tarjetas permiten mapear la memoria de vídeo en memoria principal, de manera que otros dispositivos puedan acceder a dicha memoria a través del Bus PCI. ( eg. la Virge3D )
Tarjeta PCI sintonizadora de televisión, basada en el chip Booktree Bt848. No valen aquellas tarjetas que se comunican con la VGA a través de un conector externo. La página Web de VideoForLinux lista gran cantidad de tarjetas soportadas. En España, las más fácilmente localizables son la MiroPCTV, la AverMedia, y la Zoltrix. Su precio oscila entre las 12.000 y 20.000 pesetas
Si en lugar de utilizar la señal de antena, disponemos de un vídeo doméstico, y queremos que sea éste el que esté conectado al ordenador, no necesitamos una sintonizadora, sino que con una capturadora de vídeo nos basta. En este caso podemos utilizar una tarjeta normal de videoconferencia ( por ejemplo la VideoLogic Captivator ), que son mucho mas asequibles en precio ( del orden de 5000-7000 pesetas.
Opcionalmente podemos enchufar a la tarjeta de vídeo una camara de televisión. La experiencia recomienda huír de las cámaras que se enchufan a puerto paralelo o a USB, por las evidentes pérdidas de rendimiento del equipo
Kernel 2.0.34 o superior + modulos de v4l, o bien
Kernel 2.1.126 o superior, compilado con soporte de v4l
Para Kernels de la serie 2.1.1XX, video4linux está ya incluído dentro de los fuentes de la distribución. En el caso de la serie 2.0.XX, los drivers se adquieren de forma separada. En el CD-Rom que acompaña a la revista se incluye el útimo driver existente en el momemto de escribir este artículo
glibc ( ¿ alguien no la usa todavía ? )
En la BIOS, hay que deshabilitar la opción "VideoPallete Snoop". Esto es debido a que es necesario que la tarjeta de vídeo pueda generar y procesar interrupciones de barrido vertical, para poder sincronizar los barridos de la tarjeta de vídeo y la sintonizadora de televisión
La implementación actual del driver de v4l no permite compartir las interrupciones de la tarjeta de vídeo y la sintonizadora con otros dispositivos. Revisar los mensajes informativos de la BIOS y los que aparecen en /proc/interrupts
Aseguráos que vuestro servidor X soporta la extension DGA ( XFree86-3.3.2 y superiores ). La tarjeta de vídeo debe poder soportar una resolución de al menos 800x600 en 16bits ( 65536 colores)
Si no se quiere utilizar X-Windows, deberemos utilizar un kernel de la serie 2.1.13X, con soporte de dispositivo frame-buffer ( /dev/fbXX ) convenientemente compilado e instalado
En el CD-Rom se acompaña una copia de la Home Page de VideoForLinux y del proyecto Bttv. En ellos se detalla una lista completa de los dispositivos soportados, lista que por motivos de espacio no podemos citar aquí.
Hay que hacer notar una excepción a la lista de tarjetas soportadas: las sintonizadoras basadas en el chipset ATI no están soportadas -ni se prevee que lo estén- en Linux, debido a la ceguera mental del fabricante que no publica las especificaciones técnicas de sus productos. Existe una página Web, donde los interesados en que ATI cambie de actitud, pueden firmar
Nos remitimos a las páginas Web de cada dispositivo específico para un detalle completo de instalación. Vamos a describir aquí la instalación del driver más común: el Bttv. Para ello distinguiremos dos casos:
Caso 1: kernels superiores al 2.1.125
En el menú de configuración del kernel, en el apartado "Character Devices" Buscaremos la opción "VideoForLinux". Activándola, aparecerán una serie de dispositivos, de entre los que escogemos "Bttv Video For Linux Support". La figura 2 ilustra un ejemplo.
Si vamos a usar v4l desde la consola, deberemos asegurarnos que los dispositivos /dev/fbXX correspondientes al framebuffer ( nuevo en estas series de kernels ) funcionan y están correctamente instalados
Figura 2: Configuración de VideoForlinux en kernel 2.1.125
Caso 2: kernels de la serie 2.0.3X
En este caso los módulos no son parte de la distribución estándard. Para instalarlo, deberemos seguir una serie de pasos:
Instalamos y descomprimimos el driver:
root@cochito# cd /usr/src
root@cochito# tar zxvf <path_al_fichero_en_cdrom>/bttv-0.5.22.tgz
root@cochito# cd bttv-0.5.22/driver
Editamos el makefile especificando las opciones de nuestra tarjeta, especialmente en lo referente al tipo de tarjeta y la frecuencia de oscilación del PLL. Leer la documentación que se incluye en el driver sobre cada tarjeta específica
Mediante "make" compilamos los módulos
Copiamos los ficheros resultantes junto con los demás módulos del sistema, y creamos los ficheros especiales en /dev
root@cochito# cp *.o /lib/modules/current/misc
root@cochito# ./MAKEDEV
Creamos los ficheros de arranque. En el código fuente aparece un ejecutable "update", que podemos usar. Alternativamente, en el CD-Rom existe un fichero "v4linux" que está preparado para ser colocado en /etc/rc.d/init.d, y que podemos ver en el listado 1
root@cochito# cp <path_al_fichero_en_cdrom>/v4linux /etc/rc.d/init.d
root@cochito# ln -s /etc/rc.d/init.d/v4linux /etc/rc.d/rc3.d/S99v4linux
Editamos este fichero especificando los detalles de funcionamiento concretos de cada tarjeta. Nótese que estos módulos no se cargan bajo demanda a través de kerneld, sino que se insertan de manera permanente
Con /etc/rc.d/init.d/v4linux start los módulos quedan quedan instalados. mediante lsmod comprobaremos que están correctamente instalados. En caso de problemas consultar los logs del sistema.
Una vez instalado el driver llega momento de instalar y probar las aplicaciones
if test "$UID" = "0"; then
# running as root anyway, don't need sudo
INSMOD="sudo /sbin/insmod"
RMMOD="sudo /sbin/rmmod"
# handy functions for rmmod/insmod
function xrmmod () {
grep -qe "^$1" /proc/modules || return
echo rmmod $1
$RMMOD $1 || exit 1
function xinsmod () {
echo insmod $*
$INSMOD -f $* || exit 1
function remove_mods () {
xrmmod bttv
xrmmod msp3400
xrmmod tuner
xrmmod i2c_chardev
xrmmod i2c-dev
xrmmod algo-bit
xrmmod i2c
xrmmod videodev
function install_mods () {
# Modulo basico
xinsmod videodev
# Modulo de control de bus i2c
xinsmod i2c		verbose=1 scan=0 i2c_debug=0
# Este modulo es opcional. permite un control "tipo caracter" del driver
test -f /lib/modules/current/misc/i2c_chardev.o && xinsmod i2c_chardev
# dispositivo de sintonización. Es necesario a menos que se vaya a utilizar
# una entrada de video compuesto o de camara
#        debug=1         Genera mediante syslog mensajes de depuracion
#        type=n          Especifica el tipo de sintonizador
#                0: Temic PAL tuner
#                1: Philips PAL_I tuner
#                2: Philips NTSC tuner
#                3: Philips SECAM tuner
#                4: no tuner
#                5: Philips PAL tuner
#                6: Temic NTSC tuner
#                7: Temic PAL tuner
xinsmod tuner		debug=0
# Modulo de control del chip de sonido MPS34XXX.
# Es necesario en la mayor parte
# de las tarjetas que manejan stereo/Nicam
# debug puede valer 0, 1, o 2
xinsmod msp3400		debug=0
# Finalmente el modulo bttv.
#    insmod args:
#            remap=adr       remap Bt848 memory to adr<<20
#            vidmem=base     frame buffer address>>20 (of graphic card)
#            triton1=0/1     for Triton1 compatibility
#                            La placa triton 1 se detecta automaticamente
# 			     pero puede ser necesario fijar este valor
# 			     a cero en otras placas base
#            pll=0/1/2       Ajuste del oscilador a cristal del PLL
#	 		     0 -> bt848, los demás valores para otros
# 			     chipsets superiores de la familia
#                    0: no usar PLL
#                    1: oscilador de 28 MHz
#                    2: oscilador de 35 MHz
#            radio=0/1       La tarjeta soporta receptor de radio
#            card=n          Tipo de tarjeta
#                    0:  Auto-Deteccion
#                    1:  Miro
#                    2:  Hauppauge
#                    3:  STB
#                    4:  Intel
#                    5:  Diamond
#                    6:  AVerMedia
#                    7:  MATRIX Vision MV-Delta
#                    8:  FlyVideo
#                    9:  TurboTV
#                    10: Hauppauge (usar este en las tarjetas modernas)
#    remap, card, radio and pll aceptan hasta 4 argumentos, separados por
#    comas, para poder poner mas de una tarjeta. Los valores por defecto
#    CARD y PLL son los que se definen en el Makefile
xinsmod bttv		card=1 radio=0
start ) install_mods
stop ) remove_mods
restart ) remove_mods
install_mods
status ) a=`cat /proc/modules | grep videodev`
echo -n "Video For Linux modules are"
if [ "$a" = "" ]; then echo -n " NOT"; fi
echo " installed"
* ) echo Usage: $0 [ start | stop | restart | status ]
Listado 1: Programa de arranque de los modulos de VideoForLinux
Existen multitud de aplicaciones que permiten el manejo de estos módulos. A título de ejemplo se citan las siguientes:
Kradio,KTuner: Diversas aplicaciones basadas en KDE y QT para gestión de tarejtas de radio
GnomoVision: Parte del escritorio del proyecto GNOME
VStream: Conjunto de bibliotecas y utilidades de captura de audio y video
XTTV: Aplicación de Televisión basada en las XLib
XawTV: Visualizador de televisión basado en los athena Widgets
Existen muchas otras, unas derivadas de otras, siendo la mayor diferencia el user interface y las posibilidades de gestión de las imágenes ( captura, compresión MPEG, etc )
En el CD-Rom se incluyen algunas de estas aplicaciones. Las demás -y otras muchas no mencionadas- se pueden encontrar siguiendo los enlaces indicados en las referencias.
La figura 3 ilustra una simpática imagen capturada desde uno de estos programas
Figura 3: Imagen capturada con XawTV
Vamos a describir aquí la que a juicio del autor es uno de los mejores programas de visualización de televisión para Linux: el programa XawTV.
XawTV es un conjunto de aplicaciones destinadas a trabajar con sintonizadoras de televisión y de radio. Entre sus capacidades se incluyen:
Trabajar a pantalla completa en resolución de televisión ( 768x576, resolución que ningún programa de MS-Windows es capaz de proporcionar: casi todos trabajan a 800x600, dejando huecos en "negro" )
Manejar resoluciones de 15,16, 24 o 32 bits
Poder efectuar capturas de imágenes, tanto estáticas ( JPEG ) como dinámicas (AVI's)
Si se dispone de una conexión de red eficiente, se pueden presentar imágenes en un terminal distinto a aquel en que reside la tarjeta
Si se usan kernels nuevos, existe un programa FbTV que permite las mismas prestaciones que XawTV, pero utilizando el framebuffer
Existe un fichero de configuración por usuario donde se especifican los canales, modos de video, frecuencias, etc
XawTV proporciona interfaces para mando a distancia, control remoto desde otro terminal/consola, etc
Con XawTV podemos capturar y almacenar tanto imágenes como secuencias de vídeo
La instalación es realmente sencilla:
Descomprimir el programa
Con ./configure generamos los ficheros include y Makefile. ./configure --help nos proporciona la lista de opciones de compilación
Ejecutamos make.
make install nos instala los programas y las páginas de manual en los destinos predefinidos
Ahora solo queda crear el fichero de configuración. El listado 2 ilustra el utilizado por el autor, donde se detallan los modos de vídeo y los canales correspondientes a cada emisora
En el caso de no crear un fichero de configuración, el programa avisará al usuario, y le presentará directamente el menú de ajuste de emisoras
source  = television
norm    = pal
# freqtab = pal-bcast-europe
# select one that makes it right from:
# "vol" "bass" "trebble" synth" "pcm" "speaker" "line"
mixer   = line
wm-off-by = -4-24
# Modeline  "pal"  50.00  768 876 900 1000  576 590 595 630  -hsync -vsync
[TVE-1]
[TVE-2]
# key = 2
# key = 3
# key = 4
[Tele-5]
# key = 5
# key = 6
[Canal-7 TV]
# key = 7
# key = 8
Listado 2: Ejemplo de configuración de XawTV
Ya tenemos el programa instalado y listo. man xawtv nos proporciona una lista de funciones, menús, y comandos del fichero de configuración. La figura 4 muestra el menú de opciones de XawTV
Figura 4: Menú de opciones de XawTV
Un último retoque nos permitirá reconfigurar las X, para que XawTV pueda funcionar a pantalla completa: Especificar un "ModeLine" para la resolución de video PAL . Para ello, como root editamos el fichero /etc/X11/XF86Config y en la seccion Monitor , antes de EndSection añadimos la linea:
# For Pal TV decoder
Modeline  "768x576"  50.00  768 876 900 1000  576 590 595 630  -hsync -vsync
los valores anteriores se ajustan manualmente con "xvidtune" de manera que la pantalla quede centrada correctamente en pantalla.
Del mismo modo en la sección Screen, en el apartado correspondiente a las resoluciones de 16 bits añadimos la opción "768x576"
El servidor X puede ser programado con la resolución correspondiente a la señal de video PAL: 768x576 pixels
No olvidemos que para poder ver correctamente la señal de tevisión, necesitamos una resolucion de al menos 16 bits en el servidor X. Esto se consigue mediante el comando startx -- -bpp 16
Rizando el rizo podemos crear un usuario "tele" que tenga como login shell el programa "fbtv" ( en los nuevos kernels, o bien un script que arranque las X y el programa xawtv, para los kernels 2.0.3X ), de manera que no haya que hacer login en la máquina para ver la televisión
En función de nuestra configuración, y sobre todo, de la tarjeta de vídeo utilizada pueden presentarse diversos problemas:
Los errores de compilación pueden deberse al uso de una versión incorrecta del kernel, o del compilador. hay que asegurarse de utilizar gcc version 2.7.2.3 o superior, o bien egcs.
Del mismo modo, algunas de las aplicaciones que vienen con el paquete bttv presentan errores de compilación del tipo "tipo xxxx no definido". Hay que revisar concienzudamente los includes, pues algunos de ellos dependen de la versión del kernel utilizada
Aunque la opción "Autodetect" funciona la mayor parte de las veces a la hora de insertar el módulo en el kernel, puede ocurrir que alguna tarjeta "no estandard" no se detecte. En este caso deberemos especificarla en el script de carga
Del mismo modo, verificar que el módulo de gestión del chip de sonido estéreo/Nicam se carga e instala perfectamente
Todos los módulos disponen de una opción "debug" que genera mensajes de syslog en /var/log/messages. Estudiando detenidamente dichos mensajes podremos ver que es lo que está pasando
Mención especial merecen los parámetros "remap" y "vidmem" del modulo bttv. El primero indica donde va a guardar el chip los datos que lea de la entrada de vídeo. El segundo indica dónde está mapeado el framebuffer. Normalmente no es preciso especificarlo, pero en algunas ocasiones, al arrancar las X, el framebuffer es mapeado en otra dirección. Si bien la mayor parte de los programas utilizan las extensiones DGA para adivinar dónde está mapeado el frame buffer de las X's, no todos los servidores lo soportan. Si falla la autodetección el proceso a seguir es el siguiente:
Con los módulos de vídeo descargados arrancar las X
con <Ctrl>+<Alt>+<F1> volvemos a modo texto y buscamos un texto similar a:
"Frame Buffer memory mapped at 0x0ff0xxxxxx"
Eliminamos cinco ceros y utilizamos dicho valor para especificar la opción "vidmem"
Puede haber problemas en el funcionamiento normal del módulo en los casos de cambio de resolución de pantalla, utilización simultánea de otros programas que accedan a las extensiones DGA o al /dev/fbXX.. en estos casos, con /etc/rc.d/init.d/v4linux restart deberemos reiniciar los módulos
En este artículo hemos hecho una presentación del subsistema de gestión multimedia "Video For Linux", describiendo los módulos de que consta, su instalación y alguna de sus aplicaciones. En el proximo número de Linux Actual describiremos el API y el modelo de programación, indicando la interacción con los dispositivos que el nuevo kernel 2.2 soporta, y analizando alguno de los programas que utilizan dichos recursos.
El modelo de programación unificado que nos propone el API de v4linux es muy potente, y es capaz de efectuar una abstracción del hardware de manera que se puede conseguir mucha mayor potencia y flexibilidad a la hora de desarrollar software que con los drivers proporcionados para otros sistemas de todos conocidos, tanto a nivel de control de hardware como de user iterface

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución