[Jde-dev] CameraServer y WebCam Philips

David Lobato dav.lobato en gmail.com
Vie Mar 19 15:15:28 CET 2010


Dado que el parametro está relacionado concretamente con las cámaras yo lo
pondría como opción al especificar una uri que empiece con v4l o v4l2.

Además dado que está ligado a gstreamer usaría el formato que ellos usan
para especificar capabilities de video( algo así
video/x-raw-yuv,width=320,height=240,...)  cuando las indicas desde linea de
comandos. No estoy seguro, pero supongo que la librería tiene funciones para
transformar un string en caps y viceversa. Habría que buscarlo.

Así la manera de especificar que una cámara concreta debe sacar los frames
con un formato indicado sería:

CameraSrv.Camera.0.Uri=v4l2:///dev/video0?formato

He puesto ? por analogia con las url, pero vamos podemos poner otra cosa si
os parece mejor.

Cómo lo véis?

David.

2010/3/18 JoseMaria <jmplaza en gsyc.es>

> Idem. Lo veo bien como parámetro opcional, de modo que si no se pone
> nada el componente CameraServer lo hace lo mejor que puede por defecto.
> Muchas aplicaciones usarán justo el componente así, sin saber muchos
> detalles de las cámaras que tiene debajo.
>
> Pero si para cierta cámara viene mejor tal o cual combinación, es muy
> útil que se pueda especificar vía fichero de configuración y saltarse el
> "por defecto" para que la captura se ajuste mejor a las características
> especiales de tal o cual cámara o los requisitos de tal o cual
> aplicación.
>
> JoseMaria
> On Mon, 2010-03-15 at 14:35 +0100, Roberto Calvo wrote:
> > El lun, 15-03-2010 a las 09:18 -0400, David Lobato escribió:
> > > No veo tan claro que la solución sea añadir otro parámetro. Esto nos
> > > obliga a caracterizar cada una de las cámaras que queramos conectar y
> > > apañar el código para cada cámara. Una cosa es que soportemos
> > > diferentes formatos de salida (RGB888, YUY2,...)  estandarizados para
> > > que el que reciba al otro lado sepa a que atenerse, y otra es que haya
> > > que controlar al milímetro que entra y que sale. A mi parecer deja de
> > > hacer simple el uso del componente.
> >
> > Podemos ponerlo como parámetro opcional en el fichero de conf. No
> > siempre es necesario utilizarlo, pero hay veces que viene bien para no
> > tener que compilar código. Un parámetro opcional lo veo bastante bien.
> >
> > >
> > >
> > > Como solución para ir tirando lo acepto, pero creo que tenemos que
> > > investigar un poco mas sobre gstreamer para ver como detectar las
> > > "capabilities" que da la cámara con código (99% seguro de que se
> > > puede) y seleccionar aquella que mejor se adapte a la que se espera
> > > como salida (en principio con no cambiar de espacio de colores seria
> > > suficiente).
> >
> > Totalmente de acuerdo, si con gst-launch es capaz de negociarlo, desde
> > C++ también se puede hacer.
> >
> > Aún así, veo muy bueno y versátil disponer de este parámetro opcional en
> > el fichero de configuración, ya que nos permite modificar el
> > comportamiento de cameraserver sin necesidad de cambiar código. Aunque
> > nos de gstreamer las "capabilities", dejaría la opción de detallarle en
> > el fichero de conf el formato que queremos.
> >
> > Cada cámara y cada linux es un mundo, por lo que creo que nos vendrá muy
> > bien disponer del máximo detalle en los ficheros de conf. Eso si, con
> > parámetros opcionales, que podamos arrancar un cameraserver con las
> > mínimas líneas de conf tambien es importante.
> >
> > un saludo!
> >
> > >
> > >
> > > En cuanto al vloopback funcionando con todo, enhorabuena! Los números
> > > pintan bastante bien.
> > >
> > >
> > > David.
> > >
> > > 2010/3/15 JoseMaria <jmplaza en gsyc.es>
> > >         Estupendo!!
> > >
> > >         Sip, habría que añadir al fichero de configuración ese nuevo
> > >         parámetro.
> > >
> > >         David está preparando la descripción en el manual 5.0 de
> > >         cameraServer,
> > >         cameraViewer, etc. Buen sitio para comentar cómo se usan estos
> > >         componentes, cómo se configuran, brevemente cómo están hechos
> > >         por
> > >         dentro, etc. A ver si esta semana conseguimos cerrar una
> > >         descripción
> > >         buena en el manual de ellos, que ya somos bastantes los que
> > >         estamos
> > >         usándolos.
> > >
> > >         Ánimo,
> > >
> > >         JoseMaria
> > >
> > >         On Sun, 2010-03-14 at 23:18 +0100, Roberto Calvo wrote:
> > >         > Al fin he conseguido hacerlo funcionar. La solución, como no
> > >         soporta
> > >         > YUY2, es mirar que formato soporta, y lo que he encontrado
> > >         es que esta
> > >         > cámara soporte I420
> > >         > Label         FOURCC in Hex           Bits per pixel
> > >            Description
> > >         > I420          0x30323449              12
> > >            8 bit Y plane followed by 8 bit 2x2 subsampled U and V
> > >         planes.
> > >         >
> > >         > Más info en [1]
> > >         >
> > >         > Por lo que el código, lo único que cambia es lo siguiente:
> > >         >
> > >         >      v4l2caps = gst_caps_new_simple ("video/x-raw-yuv",
> > >         >                                      "format",
> > >         GST_TYPE_FOURCC,
> > >         >
> > >          GST_MAKE_FOURCC('I','4','2','0'),
> > >         >                                      NULL);
> > >         >
> > >         >
> > >         > David, quizás deberíamos añadir al fichero de conf de camera
> > >         server este
> > >         > parámetro (formato en el que queremos recoger la imagen de
> > >         la cámara,
> > >         > para optimizar el proceso como has dicho), y añadirlo al que
> > >         ya tenemos,
> > >         > que es formato que ofrece el servidor. ¿Te parece?
> > >         >
> > >         > Por cierto, funciona todo bien ya sobre el módulo vloopback,
> > >         que ya era
> > >         > hora :-))
> > >         >
> > >         > Algunos datos interesantes probados en la miniITX (1.5Ghz)
> > >         >
> > >         > CameraServer + Vloopback = ~ 5% de CPU
> > >         > CameraServer + Vloopback + ffmpeg grabando = ~ 20% de CPU
> > >         >
> > >         > un saludete!
> > >         >
> > >         > [1] http://www.fourcc.org/yuv.php
> > >         >
> > >         >
> > >         > El dom, 14-03-2010 a las 22:05 +0100, Roberto Calvo
> > >         escribió:
> > >         > > Thanks por la explicación!!, ahora lo voy teniendo más
> > >         claro.
> > >         > >
> > >         > > Lo primero que he hecho es ejecutar el comando desde
> > >         consola, para ver
> > >         > > si es capaz de negociar gstreamer con esta cámara. Y si es
> > >         capaz, ya que
> > >         > > termina por mostrar la imagen y negociar con los
> > >         siguientes parámetros:
> > >         > >
> > >         >
> > >         > /GstPipeline:pipeline0/GstXImageSink:ximagesink0.GstPad:sink:
> > >         > >     caps = video/x-raw-rgb, bpp=(int)16, depth=(int)16,
> > >         endianness=(int)1234,
> > >         > >     red_mask=(int)63488, green_mask=(int)2016,
> > >         blue_mask=(int)31, width=(int)320,
> > >         > >     height=(int)240, framerate=(fraction)15/2,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > >
> > >         > >
> > >         > > He modificado el código para la parte donde se generar los
> > >         pipelines, en
> > >         > > el caso que conectamos un dispositivo v4l2 (descomentado
> > >         la parte de
> > >         > > v4l2caps y caps, también he probado sólo dejando caps);
> > >         > >
> > >         > >
> > >         > >   else if (config_.uri.find("v4l://") == 0){/*handle v4l2
> > >         source*/
> > >         > >       std::string dev = config_.uri.substr(6);/*after
> > >         v4l2://*/
> > >         > >       source =
> > >         gst_element_factory_make("v4lsrc","source");
> > >         > >
> > >         g_object_set(G_OBJECT(source),"device",dev.c_str(),NULL);
> > >         > >       sink = gst_element_factory_make("appsink","sink");
> > >         > >       g_object_set(G_OBJECT(sink),"drop",1,NULL);
> > >         > >       g_object_set(G_OBJECT(sink),"max-buffers",16,NULL);
> > >         > >
> > >         > >       videocolor =
> > >         gst_element_factory_make("ffmpegcolorspace","videocolor");
> > >         > >
> > >
> gst_bin_add_many(GST_BIN(pipeline),source,videocolor,sink,NULL);
> > >         > >
> > >           //gst_element_link_filtered(source,videocolor,v4l2caps);
> > >         > >       //gst_element_link_filtered(videocolor,sink,caps);
> > >         > >     }
> > >         > >
> > >         > >
> > >         > > Después de estar un rato negociando, sale el siguiente
> > >         mensaje.
> > >         > >
> > >         > > info: Starting thread for camera: cameraA
> > >         > > error: Error: Error en el flujo de datos interno.
> > >         > >
> > >         > >
> > >         > > Sigo probado configuraciones, a ver que puede estar
> > >         pasando ....
> > >         > >
> > >         > > El sáb, 13-03-2010 a las 17:10 -0500, David Lobato
> > >         escribió:
> > >         > > > Hola,
> > >         > > >
> > >         > > >
> > >         > > > El error "Could not negociate format" sale cuando alguno
> > >         de los
> > >         > > > componentes del pipeline no puede funcionar en el
> > >         formato que le
> > >         > > > estamos pidiendo.
> > >         > > >
> > >         > > >
> > >         > > > El pipeline que hay para v4l2 está bastante optimizado
> > >         para a las
> > >         > > > cámaras logitech, ya que es la que tengo mas a mano.
> > >         Para que funcione
> > >         > > > con otras cámaras tenemos que hacer un poco mas
> > >         genérico. Lo que
> > >         > > > tenemos ahora es:
> > >         > > >
> > >         > > >
> > >         > > > camara -----> ffmpegcolorspaces ------> appsink
> > >         > > >               |                                    |
> > >         > > >           v4l2caps                         caps
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > > Gstreamer es capaz de negociar el formato de los datos
> > >         que cada
> > >         > > > componente intercambia entre si, pero también te deja
> > >         especificar
> > >         > > > dicho formato con lo que se denominan "capabilities" que
> > >         vienen a ser
> > >         > > > una descripción del formato.
> > >         > > >
> > >         > > >
> > >         > > > Así en nuestro pipeline tenemos un componente camara, el
> > >         componente
> > >         > > > ffmpegcolorspaces que es capaz de traducir de un espacio
> > >         de color a
> > >         > > > otro y el componente appsink, que es un buffer que
> > >         almacena los frames
> > >         > > > hasta que se los pedimos. Además, "caps" seleccionan el
> > >         formato que
> > >         > > > hemos configurado en el fichero cfg, de modo que los
> > >         frames que
> > >         > > > appsink nos da van en el formato que queremos (YUY2,
> > >         RGB888, GRAY8 por
> > >         > > > el momento).
> > >         > > >
> > >         > > >
> > >         > > > Para el caso concreto de las cámaras logitech, estas son
> > >         capaces de
> > >         > > > generar datos en yuy2 (YUV422) y jpeg de forma nativa
> > >         sin ninguna
> > >         > > > transformación software. Pero por alguna razón que
> > >         desconozco cuando
> > >         > > > montas el pipeline con los elementos comentados (sin
> > >         contar v4l2caps)
> > >         > > > el formato que negocia la cámara con ffmpegcolorspaces
> > >         no es ninguno
> > >         > > > de los nativos por lo que se hace una conversión extra
> > >         (ver ejecución
> > >         > > > al final del mail). Para evitar esto añadí al pipeline
> > >         "v4l2caps" que
> > >         > > > fijan el formato a YUY2 eliminando la conversión extra.
> > >         > > >
> > >         > > >
> > >         > > > Esto se hace concretamente aquí:
> > >         > > > st_element_link_filtered(source,videocolor,v4l2caps);
> > >         > > >
> > >         > > >
> > >         > > > El problema viene cuando pones una cámara que no puede
> > >         generar dicho
> > >         > > > formato, como parece ser el problema de la philips. Así,
> > >         creo que la
> > >         > > > solución es simplemente quitar v4l2caps y dejar que se
> > >         negocie el
> > >         > > > formato, a costa de que no sea el mas optimo, pero
> > >         ganando el soporte
> > >         > > > de mas cámaras.
> > >         > > >
> > >         > > >
> > >         > > > También cabe la posibilidad de que haya alguna manera
> > >         mejor de
> > >         > > > hacerlo, que yo de momento no he descubierto. En cuanto
> > >         tenga mas
> > >         > > > tiempo, me gustaría descubrir un poco mas de gstreamer,
> > >         que parece
> > >         > > > bastante interesante y potente para lo que buscamos.
> > >         > > >
> > >         > > >
> > >         > > > Espero haber aclarado el asunto.
> > >         > > >
> > >         > > >
> > >         > > > Un saludo,
> > >         > > > David.
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > > Ejecución que muestra la negociación camara
> > >         ffmpegcolorspaces:
> > >         > > >
> > >         > > >
> > >         > > > gst-launch-0.10 -v v4l2src device=/dev/video2 !
> > >         ffmpegcolorspace !
> > >         > > > video/x-raw-rgb,width=320,height=240 ! ximagesink
> > >         > > >
> > >         > > >
> > >         > > > (gst-launch-0.10:2960): GLib-WARNING **: g_set_prgname()
> > >         called
> > >         > > > multiple times
> > >         > > > Setting pipeline to PAUSED ...
> > >         > > > Xlib:  extension "Generic Event Extension" missing on
> > >         display
> > >         > > > "localhost:10.0".
> > >         > > > /GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src:
> > >         caps =
> > >         > > > video/x-raw-yuv, format=(fourcc)I420, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > > > Pipeline is live and does not need PREROLL ...
> > >         > > > Setting pipeline to PLAYING ...
> > >         > > > New clock: GstSystemClock
> > >         > >
> > >         > /GstPipeline:pipeline0/GstFFMpegCsp:ffmpegcsp0.GstPad:src:
> > >         caps =
> > >         > > > video/x-raw-rgb, bpp=(int)32, depth=(int)24,
> > >         endianness=(int)4321,
> > >         > > > red_mask=(int)65280, green_mask=(int)16711680,
> > >         > > > blue_mask=(int)-16777216, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > >
> > >         > /GstPipeline:pipeline0/GstFFMpegCsp:ffmpegcsp0.GstPad:sink:
> > >         caps =
> > >         > > > video/x-raw-yuv, format=(fourcc)I420, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > >
> > >         > /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src:
> > >         caps =
> > >         > > > video/x-raw-rgb, bpp=(int)32, depth=(int)24,
> > >         endianness=(int)4321,
> > >         > > > red_mask=(int)65280, green_mask=(int)16711680,
> > >         > > > blue_mask=(int)-16777216, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > >
> > >         > /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink:
> caps =
> > >         > > > video/x-raw-rgb, bpp=(int)32, depth=(int)24,
> > >         endianness=(int)4321,
> > >         > > > red_mask=(int)65280, green_mask=(int)16711680,
> > >         > > > blue_mask=(int)-16777216, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > >
> > >         > /GstPipeline:pipeline0/GstXImageSink:ximagesink0.GstPad:sink:
> caps =
> > >         > > > video/x-raw-rgb, bpp=(int)32, depth=(int)24,
> > >         endianness=(int)4321,
> > >         > > > red_mask=(int)65280, green_mask=(int)16711680,
> > >         > > > blue_mask=(int)-16777216, width=(int)320,
> > >         height=(int)240,
> > >         > > > framerate=(fraction)30/1,
> > >         pixel-aspect-ratio=(fraction)1/1
> > >         > > >
> > >         > > >
> > >         > > >
> > >         > > > 2010/3/13 Roberto Calvo <rocapal en libresoft.es>
> > >         > > >
> > >         > > >         Buenas,
> > >         > > >
> > >         > > >         Al arrancar el CameraServer contra la webcam
> > >         Philips V4l , me
> > >         > > >         da este error:
> > >         > > >
> > >         > > >         error: Error: Could not negotiate format
> > >         > > >
> > >         > > >         Y en el dmesg sale esto (parece que no consigue
> > >         poner los fps
> > >         > > >         adecuados).
> > >         > > >
> > >         > > >         [14566.456664] pwc: Failed to set video mode
> > >         SIF en 1 fps; return
> > >         > > >         code = -22
> > >         > > >         [14566.613554] pwc: Failed to set video mode
> > >         SIF en 2 fps; return
> > >         > > >         code = -22
> > >         > > >         [14566.766625] pwc: Failed to set video mode
> > >         SIF en 3 fps; return
> > >         > > >         code = -22
> > >         > > >         [14566.927300] pwc: Failed to set video mode
> > >         SIF en 4 fps; return
> > >         > > >         code = -22
> > >         > > >         [14571.280324] pwc: Failed to set video mode
> > >         SIF en 31 fps;
> > >         > > >         return code = -22
> > >         > > >
> > >         > > >         David, añadí la opción para v4l al cameraserver:
> > >         > > >
> > >         > > >          else if (config_.uri.find("v4l://") ==
> > >         0){/*handle v4l2
> > >         > > >         source*/
> > >         > > >              std::string dev =
> > >         config_.uri.substr(6);/*after v4l2://*/
> > >         > > >              source =
> > >         gst_element_factory_make("v4lsrc","source");
> > >         > > >
> > >          g_object_set(G_OBJECT(source),"device",dev.c_str(),NULL);
> > >         > > >              sink =
> > >         gst_element_factory_make("appsink","sink");
> > >         > > >              g_object_set(G_OBJECT(sink),"drop",1,NULL);
> > >         > > >
> > >          g_object_set(G_OBJECT(sink),"max-buffers",16,NULL);
> > >         > > >
> > >         > > >              videocolor =
> > >         > > >
> > >         gst_element_factory_make("ffmpegcolorspace","videocolor");
> > >         > > >
> > >         > > >
> > >
>  gst_bin_add_many(GST_BIN(pipeline),source,videocolor,sink,NULL);
> > >         > > >
> > >          gst_element_link_filtered(source,videocolor,v4l2caps);
> > >         > > >
> > >          gst_element_link_filtered(videocolor,sink,caps);
> > >         > > >            }
> > >         > > >
> > >         > > >         ¿Ves que puede estar pasando?
> > >         > > >
> > >         > > >         un saludete!
> > >         > > >
> > >         > > >         --
> > >         > > >         Roberto Calvo Palomino          | Libre
> > >         Software Engineering
> > >         > > >         Lab (GSyC)
> > >         > > >         Tel: (+34) 91 488 85 23         | Universidad
> > >         Rey Juan Carlos
> > >         > > >         rocapal en libresoft.es            | Edif.
> > >         Departamental II -
> > >         > > >         Despacho 116
> > >         > > >         http://libresoft.es/            | c/Tulipán s/n
> > >         28933 Móstoles
> > >         > > >         (Madrid)
> > >         > > >
> > >         > > >         GPG-KEY: http://gsyc.es/~rocapal/rocapal.gpg
> > >         > > >
> > >         > > >
> > >         > > > _______________________________________________
> > >         > > > Jde-developers mailing list
> > >         > > > Jde-developers en gsyc.es
> > >         > > >
> > >
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> > >         > >
> > >         > > _______________________________________________
> > >         > > Jde-developers mailing list
> > >         > > Jde-developers en gsyc.es
> > >         > >
> > >
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> > >         >
> > >         > _______________________________________________
> > >         > Jde-developers mailing list
> > >         > Jde-developers en gsyc.es
> > >         >
> > >
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> > >
> > >
> > >
> > >
> > >         --
> > >         http://gsyc.es/jmplaza
> > >         Universidad Rey Juan Carlos
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Jde-developers mailing list
> > > Jde-developers en gsyc.es
> > > http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> >
>
>
> --
> http://gsyc.es/jmplaza
> Universidad Rey Juan Carlos
>
>
>
------------ prxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20100319/53e9ca92/attachment-0001.htm 


More information about the Jde-developers mailing list