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 |
