comparison vloopback.c @ 11:b904131a3807

Allow to build with kernel 2.6.27.git and 2.6.28-rc9
author AngelCarpintero
date Mon, 22 Dec 2008 04:32:52 +0000
parents bce647a9dd4b
children 647e63ddab46
comparison
equal deleted inserted replaced
10:bce647a9dd4b 11:b904131a3807
144 * 144 *
145 * 24.08.08 (Angel Carpintero) 145 * 24.08.08 (Angel Carpintero)
146 * Added compat_iotcl32 init in fopsl, replace tabs by 4 spaces in source code, 146 * Added compat_iotcl32 init in fopsl, replace tabs by 4 spaces in source code,
147 * add number of buffers as module param. 147 * add number of buffers as module param.
148 * 148 *
149 * 13.10.09 (Stephan Berberig & Angel Carpintero) 149 * 13.10.08 (Stephan Berberig & Angel Carpintero)
150 * Release to work on 2.6.27 , allow v4l_compat_ioctl32 work in 2.6.27 and a little cleanup 150 * Release to work on 2.6.27 , allow v4l_compat_ioctl32 work in 2.6.27 and a little cleanup
151 * in Makefile. 151 * in Makefile.
152 *
153 * 22.12.08 (Angel Carpintero)
154 * Allow build with kernel 2.6.28 and 2.6.27.git ( struct video_dev has not priv member anymore).
152 */ 155 */
153 156
154 157
155 #define VLOOPBACK_VERSION "1.2-trunk" 158 #define VLOOPBACK_VERSION "1.2-trunk"
156 159
166 #endif 169 #endif
167 170
168 /* v4l_compat_ioctl32 */ 171 /* v4l_compat_ioctl32 */
169 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) 172 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
170 #include <media/v4l2-ioctl.h> 173 #include <media/v4l2-ioctl.h>
174 #endif
175
176 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)
177 #define vd_private_data dev.driver_data
178 #else
179 #define vd_private_data priv
171 #endif 180 #endif
172 181
173 #include <linux/videodev.h> 182 #include <linux/videodev.h>
174 #include <linux/vmalloc.h> 183 #include <linux/vmalloc.h>
175 #include <linux/wait.h> 184 #include <linux/wait.h>
220 229
221 typedef struct vloopback_private *priv_ptr; 230 typedef struct vloopback_private *priv_ptr;
222 231
223 struct vloopback_pipe { 232 struct vloopback_pipe {
224 struct video_device *vloopin; 233 struct video_device *vloopin;
225 struct video_device *vloopout; 234 struct video_device *vloopout;
226 char *buffer; 235 char *buffer;
227 unsigned long buflength; 236 unsigned long buflength;
228 unsigned int width, height; 237 unsigned int width, height;
229 unsigned int palette; 238 unsigned int palette;
230 unsigned long frameswrite; 239 unsigned long frameswrite;
368 } 377 }
369 378
370 static int vloopback_open(struct inode *inod, struct file *f) 379 static int vloopback_open(struct inode *inod, struct file *f)
371 { 380 {
372 struct video_device *loopdev = video_devdata(f); 381 struct video_device *loopdev = video_devdata(f);
373 priv_ptr ptr = (priv_ptr)loopdev->priv; 382 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
383 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
374 int nr = ptr->pipenr; 384 int nr = ptr->pipenr;
375 385
376 if (debug > LOG_NODEBUG) 386 if (debug > LOG_NODEBUG)
377 info("Video loopback %d", nr); 387 info("Video loopback %d", nr);
378 388
421 } 431 }
422 432
423 static int vloopback_release(struct inode * inod, struct file *f) 433 static int vloopback_release(struct inode * inod, struct file *f)
424 { 434 {
425 struct video_device *loopdev = video_devdata(f); 435 struct video_device *loopdev = video_devdata(f);
426 priv_ptr ptr = (priv_ptr)loopdev->priv; 436 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
437 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
427 int nr = ptr->pipenr; 438 int nr = ptr->pipenr;
428 439
429 if (debug > LOG_NODEBUG) 440 if (debug > LOG_NODEBUG)
430 info("Video loopback %d", nr); 441 info("Video loopback %d", nr);
431 442
474 485
475 static ssize_t vloopback_write(struct file *f, const char *buf, 486 static ssize_t vloopback_write(struct file *f, const char *buf,
476 size_t count, loff_t *offset) 487 size_t count, loff_t *offset)
477 { 488 {
478 struct video_device *loopdev = video_devdata(f); 489 struct video_device *loopdev = video_devdata(f);
479 priv_ptr ptr = (priv_ptr)loopdev->priv; 490 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
491 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
480 int nr = ptr->pipenr; 492 int nr = ptr->pipenr;
481 unsigned long realcount = count; 493 unsigned long realcount = count;
482 494
483 if (debug > LOG_IOCTL) 495 if (debug > LOG_IOCTL)
484 info("Video loopback %d", nr); 496 info("Video loopback %d", nr);
525 537
526 static ssize_t vloopback_read(struct file * f, char * buf, size_t count, 538 static ssize_t vloopback_read(struct file * f, char * buf, size_t count,
527 loff_t *offset) 539 loff_t *offset)
528 { 540 {
529 struct video_device *loopdev = video_devdata(f); 541 struct video_device *loopdev = video_devdata(f);
530 priv_ptr ptr = (priv_ptr)loopdev->priv; 542 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
543 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
531 int nr = ptr->pipenr; 544 int nr = ptr->pipenr;
532 unsigned long realcount = count; 545 unsigned long realcount = count;
533 546
534 if (debug > LOG_IOCTL) 547 if (debug > LOG_IOCTL)
535 info("Video loopback %d", nr); 548 info("Video loopback %d", nr);
607 } 620 }
608 621
609 static int vloopback_mmap(struct file *f, struct vm_area_struct *vma) 622 static int vloopback_mmap(struct file *f, struct vm_area_struct *vma)
610 { 623 {
611 struct video_device *loopdev = video_devdata(f); 624 struct video_device *loopdev = video_devdata(f);
612 priv_ptr ptr = (priv_ptr)loopdev->priv; 625 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
626 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
613 int nr = ptr->pipenr; 627 int nr = ptr->pipenr;
614 unsigned long start = (unsigned long)vma->vm_start; 628 unsigned long start = (unsigned long)vma->vm_start;
615 long size = vma->vm_end - vma->vm_start; 629 long size = vma->vm_end - vma->vm_start;
616 unsigned long page, pos; 630 unsigned long page, pos;
617 631
679 693
680 static int vloopback_ioctl(struct inode *inod, struct file *f, unsigned int cmd, 694 static int vloopback_ioctl(struct inode *inod, struct file *f, unsigned int cmd,
681 unsigned long arg) 695 unsigned long arg)
682 { 696 {
683 struct video_device *loopdev = video_devdata(f); 697 struct video_device *loopdev = video_devdata(f);
684 priv_ptr ptr = (priv_ptr)loopdev->priv; 698 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
699 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
685 int nr = ptr->pipenr; 700 int nr = ptr->pipenr;
686 int i; 701 int i;
687 702
688 if (debug > LOG_NODEBUG) 703 if (debug > LOG_NODEBUG)
689 info("Video loopback %d cmd %u", nr, cmd); 704 info("Video loopback %d cmd %u", nr, cmd);
1075 } 1090 }
1076 1091
1077 static unsigned int vloopback_poll(struct file *f, struct poll_table_struct *wait) 1092 static unsigned int vloopback_poll(struct file *f, struct poll_table_struct *wait)
1078 { 1093 {
1079 struct video_device *loopdev = video_devdata(f); 1094 struct video_device *loopdev = video_devdata(f);
1080 priv_ptr ptr = (priv_ptr)loopdev->priv; 1095 priv_ptr ptr = (priv_ptr)loopdev->vd_private_data;
1096 //priv_ptr ptr = (priv_ptr)video_get_drvdata(loopdev);
1081 int nr = ptr->pipenr; 1097 int nr = ptr->pipenr;
1082 1098
1083 if (debug > LOG_NODEBUG) 1099 if (debug > LOG_NODEBUG)
1084 info("Video loopback %d", nr); 1100 info("Video loopback %d", nr);
1085 1101
1151 loops[nr]->vloopin = video_device_alloc(); 1167 loops[nr]->vloopin = video_device_alloc();
1152 1168
1153 if (loops[nr]->vloopin == NULL) 1169 if (loops[nr]->vloopin == NULL)
1154 return -ENOMEM; 1170 return -ENOMEM;
1155 *loops[nr]->vloopin = vloopback_template; 1171 *loops[nr]->vloopin = vloopback_template;
1156 loops[nr]->vloopin->priv = kmalloc(sizeof(struct vloopback_private), 1172
1157 GFP_KERNEL); 1173 loops[nr]->vloopin->vd_private_data = kmalloc(sizeof(struct vloopback_private),
1158 if (loops[nr]->vloopin->priv == NULL) { 1174 GFP_KERNEL);
1175
1176 if (loops[nr]->vloopin->vd_private_data == NULL) {
1159 kfree(loops[nr]->vloopin); 1177 kfree(loops[nr]->vloopin);
1160 return -ENOMEM; 1178 return -ENOMEM;
1161 } 1179 }
1162 /* repeat for the output device */ 1180 /* repeat for the output device */
1163 loops[nr]->vloopout = video_device_alloc(); 1181 loops[nr]->vloopout = video_device_alloc();
1164 1182
1165 if (loops[nr]->vloopout == NULL) { 1183 if (loops[nr]->vloopout == NULL) {
1166 kfree(loops[nr]->vloopin->priv); 1184 kfree(loops[nr]->vloopin->vd_private_data);
1167 kfree(loops[nr]->vloopin); 1185 kfree(loops[nr]->vloopin);
1168 return -ENOMEM; 1186 return -ENOMEM;
1169 } 1187 }
1170 *loops[nr]->vloopout = vloopback_template; 1188 *loops[nr]->vloopout = vloopback_template;
1171 loops[nr]->vloopout->priv = kmalloc(sizeof(struct vloopback_private), 1189 loops[nr]->vloopout->vd_private_data = kmalloc(sizeof(struct vloopback_private),
1172 GFP_KERNEL); 1190 GFP_KERNEL);
1173 1191
1174 if (loops[nr]->vloopout->priv == NULL) { 1192 if (loops[nr]->vloopout->vd_private_data == NULL) {
1175 kfree(loops[nr]->vloopin->priv); 1193 kfree(loops[nr]->vloopin->vd_private_data);
1176 kfree(loops[nr]->vloopin); 1194 kfree(loops[nr]->vloopin);
1177 kfree(loops[nr]->vloopout); 1195 kfree(loops[nr]->vloopout);
1178 return -ENOMEM; 1196 return -ENOMEM;
1179 } 1197 }
1180 1198
1181 ((priv_ptr)loops[nr]->vloopin->priv)->pipenr = nr; 1199 ((priv_ptr)loops[nr]->vloopin->vd_private_data)->pipenr = nr;
1182 ((priv_ptr)loops[nr]->vloopout->priv)->pipenr = nr; 1200 ((priv_ptr)loops[nr]->vloopout->vd_private_data)->pipenr = nr;
1183 loops[nr]->invalid_ioctl = 0; /* tibit */ 1201 loops[nr]->invalid_ioctl = 0; /* tibit */
1184 loops[nr]->buffer = NULL; 1202 loops[nr]->buffer = NULL;
1185 loops[nr]->width = 0; 1203 loops[nr]->width = 0;
1186 loops[nr]->height = 0; 1204 loops[nr]->height = 0;
1187 loops[nr]->palette = 0; 1205 loops[nr]->palette = 0;
1190 loops[nr]->framesdumped = 0; 1208 loops[nr]->framesdumped = 0;
1191 loops[nr]->wopen = 0; 1209 loops[nr]->wopen = 0;
1192 loops[nr]->ropen = 0; 1210 loops[nr]->ropen = 0;
1193 loops[nr]->frame = 0; 1211 loops[nr]->frame = 0;
1194 1212
1195 ((priv_ptr)loops[nr]->vloopin->priv)->in = 1; 1213 ((priv_ptr)loops[nr]->vloopin->vd_private_data)->in = 1;
1196 ((priv_ptr)loops[nr]->vloopout->priv)->in = 0; 1214 ((priv_ptr)loops[nr]->vloopout->vd_private_data)->in = 0;
1197 sprintf(loops[nr]->vloopin->name, "Video loopback %d input", nr); 1215 sprintf(loops[nr]->vloopin->name, "Video loopback %d input", nr);
1198 sprintf(loops[nr]->vloopout->name, "Video loopback %d output", nr); 1216 sprintf(loops[nr]->vloopout->name, "Video loopback %d output", nr);
1199 1217
1200 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27) 1218 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
1201 loops[nr]->vloopin->type = 0; 1219 loops[nr]->vloopin->type = 0;
1209 1227
1210 ret = video_register_device(loops[nr]->vloopin, VFL_TYPE_GRABBER, minor_in); 1228 ret = video_register_device(loops[nr]->vloopin, VFL_TYPE_GRABBER, minor_in);
1211 1229
1212 if ((ret == -1 ) || ( ret == -23 )) { 1230 if ((ret == -1 ) || ( ret == -23 )) {
1213 info("error registering device %s", loops[nr]->vloopin->name); 1231 info("error registering device %s", loops[nr]->vloopin->name);
1214 kfree(loops[nr]->vloopin->priv); 1232 kfree(loops[nr]->vloopin->vd_private_data);
1215 kfree(loops[nr]->vloopin); 1233 kfree(loops[nr]->vloopin);
1216 kfree(loops[nr]->vloopout->priv); 1234 kfree(loops[nr]->vloopout->vd_private_data);
1217 kfree(loops[nr]->vloopout); 1235 kfree(loops[nr]->vloopout);
1218 kfree(loops[nr]); 1236 kfree(loops[nr]);
1219 loops[nr] = NULL; 1237 loops[nr] = NULL;
1220 return ret; 1238 return ret;
1221 } 1239 }
1222 1240
1223 ret = video_register_device(loops[nr]->vloopout, VFL_TYPE_GRABBER, minor_out); 1241 ret = video_register_device(loops[nr]->vloopout, VFL_TYPE_GRABBER, minor_out);
1224 1242
1225 if ((ret ==-1) || (ret == -23)) { 1243 if ((ret ==-1) || (ret == -23)) {
1226 info("error registering device %s", loops[nr]->vloopout->name); 1244 info("error registering device %s", loops[nr]->vloopout->name);
1227 kfree(loops[nr]->vloopin->priv); 1245 kfree(loops[nr]->vloopin->vd_private_data);
1228 video_unregister_device(loops[nr]->vloopin); 1246 video_unregister_device(loops[nr]->vloopin);
1229 kfree(loops[nr]->vloopout->priv); 1247 kfree(loops[nr]->vloopout->vd_private_data);
1230 kfree(loops[nr]->vloopout); 1248 kfree(loops[nr]->vloopout);
1231 kfree(loops[nr]); 1249 kfree(loops[nr]);
1232 loops[nr] = NULL; 1250 loops[nr] = NULL;
1233 return ret; 1251 return ret;
1234 } 1252 }
1335 1353
1336 info("Unregistering video4linux loopback devices"); 1354 info("Unregistering video4linux loopback devices");
1337 1355
1338 for (i = 0; i < nr_o_pipes; i++) { 1356 for (i = 0; i < nr_o_pipes; i++) {
1339 if (loops[i]) { 1357 if (loops[i]) {
1340 kfree(loops[i]->vloopin->priv); 1358 kfree(loops[i]->vloopin->vd_private_data);
1341 video_unregister_device(loops[i]->vloopin); 1359 video_unregister_device(loops[i]->vloopin);
1342 kfree(loops[i]->vloopout->priv); 1360 kfree(loops[i]->vloopout->vd_private_data);
1343 video_unregister_device(loops[i]->vloopout); 1361 video_unregister_device(loops[i]->vloopout);
1344 1362
1345 if (loops[i]->buffer) 1363 if (loops[i]->buffer)
1346 rvfree(loops[i]->buffer, loops[i]->buflength * num_buffers); 1364 rvfree(loops[i]->buffer, loops[i]->buflength * num_buffers);
1347 1365