[Jde-dev] CameraServer y WebCam Philips

David Lobato dav.lobato en gmail.com
Lun Mar 15 14:18:17 CET 2010


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.

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).

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
>
>
>
------------ prxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20100315/1c79aa6b/attachment-0001.htm 


More information about the Jde-developers mailing list