Mercurial > vloopback
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 |