<div>Hola,</div><div><br></div>El error &quot;Could not negociate format&quot; sale cuando alguno de los componentes del pipeline no puede funcionar en el formato que le estamos pidiendo.<div><br></div><div>

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:</div>


<div><br></div><div>camara -----&gt; ffmpegcolorspaces ------&gt; appsink</div><div>              |                                    |</div><div>          v4l2caps                         caps</div><div><br></div><div>

<br>
</div><div>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 &quot;capabilities&quot; que vienen a ser una descripción del formato.</div>


<div><br></div><div>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, &quot;caps&quot; 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). </div>


<div><br></div><div>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 &quot;v4l2caps&quot; que fijan el formato a YUY2 eliminando la conversión extra.</div>


<div><br></div><div>Esto se hace concretamente aquí:</div><div><i>st_element_link_filtered(</i><i>source,videocolor,v4l2caps);</i></div><div><i><br></i></div><div>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.</div>
<div><br></div><div>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.</div>
<div><br></div><div>Espero haber aclarado el asunto.</div><div><br></div><div>Un saludo,</div><div>David.</div><div><br><br></div><div><br></div><div>Ejecución que muestra la negociación camara ffmpegcolorspaces:</div><div>
<br></div><div><div>gst-launch-0.10 -v v4l2src device=/dev/video2 ! ffmpegcolorspace ! video/x-raw-rgb,width=320,height=240 ! ximagesink</div><div><br></div><div>(gst-launch-0.10:2960): GLib-WARNING **: g_set_prgname() called multiple times</div>
<div>Setting pipeline to PAUSED ...</div><div>Xlib:  extension &quot;Generic Event Extension&quot; missing on display &quot;localhost:10.0&quot;.</div><div><span class="Apple-style-span" style="background-color: rgb(255, 255, 51);">/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</span></div>
<div>Pipeline is live and does not need PREROLL ...</div><div>Setting pipeline to PLAYING ...</div><div>New clock: GstSystemClock</div><div>/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</div>
<div><span class="Apple-style-span" style="background-color: rgb(255, 255, 51);">/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</span></div>
<div>/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</div>
<div>/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</div>
<div>/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</div>
</div><div><br></div><div><br><div class="gmail_quote">2010/3/13 Roberto Calvo <span dir="ltr">&lt;<a href="mailto:rocapal@libresoft.es" target="_blank">rocapal@libresoft.es</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Buenas,<br>
<br>
Al arrancar el CameraServer contra la webcam Philips V4l , me da este error:<br>
<br>
error: Error: Could not negotiate format<br>
<br>
Y en el dmesg sale esto (parece que no consigue poner los fps adecuados).<br>
<br>
[14566.456664] pwc: Failed to set video mode SIF@1 fps; return code = -22<br>
[14566.613554] pwc: Failed to set video mode SIF@2 fps; return code = -22<br>
[14566.766625] pwc: Failed to set video mode SIF@3 fps; return code = -22<br>
[14566.927300] pwc: Failed to set video mode SIF@4 fps; return code = -22<br>
[14571.280324] pwc: Failed to set video mode SIF@31 fps; return code = -22<br>
<br>
David, añadí la opción para v4l al cameraserver:<br>
<br>
 else if (config_.uri.find(&quot;v4l://&quot;) == 0){/*handle v4l2 source*/<br>
      std::string dev = config_.uri.substr(6);/*after v4l2://*/<br>
      source = gst_element_factory_make(&quot;v4lsrc&quot;,&quot;source&quot;);<br>
      g_object_set(G_OBJECT(source),&quot;device&quot;,dev.c_str(),NULL);<br>
      sink = gst_element_factory_make(&quot;appsink&quot;,&quot;sink&quot;);<br>
      g_object_set(G_OBJECT(sink),&quot;drop&quot;,1,NULL);<br>
      g_object_set(G_OBJECT(sink),&quot;max-buffers&quot;,16,NULL);<br>
<br>
      videocolor = gst_element_factory_make(&quot;ffmpegcolorspace&quot;,&quot;videocolor&quot;);<br>
      gst_bin_add_many(GST_BIN(pipeline),source,videocolor,sink,NULL);<br>
      gst_element_link_filtered(source,videocolor,v4l2caps);<br>
      gst_element_link_filtered(videocolor,sink,caps);<br>
    }<br>
<br>
¿Ves que puede estar pasando?<br>
<br>
un saludete!<br>
<font color="#888888"><br>
--<br>
Roberto Calvo Palomino          | Libre Software Engineering Lab (GSyC)<br>
Tel: (+34) 91 488 85 23         | Universidad Rey Juan Carlos<br>
<a href="mailto:rocapal@libresoft.es" target="_blank">rocapal@libresoft.es</a>            | Edif. Departamental II - Despacho 116<br>
<a href="http://libresoft.es/" target="_blank">http://libresoft.es/</a>            | c/Tulipán s/n 28933 Móstoles (Madrid)<br>
<br>
GPG-KEY: <a href="http://gsyc.es/~rocapal/rocapal.gpg" target="_blank">http://gsyc.es/~rocapal/rocapal.gpg</a><br>
</font></blockquote></div><br></div>