[Jde-dev] CameraServer y WebCam Philips

David Lobato dav.lobato en gmail.com
Sab Mar 13 23:10:41 CET 2010


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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20100313/f12cfa07/attachment.htm 


More information about the Jde-developers mailing list