diff vloopback.html @ 0:5f21a4dddc0c

Initial checkin
author KennethLavrsen
date Sun, 01 Apr 2007 05:22:43 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vloopback.html	Sun Apr 01 05:22:43 2007 +0000
@@ -0,0 +1,148 @@
+<HTML>
+<HEAD>
+    <TITLE>
+	Video4Linux loopback API
+    </TITLE>
+    <H1>
+        Video4Linux loopback API
+    </H1>
+</HEAD>
+<BODY bgcolor="white">
+    <P>
+	Author: Jeroen Vreeken (pe1rxq@amsat.org)<BR>
+	Version: 0.90<BR>
+	Date: 31-01-2001<BR>
+    </P>
+    <P>
+        <H2>
+    	    Introduction:
+	</H2>
+	This document describes the API for the Video4Linux loopback driver.
+	The driver implements a video pipe using two video4linux devices.
+	The first device is used by the program supplying the data,
+	from now on this program will be refered to with <I>'pusher'</I>.<BR>
+	The second device acts as if it were a normall video4linux device,
+	it should be usable by any application that honours the video4linux
+	specifications. This application will from now on be refered to as
+	<I>'client'</I>.<BR>
+	The calls and ioctls mentioned in this document refer to those
+	as described in the Video4Linux API.
+	<BR>
+	The loopback device has two operating modes:
+	<UL>
+	    <LI>
+		A simple one-copy mode in which <I>pusher</I> specifies the
+		size of the images and the used palette and uses write to
+		push its images to the pipe.<BR>
+		This mode is mostly for feeding fixed size images without any
+		knowledge about <I>client</I>.
+	    </LI>
+	    <LI>
+		A zero-copy mode in which <I>pusher</I> regularly polls the
+		device if <I>client</I> does an ioctl.<BR> 
+		In this mode <I>pusher</I> has almost complete control over the
+		devices behaviour and it will be mainly used to implement
+		complex multiple tuner/channel/size configurations.
+		With this mode it should be possible to use the Xvideo
+		extensions as normal video4linux capture devices.
+	    </LI>
+	</UL>
+    </P>
+    <P align=left>
+	<H2>
+	    Locating a free pipe
+	</H2>
+	In order to find an unused pipe <I>pusher</I> will have to scan
+	the contents of /proc/video/vloopback/<BR>
+	Each pipe will have its own entry in the form of <I>vloopback0</I> to
+	<I>vloopbackN</I>, N being the total number of available pipes-1.<BR>
+	There will also be a general <I>vloopbacks</I> file which will contain
+	information on all entries.
+	<BR>
+	Each of these files will have references to the input and output
+	video device and will also indicate if either of them is currently
+	in use.<BR>
+	<BR>
+	Once <I>pusher</I> has found a free pipe it can claim it by simply
+	opening the input device.
+    </P>
+    <P align=left>
+	<H2>
+	    One-copy mode
+	</H2>
+	In this mode <I>pusher</I> only has to provide images using the 
+	<B>write()</B> call,
+	the driver will handle the communication with <I>client</I> or
+	will drop the images if the output is unused.
+	To <I>client</I> the device will closely resemble a webcam driver.<BR>
+	<BR>
+	In order to use it <I>pusher</I> will open the input device.
+	Before writing it will first have to set the palette it is going to use
+	by calling <B>VIDIOCSPICT</B>, and the size by calling 
+	<B>VIDIOCSWIN</B>.
+	After this it can call <B>write()</B> for each frame it wants to send
+	to the pipe.<BR>
+	<BR>
+	When there is no application using the device the driver will simply
+	drop the frames which will result in a 'no-copy' situation while
+	writing to an unused pipe.<BR>
+	<I>Note: when client is using read() instead of mmap() the driver will
+	actually use a double copy.</I>
+    </P>
+    <P align=left>
+	<H2>
+	    Zero-copy mode
+	</H2>
+	In this mode the driver will forward nearly all ioctls to
+	<I>pusher</I>.<BR>
+	<BR>
+	To initiate this mode <I>pusher</I> will have to call <B>mmap()</B>
+	with the size of the requested buffer.
+	The driver will allocate memory for this buffer and <I>pusher</I> will
+	gain access to it.<BR>
+	<I>Note: as the allocated memory might be in use by client, pusher is
+	NOT allowed to touch it under any circumstances with the only exeption
+	being between <B>VIDIOCMCAPTURE</B> and <B>VIDIOCSYNC</B>.</I><BR>
+	<BR>
+	<B>
+	    Handling ioctls
+	</B><BR>
+	<BR>
+	When <I>client</I> has issued an ioctl <I>pusher</I> will receive a
+	<B>SIGIO</B> signal.
+	Pusher may check to see if it is comming from vloopback by calling
+	<B>poll()</B> first.
+	It then has to respond by calling <B>read()</B>
+	with a large enough buffer for the largest possible ioctl data
+	structure plus <B>sizeof(unsigned long int)</B>. <I>(The largest ioctl data structure is 280 bytes
+	in linux kernel 2.4.0-test10pre1, a buffer of 1024 bytes is recommended)
+	</I><BR>
+	The first bytes of this buffer will be the ioctl number.
+	This number is an unsigned long int, the remaining data is the data supplied by <I>client</I>.
+	<I>Pusher</I> will now have to handle this ioctl.<BR>
+	<BR>
+	If it is an ioctl requesting data <I>pusher</I> will answer it by
+	calling the ioctl with the requested data.<BR>
+	If it is an ioctl setting data <I>pusher</I> will call the ioctl with
+	the exact same data to accept it.<BR>
+	<BR>
+	<B>
+	    Handling read
+	</B><BR>
+	<BR>
+	<I>Pusher</I> will not need to handle any read requests because the
+	kernel module will fake an mmap and sync call for it.<BR>
+	<BR>
+	<B>
+	    Starting and stopping capture
+	</B><BR>
+	<BR>
+	The first time <B>VIDIOCMCAPTURE</B> is called <I>pusher</I> should
+	initialize capture and start capturing of the requested frames into
+	the mmapped buffer.<BR>
+	When <I>client</I> closes its device an 'ioctl' 0 will be send with
+	no data, <I>pusher</I> will tell the hardware to stop.
+	<BR>
+    </P>
+</BODY>
+</HTML>
\ No newline at end of file