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