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