Mercurial > vloopback
annotate vloopback.c @ 7:2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
| author | AngelCarpintero |
|---|---|
| date | Sun, 24 Aug 2008 02:20:51 +0000 |
| parents | dc1f4ad7010c |
| children | 80590d10a596 |
| rev | line source |
|---|---|
| 0 | 1 /* |
| 2 * vloopback.c | |
| 3 * | |
| 4 * Copyright Jeroen Vreeken (pe1rxq@amsat.org), 2000 | |
| 5 * Additional copyright by the contributing authors in the | |
| 6 * change history below, 2000-2007 | |
| 7 * | |
| 8 * Published under the GNU Public License. | |
| 9 * | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
10 * The Video loopback Loopback Device is no longer systematically maintained. |
| 0 | 11 * The project is a secondary project for the project "motion" found at |
| 12 * http://motion.sourceforge.net/ and | |
| 13 * http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome | |
| 14 * and with the vloopback stored at | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
15 * http://www.lavrsen.dk/twiki/bin/view/Motion/Video loopbackFourLinuxLoopbackDevice |
| 0 | 16 * |
| 17 * CHANGE HISTORY | |
| 18 * | |
| 19 * UPDATED: Jeroen Vreeken. | |
| 20 * Added locks for smp machines. UNTESTED! | |
| 21 * Made the driver much more cpu friendly by using | |
| 22 * a wait queue. | |
| 23 * Went from vmalloc to rvmalloc (yes, I stole the code | |
| 24 * like everybody else) and implemented mmap. | |
| 25 * Implemented VIDIOCGUNIT and removed size/palette checks | |
| 26 * in VIDIOCSYNC. | |
| 27 * Cleaned up a lot of code. | |
| 28 * Changed locks to semaphores. | |
| 29 * Disabled changing size while somebody is using mmap | |
| 30 * Changed mapped check to open check, also don't allow | |
| 31 * a open for write while somebody is reading. | |
| 32 * Added /proc support | |
| 33 * Set dumped count to zero at open. | |
| 34 * Modified /proc layout (added vloopbacks entry) | |
| 35 * | |
| 36 * 05.10.00 (MTS) Added Linux 2.2 support | |
| 37 * 06.10.00 (J Vreeken) Fixed 2.2 support to make things work under 2.4 again. | |
| 38 * 17.10.00 (J Vreeken) Added zero copy mode | |
| 39 * 19.10.00 (J Vreeken) Added SIGIO on device close. | |
| 40 * 24.10.00 (J Vreeken) Modified 2.2 stuff and removed spinlock.h | |
| 41 * released 0.81 | |
| 42 * 27.10.00 (J Vreeken) Implemented poll | |
| 43 * released 0.82 | |
| 44 * 17.01.01 (J Vreeken) support for xawtv | |
| 45 * Implemented VIDIOCGFBUF | |
| 46 * Additional checks on framebuffer freeing. | |
| 47 * released 0.83 | |
| 48 * 31.01.01 (J Vreeken) Removed need for 'struct ioctl', use _IOC_SIZE() and | |
| 49 * IOC_IN instead. | |
| 50 * Change the ioctlnr passing to 'unsigned long int' | |
| 51 * Instead of just one byte. | |
| 52 * THIS BREAKS COMPATIBILITY WITH PREVIOUS VERSIONS!!! | |
| 53 * 29.06.01 (J Vreeken) Added dev_offset module option | |
| 54 * Made vloopback_template sane | |
| 55 * Added double buffering support | |
| 56 * Made vloopback less verbose | |
| 57 * 20.11.01 (tibit) Made dev_offset option sane | |
| 58 * "Fixed" zerocopy mode by defining the ioctl | |
| 59 * VIDIOCSINVALID. An application which provides data | |
| 60 * has to issue it when it encounters an error in | |
| 61 * ioctl processing. See dummy.c for examples. | |
| 62 * 26.11.03 (Kenneth Lavrsen) | |
| 63 * released 0.91 | |
| 64 * 0.91 is the combination of the 0.90-tibit by | |
| 65 * Tilmann Bitterberg and an update of the Makefile by | |
| 66 * Roberto Carvajal. | |
| 67 * 23.01.05 (W Brack) | |
| 68 * (don't know what happened to the comments for 0.92 | |
| 69 * and 0.93, but I tentatively named this one as 0.99) | |
| 70 * enhanced for linux-2.6, with #ifdef to keep it | |
| 71 * compatible with linux-2.4. For linux versions | |
| 72 * > 2.5, I changed the memory management | |
| 73 * routines to the "more modern" way, most of it | |
| 74 * shamelessly copied from other drivers. I also | |
| 75 * added in the code necessary to avoid the "videodev | |
| 76 * has no release callback" message when installing. | |
| 77 * For versions < 2.5, I updated the routines to be | |
| 78 * closer to several other drivers. | |
| 79 * | |
| 80 * 04.02.05 (Angel Carpintero) | |
| 81 * Fixed version number to 0.93-pre1. | |
| 82 * Fixed warning for interruptible_sleep_on() deprecated and added | |
| 83 * wait_event_interruptible compatible with 2.6.x and 2.7. | |
| 84 * Fixed memory manager for kernel version > 2.6.9. | |
| 85 * | |
| 86 * 07.02.05 (Kenneth Lavrsen) | |
| 87 * Changed version to 0.94. | |
| 88 * Released as formal released version | |
| 89 * | |
| 90 * 20.02.05 (W Brack) | |
| 91 * Fixed error with wait_event_interruptible. | |
| 92 * Fixed crash when pipe source was stopped before dest. | |
| 93 * | |
| 94 * 20.02.05 (Angel Carpintero) | |
| 95 * Added install and uninstall in Makefile. | |
| 96 * | |
| 97 * | |
| 98 * 25.04.05 (Angel Carpintero) | |
| 99 * Included Samuel Audet's patch, it checks if the input is already | |
| 100 * opened in write mode. | |
| 101 * | |
| 102 * 02.05.05 (Kenneth Lavrsen) | |
| 103 * Released 0.95-snap2 formerly as 0.95 | |
| 104 * | |
| 105 * 10.05.05 (Angel Carpintero) | |
| 106 * Added MODULE_VERSION(), fixed create_pipes when video_register_device() returns | |
| 107 * -ENFILE . | |
| 108 * Fix warnings about checking return value from copy_to_user() and copy_from_user() functions. | |
| 109 * | |
| 110 * 14.11.05 (Angel Carpintero) | |
| 111 * Added <linux/version.h> that includes LINUX_VERSION_CODE and KERNEL_VERSION to fix | |
| 112 * compilation agains kernel 2.6.14 , change version to 0.97-snap1 | |
| 113 * | |
| 114 * 19.12.05 (Angel Carpintero) | |
| 115 * Added to example option to choose between rgb24 or yuv420p palettes. | |
| 116 * | |
| 117 * 31.12.05 (Angel Carpintero) | |
| 118 * Fixed examples, remove perror calls and add support to dummy.c for sysfs. | |
| 119 * | |
| 120 * 04.06.06 (Angel Carpintero) | |
| 121 * Add module_param() for kernel > 2.5 because MODULE_PARAM() macro is obsolete. | |
| 122 * | |
| 123 * 17.06.06 (Angel Carpintero) | |
| 124 * Release version 1.0 with some fixes and code clean up. Added a Jack Bates contribution | |
| 125 * to allow build a kernel module in debian way. | |
| 126 * | |
| 127 * 26.06.06 (Angel Carpintero) | |
| 128 * Added some improvements in Makefile. Fix a problem to compile in Suse. | |
| 129 * | |
| 130 * | |
| 131 * 02.11.06 (Angel Carpintero) | |
| 132 * Make compatible with new kernel stable version 2.6.18, Many functions and declarations has | |
| 133 * been moved to media/v42l-dev.h and remove from videodev.h/videodev2.h | |
| 134 * | |
| 135 * 18.01.07 (Angel Carpintero) | |
| 4 | 136 * Change -ENOIOCTLCMD by more appropiate error -ENOTTY. |
| 137 * | |
| 138 * 18.05.08 (Angel Carpintero) | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
139 * Release 1.1-rc1 as 1.1 stable working with 2.6.24 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
140 * |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
141 * 17.08.08 (Angel Carpintero) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
142 * kill_proc() deprecated ,pid API changed , type and owner not available in |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
143 * video_device struct, added param debug. |
| 0 | 144 */ |
| 145 | |
| 146 | |
| 4 | 147 #define VLOOPBACK_VERSION "1.2-trunk" |
| 0 | 148 |
| 149 /* Include files common to 2.4 and 2.6 versions */ | |
| 150 #include <linux/version.h> /* >= 2.6.14 LINUX_VERSION_CODE */ | |
| 151 #include <linux/errno.h> | |
| 152 #include <linux/kernel.h> | |
| 153 #include <linux/module.h> | |
| 154 #include <linux/pagemap.h> | |
| 155 | |
| 156 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
157 #include <media/v4l2-common.h> |
| 0 | 158 #endif |
| 159 | |
| 160 #include <linux/videodev.h> | |
| 161 #include <linux/vmalloc.h> | |
| 162 #include <linux/wait.h> | |
| 163 | |
| 164 /* Include files which are unique to versions */ | |
| 165 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 166 #include <asm/ioctl.h> | |
| 167 #include <asm/page.h> | |
| 168 #include <asm/pgtable.h> | |
| 169 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10) | |
| 170 #ifndef remap_pfn_range | |
| 171 #define remap_pfn_range(a,b,c,d,e) \ | |
| 172 remap_page_range((a),(b),(c)<<PAGE_SHIFT,(d),(e)) | |
| 173 #endif | |
| 174 #ifndef vmalloc_to_pfn | |
| 175 #define vmalloc_to_pfn(a) page_to_pfn(vmalloc_to_page((a))) | |
| 176 #endif | |
| 177 #endif | |
| 178 #include <asm/uaccess.h> | |
| 179 #include <linux/init.h> | |
| 180 #include <linux/device.h> | |
| 181 #else | |
| 182 #include <linux/mm.h> | |
| 183 #include <linux/slab.h> | |
| 184 #include <linux/wrapper.h> | |
| 185 #include <asm/io.h> | |
| 186 #endif | |
| 187 | |
| 188 #define VIDIOCSINVALID _IO('v',BASE_VIDIOCPRIVATE+1) | |
| 189 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
190 #define verbose(format, arg...) if (printk_ratelimit()) \ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
191 printk(KERN_INFO "[%s] %s: " format "\n" "", \ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
192 __FUNCTION__, __FILE__, ## arg) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
193 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
194 #define info(format, arg...) if (printk_ratelimit()) \ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
195 printk(KERN_INFO "[%s] : " format "\n" "", \ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
196 __FUNCTION__, ## arg) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
197 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
198 #define LOG_NODEBUG 0 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
199 #define LOG_FUNCTIONS 1 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
200 #define LOG_IOCTL 2 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
201 #define LOG_VERBOSE 3 |
| 0 | 202 |
| 203 struct vloopback_private { | |
| 204 int pipenr; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
205 int in; /* bool , is being feed ? */ |
| 0 | 206 }; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
207 |
| 0 | 208 typedef struct vloopback_private *priv_ptr; |
| 209 | |
| 210 struct vloopback_pipe { | |
| 211 struct video_device *vloopin; | |
| 212 struct video_device *vloopout; | |
| 213 char *buffer; | |
| 214 unsigned long buflength; | |
| 215 unsigned int width, height; | |
| 216 unsigned int palette; | |
| 217 unsigned long frameswrite; | |
| 218 unsigned long framesread; | |
| 219 unsigned long framesdumped; | |
| 220 unsigned int wopen; | |
| 221 unsigned int ropen; | |
| 222 struct semaphore lock; | |
| 223 wait_queue_head_t wait; | |
| 224 unsigned int frame; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
225 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
| 0 | 226 unsigned int pid; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
227 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
228 struct pid *pid; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
229 #endif |
| 0 | 230 unsigned int zerocopy; |
| 231 unsigned long int ioctlnr; | |
| 232 unsigned int invalid_ioctl; /* 0 .. none invalid; 1 .. invalid */ | |
| 233 unsigned int ioctllength; | |
| 234 char *ioctldata; | |
| 235 char *ioctlretdata; | |
| 236 }; | |
| 237 | |
| 238 #define MAX_PIPES 16 | |
| 239 #define N_BUFFS 2 /* Number of buffers used for pipes */ | |
| 240 | |
| 241 static struct vloopback_pipe *loops[MAX_PIPES]; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
242 static int nr_o_pipes = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
243 static int pipes = -1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
244 static int spares = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
245 static int pipesused = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
246 static int dev_offset = -1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
247 static unsigned int debug = LOG_NODEBUG; |
| 0 | 248 |
| 249 /********************************************************************** | |
| 250 * | |
| 251 * Memory management - revised for 2.6 kernels | |
| 252 * | |
| 253 **********************************************************************/ | |
| 254 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 255 /* Here we want the physical address of the memory. | |
| 256 * This is used when initializing the contents of the | |
| 257 * area and marking the pages as reserved. | |
| 258 */ | |
| 259 static inline unsigned long kvirt_to_pa(unsigned long adr) | |
| 260 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
261 unsigned long kva; |
| 0 | 262 |
| 263 kva = (unsigned long)page_address(vmalloc_to_page((void *)adr)); | |
| 264 kva |= adr & (PAGE_SIZE-1); /* restore the offset */ | |
| 265 return __pa(kva); | |
| 266 } | |
| 267 #endif | |
| 268 | |
| 269 static void *rvmalloc(unsigned long size) | |
| 270 { | |
| 271 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) | |
| 272 struct page *page; | |
| 273 #endif | |
| 274 void *mem; | |
| 275 unsigned long adr; | |
| 276 | |
| 277 size = PAGE_ALIGN(size); | |
| 278 mem = vmalloc_32(size); | |
| 279 if (!mem) | |
| 280 return NULL; | |
| 281 memset(mem, 0, size); /* Clear the ram out, no junk to the user */ | |
| 282 adr = (unsigned long) mem; | |
| 283 while (size > 0) { | |
| 284 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) | |
| 285 page = vmalloc_to_page((void *)adr); | |
| 286 mem_map_reserve(page); | |
| 287 #else | |
| 288 SetPageReserved(vmalloc_to_page((void *)adr)); | |
| 289 #endif | |
| 290 adr += PAGE_SIZE; | |
| 291 size -= PAGE_SIZE; | |
| 292 } | |
| 293 | |
| 294 return mem; | |
| 295 } | |
| 296 | |
| 297 static void rvfree(void *mem, unsigned long size) | |
| 298 { | |
| 299 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) | |
| 300 struct page *page; | |
| 301 #endif | |
| 302 unsigned long adr; | |
| 303 | |
| 304 if (!mem) | |
| 305 return; | |
| 306 | |
| 307 adr = (unsigned long) mem; | |
| 308 while ((long) size > 0) { | |
| 309 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) | |
| 310 page = vmalloc_to_page((void *)adr); | |
| 311 mem_map_unreserve(page); | |
| 312 #else | |
| 313 ClearPageReserved(vmalloc_to_page((void *)adr)); | |
| 314 #endif | |
| 315 adr += PAGE_SIZE; | |
| 316 size -= PAGE_SIZE; | |
| 317 } | |
| 318 vfree(mem); | |
| 319 } | |
| 320 | |
| 321 | |
| 322 static int create_pipe(int nr); | |
| 323 | |
| 324 static int fake_ioctl(int nr, unsigned long int cmd, void *arg) | |
| 325 { | |
| 326 unsigned long fw; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
327 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
328 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
329 info("Video loopback %d cmd %lu", nr, cmd); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
330 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
331 loops[nr]->ioctlnr = cmd; |
| 0 | 332 memcpy(loops[nr]->ioctldata, arg, _IOC_SIZE(cmd)); |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
333 loops[nr]->ioctllength = _IOC_SIZE(cmd); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
334 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
335 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
336 kill_proc(loops[nr]->pid, SIGIO, 1); /* Signal the pipe feeder */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
337 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
338 kill_pid(loops[nr]->pid, SIGIO, 1); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
339 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
340 |
| 0 | 341 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) |
| 342 fw = loops[nr]->frameswrite; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
343 wait_event_interruptible(loops[nr]->wait, fw != loops[nr]->frameswrite); |
| 0 | 344 #else |
| 345 interruptible_sleep_on(&loops[nr]->wait); | |
| 346 #endif | |
| 347 if (cmd & IOC_IN) { | |
| 348 if (memcmp (arg, loops[nr]->ioctlretdata, _IOC_SIZE(cmd))) | |
| 349 return 1; | |
| 350 } else { | |
| 351 memcpy (arg, loops[nr]->ioctlretdata, _IOC_SIZE(cmd)); | |
| 352 } | |
| 353 return 0; | |
| 354 } | |
| 355 | |
| 356 static int vloopback_open(struct inode *inod, struct file *f) | |
| 357 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
358 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
359 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
360 int nr = ptr->pipenr; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
361 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
362 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
363 info("Video loopback %d", nr); |
| 0 | 364 |
| 365 /* Only allow a output to be opened if there is someone feeding | |
| 366 * the pipe. | |
| 367 */ | |
| 368 if (!ptr->in) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
369 if (loops[nr]->buffer == NULL) |
| 0 | 370 return -EINVAL; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
371 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
372 loops[nr]->framesread = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
373 loops[nr]->ropen = 1; |
| 0 | 374 } else { |
| 375 if (loops[nr]->ropen || loops[nr]->wopen) | |
| 376 return -EBUSY; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
377 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
378 loops[nr]->framesdumped = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
379 loops[nr]->frameswrite = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
380 loops[nr]->wopen = 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
381 loops[nr]->zerocopy = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
382 loops[nr]->ioctlnr = -1; |
| 0 | 383 pipesused++; |
| 384 if (nr_o_pipes-pipesused<spares) { | |
| 385 if (!create_pipe(nr_o_pipes)) { | |
| 386 info("Creating extra spare pipe"); | |
| 387 info("Loopback %d registered, input: video%d, output: video%d", | |
| 388 nr_o_pipes, | |
| 389 loops[nr_o_pipes]->vloopin->minor, | |
| 390 loops[nr_o_pipes]->vloopout->minor | |
| 391 ); | |
| 392 nr_o_pipes++; | |
| 393 } | |
| 394 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
395 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
396 loops[nr]->pid = current->pid; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
397 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
398 // TODO : Check in stable 2.6.27 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
399 loops[nr]->pid = task_pid(find_task_by_vpid(current->pid)); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
400 //loops[nr]->pid = task_pid(current); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
401 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
402 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
403 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
404 info("Current pid %d", current->pid); |
| 0 | 405 } |
| 406 return 0; | |
| 407 } | |
| 408 | |
| 409 static int vloopback_release(struct inode * inod, struct file *f) | |
| 410 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
411 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
412 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
413 int nr = ptr->pipenr; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
414 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
415 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
416 info("Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
417 |
| 0 | 418 if (ptr->in) { |
| 419 down(&loops[nr]->lock); | |
| 420 if (loops[nr]->buffer && !loops[nr]->ropen) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
421 rvfree(loops[nr]->buffer, loops[nr]->buflength * N_BUFFS); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
422 loops[nr]->buffer = NULL; |
| 0 | 423 } |
| 424 up(&loops[nr]->lock); | |
| 425 loops[nr]->frameswrite++; | |
| 426 if (waitqueue_active(&loops[nr]->wait)) | |
| 427 wake_up(&loops[nr]->wait); | |
| 428 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
429 loops[nr]->width = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
430 loops[nr]->height = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
431 loops[nr]->palette = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
432 loops[nr]->wopen = 0; |
| 0 | 433 pipesused--; |
| 434 } else { | |
| 435 down(&loops[nr]->lock); | |
| 436 if (loops[nr]->buffer && !loops[nr]->wopen) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
437 rvfree(loops[nr]->buffer, loops[nr]->buflength * N_BUFFS); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
438 loops[nr]->buffer = NULL; |
| 0 | 439 } |
| 440 up(&loops[nr]->lock); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
441 loops[nr]->ropen = 0; |
| 0 | 442 if (loops[nr]->zerocopy && loops[nr]->buffer) { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
443 loops[nr]->ioctlnr = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
444 loops[nr]->ioctllength = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
445 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
446 kill_proc(loops[nr]->pid, SIGIO, 1); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
447 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
448 kill_pid(loops[nr]->pid, SIGIO, 1); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
449 #endif |
| 0 | 450 } |
| 451 } | |
| 452 | |
| 453 return 0; | |
| 454 } | |
| 455 | |
| 456 static ssize_t vloopback_write(struct file *f, const char *buf, | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
457 size_t count, loff_t *offset) |
| 0 | 458 { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
459 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
460 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
461 int nr = ptr->pipenr; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
462 unsigned long realcount = count; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
463 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
464 if (debug > LOG_IOCTL) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
465 info("Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
466 |
| 0 | 467 if (!ptr->in) |
| 468 return -EINVAL; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
469 |
| 0 | 470 if (loops[nr]->zerocopy) |
| 471 return -EINVAL; | |
| 472 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
473 if (loops[nr]->buffer == NULL) |
| 0 | 474 return -EINVAL; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
475 |
| 0 | 476 /* Anybody want some pictures??? */ |
| 477 if (!waitqueue_active(&loops[nr]->wait)) { | |
| 478 loops[nr]->framesdumped++; | |
| 479 return realcount; | |
| 480 } | |
| 481 | |
| 482 down(&loops[nr]->lock); | |
| 483 if (!loops[nr]->buffer) { | |
| 484 up(&loops[nr]->lock); | |
| 485 return -EINVAL; | |
| 486 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
487 |
| 0 | 488 if (realcount > loops[nr]->buflength) { |
| 489 realcount = loops[nr]->buflength; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
490 info("Too much data for Video loopback %d ! Only %ld bytes used.", |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
491 nr, realcount); |
| 0 | 492 } |
| 493 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
494 if (copy_from_user(loops[nr]->buffer + loops[nr]->frame * loops[nr]->buflength, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
495 buf, realcount)) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
496 return -EFAULT; |
| 0 | 497 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
498 loops[nr]->frame = 0; |
| 0 | 499 up(&loops[nr]->lock); |
| 500 | |
| 501 loops[nr]->frameswrite++; | |
| 502 wake_up(&loops[nr]->wait); | |
| 503 | |
| 504 return realcount; | |
| 505 } | |
| 506 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
507 static ssize_t vloopback_read(struct file * f, char * buf, size_t count, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
508 loff_t *offset) |
| 0 | 509 { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
510 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
511 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
512 int nr = ptr->pipenr; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
513 unsigned long realcount = count; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
514 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
515 if (debug > LOG_IOCTL) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
516 info("Video loopback %d", nr); |
| 0 | 517 |
| 518 if (loops[nr]->zerocopy) { | |
| 519 if (ptr->in) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
520 if (realcount > loops[nr]->ioctllength + sizeof(unsigned long int)) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
521 realcount = loops[nr]->ioctllength + sizeof(unsigned long int); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
522 |
| 0 | 523 if (copy_to_user(buf , &loops[nr]->ioctlnr, sizeof(unsigned long int))) |
| 524 return -EFAULT; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
525 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
526 if (copy_to_user(buf + sizeof(unsigned long int), loops[nr]->ioctldata, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
527 realcount - sizeof(unsigned long int))) |
| 0 | 528 return -EFAULT; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
529 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
530 if (loops[nr]->ioctlnr == 0) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
531 loops[nr]->ioctlnr = -1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
532 |
| 0 | 533 return realcount; |
| 534 } else { | |
| 535 struct video_window vidwin; | |
| 536 struct video_mmap vidmmap; | |
| 537 struct video_picture vidpic; | |
| 538 | |
| 539 fake_ioctl(nr, VIDIOCGWIN, &vidwin); | |
| 540 fake_ioctl(nr, VIDIOCGPICT, &vidpic); | |
| 541 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
542 vidmmap.height = vidwin.height; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
543 vidmmap.width = vidwin.width; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
544 vidmmap.format = vidpic.palette; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
545 vidmmap.frame = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
546 |
| 0 | 547 if (fake_ioctl(nr, VIDIOCMCAPTURE, &vidmmap)) |
| 548 return 0; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
549 |
| 0 | 550 if (fake_ioctl(nr, VIDIOCSYNC, &vidmmap)) |
| 551 return 0; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
552 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
553 realcount = vidwin.height * vidwin.width * vidpic.depth; |
| 0 | 554 } |
| 555 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
556 |
| 0 | 557 if (ptr->in) |
| 558 return -EINVAL; | |
| 559 | |
| 560 if (realcount > loops[nr]->buflength) { | |
| 561 realcount = loops[nr]->buflength; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
562 info("Not so much data in buffer! for Video loopback %d", nr); |
| 0 | 563 } |
| 564 | |
| 565 if (!loops[nr]->zerocopy) { | |
| 566 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
567 unsigned long fw = loops[nr]->frameswrite; |
| 0 | 568 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
569 wait_event_interruptible(loops[nr]->wait, fw != loops[nr]->frameswrite); |
| 0 | 570 #else |
| 571 interruptible_sleep_on(&loops[nr]->wait); | |
| 572 #endif | |
| 573 } | |
| 574 | |
| 575 down(&loops[nr]->lock); | |
| 576 if (!loops[nr]->buffer) { | |
| 577 up(&loops[nr]->lock); | |
| 578 return 0; | |
| 579 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
580 |
| 0 | 581 if (copy_to_user(buf, loops[nr]->buffer, realcount)) |
| 582 return -EFAULT; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
583 |
| 0 | 584 up(&loops[nr]->lock); |
| 585 | |
| 586 loops[nr]->framesread++; | |
| 587 return realcount; | |
| 588 } | |
| 589 | |
| 590 static int vloopback_mmap(struct file *f, struct vm_area_struct *vma) | |
| 591 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
592 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
593 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
594 int nr = ptr->pipenr; |
| 0 | 595 unsigned long start = (unsigned long)vma->vm_start; |
| 596 long size = vma->vm_end - vma->vm_start; | |
| 597 unsigned long page, pos; | |
| 598 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
599 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
600 info("Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
601 |
| 0 | 602 down(&loops[nr]->lock); |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
603 |
| 0 | 604 if (ptr->in) { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
605 loops[nr]->zerocopy = 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
606 |
| 0 | 607 if (loops[nr]->ropen) { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
608 info("Can't change size while opened for read in Video loopback %d", |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
609 nr); |
| 0 | 610 up(&loops[nr]->lock); |
| 611 return -EINVAL; | |
| 612 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
613 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
614 if (!size) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
615 up(&loops[nr]->lock); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
616 info("Invalid size Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
617 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
618 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
619 |
| 0 | 620 if (loops[nr]->buffer) |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
621 rvfree(loops[nr]->buffer, loops[nr]->buflength * N_BUFFS); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
622 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
623 loops[nr]->buflength = size; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
624 loops[nr]->buffer = rvmalloc(loops[nr]->buflength * N_BUFFS); |
| 0 | 625 } |
| 626 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
627 if (loops[nr]->buffer == NULL) { |
| 0 | 628 up(&loops[nr]->lock); |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
629 return -EINVAL; |
| 0 | 630 } |
| 631 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
632 if (size > (((N_BUFFS * loops[nr]->buflength) + PAGE_SIZE - 1) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
633 & ~(PAGE_SIZE - 1))) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
634 up(&loops[nr]->lock); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
635 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
636 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
637 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
638 pos = (unsigned long)loops[nr]->buffer; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
639 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
640 while (size > 0) { |
| 0 | 641 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9) |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
642 page = kvirt_to_pa(pos); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
643 if (remap_page_range(vma,start, page, PAGE_SIZE, PAGE_SHARED)) { |
| 0 | 644 #else |
| 645 page = vmalloc_to_pfn((void *)pos); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
646 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) { |
| 0 | 647 #endif |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
648 up(&loops[nr]->lock); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
649 return -EAGAIN; |
| 0 | 650 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
651 start += PAGE_SIZE; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
652 pos += PAGE_SIZE; |
| 0 | 653 size -= PAGE_SIZE; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
654 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
655 |
| 0 | 656 up(&loops[nr]->lock); |
| 657 | |
| 658 return 0; | |
| 659 } | |
| 660 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
661 static int vloopback_ioctl(struct inode *inod, struct file *f, unsigned int cmd, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
662 unsigned long arg) |
| 0 | 663 { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
664 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
665 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
666 int nr = ptr->pipenr; |
| 0 | 667 int i; |
| 668 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
669 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
670 info("Video loopback %d cmd %u", nr, cmd); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
671 |
| 0 | 672 if (loops[nr]->zerocopy) { |
| 673 if (!ptr->in) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
674 loops[nr]->ioctlnr = cmd; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
675 loops[nr]->ioctllength = _IOC_SIZE(cmd); |
| 0 | 676 /* info("DEBUG: vl_ioctl: !loop->in"); */ |
| 677 /* info("DEBUG: vl_ioctl: cmd %lu", cmd); */ | |
| 678 /* info("DEBUG: vl_ioctl: len %lu", loops[nr]->ioctllength); */ | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
679 if (copy_from_user(loops[nr]->ioctldata, (void*)arg, _IOC_SIZE(cmd))) |
| 0 | 680 return -EFAULT; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
681 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
682 kill_proc(loops[nr]->pid, SIGIO, 1); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
683 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
684 kill_pid(loops[nr]->pid, SIGIO, 1); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
685 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
686 |
| 0 | 687 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
688 wait_event_interruptible(loops[nr]->wait, loops[nr]->ioctlnr == -1); |
| 0 | 689 #else |
| 690 interruptible_sleep_on(&loops[nr]->wait); | |
| 691 #endif | |
| 692 | |
| 693 if (loops[nr]->invalid_ioctl) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
694 info ("There was an invalid ioctl in Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
695 loops[nr]->invalid_ioctl = 0; |
| 0 | 696 return -ENOTTY; |
| 697 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
698 |
| 0 | 699 if (cmd & IOC_IN && !(cmd & IOC_OUT)) { |
| 700 //info("DEBUG: vl_ioctl: cmd & IOC_IN 1"); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
701 if (memcmp(loops[nr]->ioctlretdata, loops[nr]->ioctldata, _IOC_SIZE(cmd))) |
| 0 | 702 return -EINVAL; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
703 |
| 0 | 704 //info("DEBUG: vl_ioctl: cmd & IOC_IN 2"); |
| 705 return 0; | |
| 706 } else { | |
| 707 if (copy_to_user((void*)arg, loops[nr]->ioctlretdata, _IOC_SIZE(cmd))) | |
| 708 return -EFAULT; | |
| 709 //info("DEBUG: vl_ioctl: !(cmd & IOC_IN) 1"); | |
| 710 return 0; | |
| 711 } | |
| 712 } else { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
713 if ((loops[nr]->ioctlnr != cmd) && (cmd != (VIDIOCSINVALID))) { |
| 0 | 714 /* wrong ioctl */ |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
715 info("Wrong IOCTL %u in Video loopback %d", cmd, nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
716 return 0; |
| 0 | 717 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
718 |
| 0 | 719 if (cmd == VIDIOCSINVALID) { |
| 720 loops[nr]->invalid_ioctl = 1; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
721 } else if (copy_from_user(loops[nr]->ioctlretdata, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
722 (void*)arg, loops[nr]->ioctllength)) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
723 return -EFAULT; |
| 0 | 724 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
725 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
726 loops[nr]->ioctlnr = -1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
727 |
| 0 | 728 if (waitqueue_active(&loops[nr]->wait)) |
| 729 wake_up(&loops[nr]->wait); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
730 |
| 0 | 731 return 0; |
| 732 } | |
| 733 } | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
734 |
| 0 | 735 switch(cmd) |
| 736 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
737 /* Get capabilities */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
738 case VIDIOCGCAP: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
739 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
740 struct video_capability b; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
741 if (ptr->in) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
742 sprintf(b.name, "Video loopback %d input", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
743 b.type = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
744 } else { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
745 sprintf(b.name, "Video loopback %d output", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
746 b.type = VID_TYPE_CAPTURE; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
747 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
748 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
749 b.channels = 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
750 b.audios = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
751 b.maxwidth = loops[nr]->width; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
752 b.maxheight = loops[nr]->height; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
753 b.minwidth = 20; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
754 b.minheight = 20; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
755 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
756 if (copy_to_user((void*)arg, &b, sizeof(b))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
757 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
758 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
759 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
760 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
761 /* Get channel info (sources) */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
762 case VIDIOCGCHAN: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
763 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
764 struct video_channel v; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
765 if (copy_from_user(&v, (void*)arg, sizeof(v))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
766 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
767 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
768 if (v.channel != 0) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
769 info("VIDIOCGCHAN: Invalid Channel, was %d", v.channel); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
770 v.channel = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
771 //return -EINVAL; |
| 0 | 772 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
773 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
774 v.flags = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
775 v.tuners = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
776 v.norm = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
777 v.type = VIDEO_TYPE_CAMERA; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
778 /*strcpy(v.name, "Loopback"); -- tibit */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
779 strcpy(v.name, "Composite1"); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
780 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
781 if (copy_to_user((void*)arg, &v, sizeof(v))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
782 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
783 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
784 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
785 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
786 /* Set channel */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
787 case VIDIOCSCHAN: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
788 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
789 int v; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
790 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
791 if (copy_from_user(&v, (void*)arg, sizeof(v))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
792 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
793 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
794 if (v != 0) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
795 info("VIDIOCSCHAN: Invalid Channel, was %d", v); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
796 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
797 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
798 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
799 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
800 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
801 /* Get tuner abilities */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
802 case VIDIOCGTUNER: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
803 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
804 struct video_tuner v; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
805 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
806 if (copy_from_user(&v, (void*)arg, sizeof(v)) != 0) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
807 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
808 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
809 if (v.tuner) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
810 info("VIDIOCGTUNER: Invalid Tuner, was %d", v.tuner); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
811 return -EINVAL; |
| 0 | 812 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
813 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
814 strcpy(v.name, "Format"); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
815 v.rangelow = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
816 v.rangehigh = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
817 v.flags = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
818 v.mode = VIDEO_MODE_AUTO; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
819 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
820 if (copy_to_user((void*)arg,&v, sizeof(v)) != 0) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
821 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
822 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
823 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
824 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
825 /* Get picture properties */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
826 case VIDIOCGPICT: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
827 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
828 struct video_picture p; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
829 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
830 p.colour = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
831 p.hue = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
832 p.brightness = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
833 p.contrast = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
834 p.whiteness = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
835 p.depth = 0x8000; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
836 p.palette = loops[nr]->palette; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
837 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
838 if (copy_to_user((void*)arg, &p, sizeof(p))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
839 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
840 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
841 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
842 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
843 /* Set picture properties */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
844 case VIDIOCSPICT: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
845 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
846 struct video_picture p; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
847 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
848 if (copy_from_user(&p, (void*)arg, sizeof(p))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
849 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
850 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
851 if (!ptr->in) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
852 if (p.palette != loops[nr]->palette) |
| 0 | 853 return -EINVAL; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
854 } else { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
855 loops[nr]->palette = p.palette; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
856 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
857 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
858 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
859 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
860 /* Get the video overlay window */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
861 case VIDIOCGWIN: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
862 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
863 struct video_window vw; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
864 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
865 vw.x = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
866 vw.y = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
867 vw.width = loops[nr]->width; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
868 vw.height = loops[nr]->height; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
869 vw.chromakey = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
870 vw.flags = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
871 vw.clipcount = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
872 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
873 if (copy_to_user((void*)arg, &vw, sizeof(vw))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
874 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
875 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
876 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
877 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
878 /* Set the video overlay window - passes clip list for hardware smarts , chromakey etc */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
879 case VIDIOCSWIN: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
880 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
881 struct video_window vw; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
882 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
883 if (copy_from_user(&vw, (void*)arg, sizeof(vw))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
884 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
885 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
886 if (vw.flags) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
887 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
888 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
889 if (vw.clipcount) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
890 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
891 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
892 if (loops[nr]->height == vw.height && |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
893 loops[nr]->width == vw.width) |
| 0 | 894 return 0; |
| 895 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
896 if (!ptr->in) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
897 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
898 } else { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
899 loops[nr]->height = vw.height; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
900 loops[nr]->width = vw.width; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
901 /* Make sure nobody is using the buffer while we |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
902 fool around with it. |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
903 We are also not allowing changes while |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
904 somebody using mmap has the output open. |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
905 */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
906 down(&loops[nr]->lock); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
907 if (loops[nr]->ropen) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
908 info("Can't change size while opened for read"); |
| 0 | 909 up(&loops[nr]->lock); |
| 910 return -EINVAL; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
911 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
912 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
913 if (loops[nr]->buffer) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
914 rvfree(loops[nr]->buffer, loops[nr]->buflength * N_BUFFS); |
| 0 | 915 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
916 loops[nr]->buflength = vw.width * vw.height * 4; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
917 loops[nr]->buffer = rvmalloc(loops[nr]->buflength * N_BUFFS); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
918 up(&loops[nr]->lock); |
| 0 | 919 } |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
920 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
921 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
922 /* Memory map buffer info */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
923 case VIDIOCGMBUF: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
924 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
925 struct video_mbuf vm; |
| 0 | 926 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
927 vm.size = loops[nr]->buflength * N_BUFFS; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
928 vm.frames = N_BUFFS; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
929 for (i = 0; i < vm.frames; i++) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
930 vm.offsets[i] = i * loops[nr]->buflength; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
931 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
932 if (copy_to_user((void*)arg, &vm, sizeof(vm))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
933 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
934 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
935 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
936 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
937 /* Grab frames */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
938 case VIDIOCMCAPTURE: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
939 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
940 struct video_mmap vm; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
941 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
942 if (ptr->in) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
943 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
944 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
945 if (!loops[nr]->buffer) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
946 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
947 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
948 if (copy_from_user(&vm, (void*)arg, sizeof(vm))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
949 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
950 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
951 if (vm.format != loops[nr]->palette) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
952 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
953 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
954 if (vm.frame > N_BUFFS) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
955 return -EINVAL; |
| 0 | 956 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
957 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
958 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
959 /* Sync with mmap grabbing */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
960 case VIDIOCSYNC: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
961 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
962 int frame; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
963 unsigned long fw; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
964 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
965 if (copy_from_user((void *)&frame, (void*)arg, sizeof(int))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
966 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
967 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
968 if (ptr->in) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
969 return -EINVAL; |
| 0 | 970 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
971 if (!loops[nr]->buffer) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
972 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
973 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
974 /* Ok, everything should be alright since the program |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
975 should have called VIDIOMCAPTURE and we are ready to |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
976 do the 'capturing' */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
977 if (frame > 1) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
978 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
979 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
980 loops[nr]->frame = frame; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
981 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
982 fw = loops[nr]->frameswrite; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
983 wait_event_interruptible(loops[nr]->wait, fw != loops[nr]->frameswrite); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
984 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
985 interruptible_sleep_on(&loops[nr]->wait); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
986 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
987 if (!loops[nr]->buffer) /* possibly released during sleep */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
988 return -EINVAL; |
| 0 | 989 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
990 loops[nr]->framesread++; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
991 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
992 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
993 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
994 /* Get attached units */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
995 case VIDIOCGUNIT: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
996 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
997 struct video_unit vu; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
998 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
999 if (ptr->in) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1000 vu.video = loops[nr]->vloopout->minor; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1001 else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1002 vu.video = loops[nr]->vloopin->minor; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1003 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1004 vu.vbi = VIDEO_NO_UNIT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1005 vu.radio = VIDEO_NO_UNIT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1006 vu.audio = VIDEO_NO_UNIT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1007 vu.teletext = VIDEO_NO_UNIT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1008 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1009 if (copy_to_user((void*)arg, &vu, sizeof(vu))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1010 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1011 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1012 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1013 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1014 /* Get frame buffer */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1015 case VIDIOCGFBUF: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1016 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1017 struct video_buffer vb; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1018 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1019 memset(&vb, 0, sizeof(vb)); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1020 vb.base = NULL; |
| 0 | 1021 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1022 if (copy_to_user((void *)arg, (void *)&vb, sizeof(vb))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1023 return -EFAULT; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1024 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1025 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1026 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1027 /* Start, end capture */ |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1028 case VIDIOCCAPTURE: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1029 { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1030 int start; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1031 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1032 if (copy_from_user(&start, (void*)arg, sizeof(int))) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1033 return -EFAULT; |
| 0 | 1034 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1035 if (start) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1036 info ("Video loopback %d Capture started", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1037 } else { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1038 info ("Video loopback %d Capture stopped", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1039 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1040 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1041 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1042 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1043 case VIDIOCGFREQ: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1044 case VIDIOCSFREQ: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1045 case VIDIOCGAUDIO: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1046 case VIDIOCSAUDIO: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1047 return -EINVAL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1048 case VIDIOCKEY: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1049 return 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1050 default: |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1051 return -ENOTTY; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1052 //return -ENOIOCTLCMD; |
| 0 | 1053 } |
| 1054 return 0; | |
| 1055 } | |
| 1056 | |
| 1057 static unsigned int vloopback_poll(struct file *f, struct poll_table_struct *wait) | |
| 1058 { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1059 struct video_device *loopdev = video_devdata(f); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1060 priv_ptr ptr = (priv_ptr)loopdev->priv; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1061 int nr = ptr->pipenr; |
| 0 | 1062 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1063 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1064 info("Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1065 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1066 if (loopdev == NULL) |
| 0 | 1067 return -EFAULT; |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1068 |
| 0 | 1069 if (!ptr->in) |
| 1070 return 0; | |
| 1071 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1072 if (loops[nr]->ioctlnr != -1) { |
| 0 | 1073 if (loops[nr]->zerocopy) { |
| 1074 return (POLLIN | POLLPRI | POLLOUT | POLLRDNORM); | |
| 1075 } else { | |
| 1076 return (POLLOUT); | |
| 1077 } | |
| 1078 } | |
| 1079 return 0; | |
| 1080 } | |
| 1081 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1082 static struct file_operations fileops_template = |
| 0 | 1083 { |
| 1084 owner: THIS_MODULE, | |
| 1085 open: vloopback_open, | |
| 1086 release: vloopback_release, | |
| 1087 read: vloopback_read, | |
| 1088 write: vloopback_write, | |
| 1089 poll: vloopback_poll, | |
| 1090 ioctl: vloopback_ioctl, | |
| 1091 mmap: vloopback_mmap, | |
| 1092 }; | |
| 1093 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1094 static struct video_device vloopback_template = |
| 0 | 1095 { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1096 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1097 owner: THIS_MODULE, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1098 type: VID_TYPE_CAPTURE, |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1099 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1100 minor: -1, |
| 0 | 1101 name: "Video Loopback", |
| 1102 fops: &fileops_template, | |
| 1103 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 1104 release: video_device_release, | |
| 1105 #endif | |
| 1106 }; | |
| 1107 | |
| 1108 static int create_pipe(int nr) | |
| 1109 { | |
| 1110 int minor_in, minor_out , ret; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1111 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1112 if (debug > LOG_NODEBUG) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1113 info("Video loopback %d", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1114 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1115 if (dev_offset == -1) { |
| 0 | 1116 minor_in = minor_out = -1; /* autoassign */ |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1117 } else { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1118 minor_in = 2 * nr + dev_offset; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1119 minor_out = 2 * nr + 1 + dev_offset; |
| 0 | 1120 } |
| 1121 | |
| 1122 /* allocate space for this pipe */ | |
| 1123 loops[nr]= kmalloc(sizeof(struct vloopback_pipe), GFP_KERNEL); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1124 |
| 0 | 1125 if (!loops[nr]) |
| 1126 return -ENOMEM; | |
| 1127 /* set up a new video device plus our private area */ | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1128 loops[nr]->vloopin = video_device_alloc(); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1129 |
| 0 | 1130 if (loops[nr]->vloopin == NULL) |
| 1131 return -ENOMEM; | |
| 1132 *loops[nr]->vloopin = vloopback_template; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1133 loops[nr]->vloopin->priv = kmalloc(sizeof(struct vloopback_private), |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1134 GFP_KERNEL); |
| 0 | 1135 if (loops[nr]->vloopin->priv == NULL) { |
| 1136 kfree(loops[nr]->vloopin); | |
| 1137 return -ENOMEM; | |
| 1138 } | |
| 1139 /* repeat for the output device */ | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1140 loops[nr]->vloopout = video_device_alloc(); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1141 |
| 0 | 1142 if (loops[nr]->vloopout == NULL) { |
| 1143 kfree(loops[nr]->vloopin->priv); | |
| 1144 kfree(loops[nr]->vloopin); | |
| 1145 return -ENOMEM; | |
| 1146 } | |
| 1147 *loops[nr]->vloopout = vloopback_template; | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1148 loops[nr]->vloopout->priv = kmalloc(sizeof(struct vloopback_private), |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1149 GFP_KERNEL); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1150 |
| 0 | 1151 if (loops[nr]->vloopout->priv == NULL) { |
| 1152 kfree(loops[nr]->vloopin->priv); | |
| 1153 kfree(loops[nr]->vloopin); | |
| 1154 kfree(loops[nr]->vloopout); | |
| 1155 return -ENOMEM; | |
| 1156 } | |
| 1157 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1158 ((priv_ptr)loops[nr]->vloopin->priv)->pipenr = nr; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1159 ((priv_ptr)loops[nr]->vloopout->priv)->pipenr = nr; |
| 0 | 1160 loops[nr]->invalid_ioctl = 0; /* tibit */ |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1161 loops[nr]->buffer = NULL; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1162 loops[nr]->width = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1163 loops[nr]->height = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1164 loops[nr]->palette = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1165 loops[nr]->frameswrite = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1166 loops[nr]->framesread = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1167 loops[nr]->framesdumped = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1168 loops[nr]->wopen = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1169 loops[nr]->ropen = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1170 loops[nr]->frame = 0; |
| 0 | 1171 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1172 ((priv_ptr)loops[nr]->vloopin->priv)->in = 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1173 ((priv_ptr)loops[nr]->vloopout->priv)->in = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1174 sprintf(loops[nr]->vloopin->name, "Video loopback %d input", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1175 sprintf(loops[nr]->vloopout->name, "Video loopback %d output", nr); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1176 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1177 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1178 loops[nr]->vloopin->type = 0; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1179 loops[nr]->vloopout->type = VID_TYPE_CAPTURE; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1180 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1181 loops[nr]->vloopout->minor = minor_out; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1182 loops[nr]->vloopin->minor = minor_in; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1183 |
| 0 | 1184 init_waitqueue_head(&loops[nr]->wait); |
| 1185 init_MUTEX(&loops[nr]->lock); | |
| 1186 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1187 ret = video_register_device(loops[nr]->vloopin, VFL_TYPE_GRABBER, minor_in); |
| 0 | 1188 |
| 1189 if ((ret == -1 ) || ( ret == -23 )) { | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1190 info("error registering device %s", loops[nr]->vloopin->name); |
| 0 | 1191 kfree(loops[nr]->vloopin->priv); |
| 1192 kfree(loops[nr]->vloopin); | |
| 1193 kfree(loops[nr]->vloopout->priv); | |
| 1194 kfree(loops[nr]->vloopout); | |
| 1195 kfree(loops[nr]); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1196 loops[nr] = NULL; |
| 0 | 1197 return ret; |
| 1198 } | |
| 1199 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1200 ret = video_register_device(loops[nr]->vloopout, VFL_TYPE_GRABBER, minor_out); |
| 0 | 1201 |
| 1202 if ((ret ==-1) || (ret == -23)) { | |
| 1203 info("error registering device %s", loops[nr]->vloopout->name); | |
| 1204 kfree(loops[nr]->vloopin->priv); | |
| 1205 video_unregister_device(loops[nr]->vloopin); | |
| 1206 kfree(loops[nr]->vloopout->priv); | |
| 1207 kfree(loops[nr]->vloopout); | |
| 1208 kfree(loops[nr]); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1209 loops[nr] = NULL; |
| 0 | 1210 return ret; |
| 1211 } | |
| 1212 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1213 loops[nr]->ioctldata = kmalloc(1024, GFP_KERNEL); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1214 loops[nr]->ioctlretdata = kmalloc(1024, GFP_KERNEL); |
| 0 | 1215 return 0; |
| 1216 } | |
| 1217 | |
| 1218 | |
| 1219 /**************************************************************************** | |
| 1220 * init stuff | |
| 1221 ****************************************************************************/ | |
| 1222 | |
| 1223 | |
| 1224 MODULE_AUTHOR("J.B. Vreeken (pe1rxq@amsat.org)"); | |
| 1225 MODULE_DESCRIPTION("Video4linux loopback device."); | |
| 1226 | |
| 1227 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 1228 module_param(pipes, int, 000); | |
| 1229 #else | |
| 1230 MODULE_PARM(pipes, "i"); | |
| 1231 #endif | |
| 1232 | |
| 1233 MODULE_PARM_DESC(pipes, "Nr of pipes to create (each pipe uses two video devices)"); | |
| 1234 | |
| 1235 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 1236 module_param(spares, int, 000); | |
| 1237 #else | |
| 1238 MODULE_PARM(spares, "i"); | |
| 1239 #endif | |
| 1240 | |
| 1241 MODULE_PARM_DESC(spares, "Nr of spare pipes that should be created"); | |
| 1242 | |
| 1243 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) | |
| 1244 module_param(dev_offset, int, 000); | |
| 1245 #else | |
| 1246 MODULE_PARM(dev_offset_param, "i"); | |
| 1247 #endif | |
| 1248 | |
| 1249 MODULE_PARM_DESC(dev_offset, "Prefered offset for video device numbers"); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1250 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1251 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1252 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1253 module_param(debug, int, 000); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1254 #else |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1255 MODULE_PARM(debug_param, "i"); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1256 #endif |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1257 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1258 MODULE_PARM_DESC(debug, "Enable module debug level 0-3 (by default 0)"); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1259 |
| 0 | 1260 MODULE_LICENSE("GPL"); |
| 1261 MODULE_VERSION( VLOOPBACK_VERSION ); | |
| 1262 | |
| 1263 static int __init vloopback_init(void) | |
| 1264 { | |
| 1265 int i,ret; | |
| 1266 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1267 info("video4linux loopback driver v"VLOOPBACK_VERSION); |
| 0 | 1268 |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1269 if (pipes == -1) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1270 pipes = 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1271 |
| 0 | 1272 if (pipes > MAX_PIPES) { |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1273 pipes = MAX_PIPES; |
| 0 | 1274 info("Nr of pipes is limited to: %d", MAX_PIPES); |
| 1275 } | |
| 1276 | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1277 for (i = 0; i < pipes; i++) { |
| 0 | 1278 |
| 1279 ret = create_pipe(i); | |
| 1280 | |
| 1281 if (ret == 0) { | |
| 1282 info("Loopback %d registered, input: video%d," | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1283 " output: video%d", |
| 0 | 1284 i, loops[i]->vloopin->minor, |
| 1285 loops[i]->vloopout->minor); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1286 nr_o_pipes = i + 1; |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1287 } else { |
| 0 | 1288 return ret; |
| 1289 } | |
| 1290 } | |
| 1291 return 0; | |
| 1292 } | |
| 1293 | |
| 1294 static void __exit cleanup_vloopback_module(void) | |
| 1295 { | |
| 1296 int i; | |
| 1297 | |
| 1298 info("Unregistering video4linux loopback devices"); | |
|
7
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1299 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1300 for (i = 0; i < nr_o_pipes; i++) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1301 if (loops[i]) { |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1302 kfree(loops[i]->vloopin->priv); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1303 video_unregister_device(loops[i]->vloopin); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1304 kfree(loops[i]->vloopout->priv); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1305 video_unregister_device(loops[i]->vloopout); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1306 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1307 if (loops[i]->buffer) |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1308 rvfree(loops[i]->buffer, loops[i]->buflength * N_BUFFS); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1309 |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1310 kfree(loops[i]->ioctldata); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1311 kfree(loops[i]->ioctlretdata); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1312 kfree(loops[i]); |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1313 } |
|
2fce9e157b8d
Added some work around to work with kernel 2.6.27-rc3, added debug param.
AngelCarpintero
parents:
4
diff
changeset
|
1314 } |
| 0 | 1315 } |
| 1316 | |
| 1317 module_init(vloopback_init); | |
| 1318 module_exit(cleanup_vloopback_module); |
