Camerabin : Failed to link camera source's vfsrc pad to viewfinder queue

Lee Matthews lma at spaceapplications.com
Tue Jun 17 07:45:05 PDT 2014


> What exactly is vfsrc ? I cannot find any reference to it. If it means view finder source, I don't understand why the v4l2src element would have these pads...

I suspect camerabin wants a 'wrappercamerasrc' here. So try creating a
'wrappercamerasrc' element, set v4l2src on that as source via the
"video-source" property,and then add the wrappercamerasrc as source on
camerabin via the "camera-source" property.

 Cheers
  -Tim

--
Thanks Tim. I'm still having problems though, generally some confusion regarding the camerabin I think.

I have tried setting up a pipeline as follows :

  	g_print("create camera.\n");
  	pipeline  = gst_element_factory_make ("camerabin", "camerabin");
	if(!pipeline) 
	{
		g_print("camera create fail.\n");
		return HTTP_FAIL;
	}
  	
  	g_print("create camera wrapper.\n");
  	camerawrapper  = gst_element_factory_make ("wrappercamerabinsrc", "wrappercamerabinsrc");
	if(!camerawrapper) 
	{
		g_print("camerawrapper create fail.\n");
		return HTTP_FAIL;
	}
	
  	g_print("create source.\n");
  	source  = gst_element_factory_make ("v4l2src", "webcam");
	if(!source) 
	{
		g_print("source create fail.\n");
		return HTTP_FAIL;
	} 
  	
  	g_print("set device location.\n");
  	g_object_set (source,"device","/dev/video3",NULL); 
  	
  	g_print("set camerawrapper video source.\n");
  	g_object_set (camerawrapper,"video-source",source,NULL); 	
  	
  	g_print("set camerabin camera-source.\n");
  	g_object_set (pipeline,"camera-source",camerawrapper,NULL); 
  	
  	g_print("create vp8enc.\n");
  	vp8enc  = gst_element_factory_make ("vp8enc", "vp8enc");
	if(!vp8enc) 
	{
		g_print("vp8enc create fail.\n");
		return HTTP_FAIL;
	}
   	
  	g_print("create webmmux.\n");
  	webmmux  = gst_element_factory_make ("webmmux", "webmmux");
	if(!webmmux) 
	{
		g_print("webmmux create fail.\n");
		return HTTP_FAIL;
	}
  	
  	g_print("create multisocketsink.\n");
  	multisocketsink = gst_element_factory_make ("multisocketsink", NULL);
  	g_object_set (multisocketsink,
		"unit-format", GST_FORMAT_TIME,
      	"units-max", (gint64) 7 * GST_SECOND,
      	"units-soft-max", (gint64) 3 * GST_SECOND,
      	"recover-policy", 3 /* keyframe */ ,
      	"timeout", (guint64) 10 * GST_SECOND,
      	"sync-method", 1 /* next-keyframe */ ,
      	NULL);
  	
  	if(!multisocketsink) 
	{
		g_print("multisocketsink create fail.\n");
		return HTTP_FAIL;
	}
  	
  	gst_bin_add_many (GST_BIN (pipeline), vp8enc, webmmux, multisocketsink, NULL);
  	
 	if(!gst_element_link_many(vp8enc, webmmux,multisocketsink, NULL))
  	{
		g_print("Unable to link encoder and mux elements.\n");
		return HTTP_FAIL;
	} 
  	
    g_print("set viewdfinder.\n");
  	g_object_set (pipeline,"viewfinder-sink",vp8enc,NULL); 
  	g_print("end set viewdfinder.\n");

--

When I set the pipeline to play, I get the following :

I/GStreamer+basetransform(29884): 0:00:18.286744993 0x78566580 gstbasetransform.c:1359:gst_base_transform_setcaps:<imagebin-capsfilter> reuse caps
I/GStreamer+GST_EVENT(29884): 0:00:18.286855150 0x78566580 gstevent.c:677:gst_event_new_caps creating caps event video/x-raw, format=(string)YUY2, width=(int)2304, height=(int)1536, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, framerate=(fraction)2/1
I/GStreamer+v4l2(29884): 0:00:18.319647285 0x78566580 gstv4l2bufferpool.c:473:gst_v4l2_buffer_pool_set_config:<webcam:pool:src> increasing minimum buffers to 2
I/GStreamer+v4l2(29884): 0:00:18.319709420 0x78566580 gstv4l2bufferpool.c:479:gst_v4l2_buffer_pool_set_config:<webcam:pool:src> reducing maximum buffers to 32
I/GStreamer+v4l2(29884): 0:00:18.319761868 0x78566580 gstv4l2bufferpool.c:490:gst_v4l2_buffer_pool_set_config:<webcam:pool:src> can't allocate, setting maximum to minimum
E/GStreamer+v4l2(29884): 0:00:18.334737649 0x78566580 gstv4l2bufferpool.c:550:gst_v4l2_buffer_pool_streamon:<webcam:pool:src> error with STREAMON 22 (Invalid argument)
E/GStreamer+v4l2allocator(29884): 0:00:18.334862805 0x78566580 gstv4l2allocator.c:1326:gst_v4l2_allocator_dqbuf:<webcam:pool:src:allocator> failed dequeuing a mmap buffer: Invalid argument
E/GStreamer+v4l2allocator(29884): 0:00:18.334921816 0x78566580 gstv4l2allocator.c:1338:gst_v4l2_allocator_dqbuf:<webcam:pool:src:allocator> The buffer type is not supported, or the index is out of bounds, or no buffers have been allocated yet, or the userptr or length are invalid.
W/GStreamer+v4l2src(29884): 0:00:18.334977805 0x78566580 gstv4l2src.c:736:gst_v4l2src_create:<webcam> error: Failed to allocate a buffer
I/GStreamer+GST_ERROR_SYSTEM(29884): 0:00:18.335234472 0x78566580 gstelement.c:1832:gst_element_message_full:<webcam> posting message: Failed to allocate a buffer
I/GLib+stdout(29884): Error Failed to allocate a buffer

I seem to remember having a STREAMON 22 error before and it looks like it was do with the configuration of the caps. But I'm not sure how I would set the caps for camerabin.

Do I create a pipeline, with v4l2src, my caps filter, and a videoconvert and then link this to the video-source property in wrappercamerabinsrc ?

Or do I try and set the caps in camerabin's video-capture-caps property ?

I wish to be able to stream encoded video over the network using multisocketsink, I equally need to be able to save the encoded video to disk on command.

Can I presume that video is being transmitted from camerabin to viewfinder-sink in binary format ? If I wish to use this to transmit over the network would I need to do my encoding twice ? (ie once within camerabin - to save to the disk, and once outside of camerabin - to stream over the network ?)

Thanks
Lee


-- 
Tim Müller, Centricular Ltd - http://www.centricular.com

_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


More information about the gstreamer-devel mailing list