[Jde-dev] CameraServer y WebCam Philips

JoseMaria jmplaza en gsyc.es
Lun Mar 15 09:34:47 CET 2010


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




More information about the Jde-developers mailing list