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