Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] [PATCH] find v4l device on kernel 2.6 (GRAB Problem)



Hi,

even if i do not like the way vdr tries to find the v4l device it can use for his grab command i adjusted its handling to work under kernel 2.6.

If somebody can show me a way to determinate which v4l device belongs to a DVB driver instance i will build a better patch. But up to this, this patch will do the work under 2.6 (2.4 handling still in, but not tested from my side - reports, if i didnt break anything are welcome).

The patch should cleanly apply to vdr-1.3.5 (plain and elchi)

Klaus: if the patch did not break anything, could you please but it into the your version too? Maybe it is ok for stable to, but dont know ;-).


--
So long
.\\urray
--- dvbdevice.c	2004-02-24 11:12:13.000000000 +0100
+++ ../../vdr/dvbdevice.c	2004-03-13 18:07:39.000000000 +0100
@@ -24,6 +24,7 @@
 #include <linux/dvb/video.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
+#include <sys/utsname.h>
 #include "channels.h"
 #include "diseqc.h"
 #include "dvbosd.h"
@@ -326,11 +327,37 @@
   if (devVideoOffset < 0) { // the first one checks this
      FILE *f = NULL;
      char buffer[PATH_MAX];
+     
+     char *path_template = "/proc/video/dev/video%d"; // default is 2.4 - maybe this should be 2.6
+     utsname uname_data;
+
+     // get kernel version
+     if (uname(&uname_data)) {
+	dsyslog("! Could not get info about kernel version !");
+     } else {
+	dsyslog("kernel version %s", uname_data.release);
+	// adjust path template
+	if (!strncmp(uname_data.release,"2.4",3)) {
+	   dsyslog("Running on Kernel version 2.4");
+	   path_template = "/proc/video/dev/video%d";
+	} else if (!strncmp(uname_data.release,"2.6",3)) {
+	   dsyslog("Running on Kernel version 2.6");
+	   path_template = "/sys/class/video4linux/video%d/name";
+	} else {
+	   dsyslog("! Unknown kernel version falling back to 2.4 behavior !");
+	} // endif kernel version
+     } // endif uname
+
      for (int ofs = 0; ofs < 100; ofs++) {
-         snprintf(buffer, sizeof(buffer), "/proc/video/dev/video%d", ofs);
+         // the path depend on the kernel version
+         snprintf(buffer, sizeof(buffer), path_template, ofs);
          if ((f = fopen(buffer, "r")) != NULL) {
             if (fgets(buffer, sizeof(buffer), f)) {
-               if (strstr(buffer, "DVB Board")) { // found the _first_ DVB card
+	       // here all devices which support output should be listed (aka DVB backends)
+               if (strstr(buffer, "av7110") ||  // ttpci backend
+		   strstr(buffer, "some-other-frontend") || // fill in your backend
+		   strstr(buffer, "DVB Board")   // this is for kernel 2.4
+		  ) { // found the _first_ DVB card
                   devVideoOffset = ofs;
                   dsyslog("video device offset is %d", devVideoOffset);
                   break;

Home | Main Index | Thread Index