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

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

 



Rene Bredlau wrote:
> 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 ;-).

I just found this old thread while cleaning up my inbox.
Is this still a problem, or have things gotten better due
to other changes (VDR or driver) in the meantime?

Sorry for having lost sight of this one...

Klaus

> ------------------------------------------------------------------------
> 
> --- 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;


[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux