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;
Klaus Schmidinger schrieb:
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
Hello Klaus,
I updated my whole VDR a few weeks ago. I am now using Kernel 2.6.15 with the driver mentioned in your 1.4.0 release. Sometimes grabbing works yust fine, the other day it does not. So I think this is still a problem with current vdr and driver.
Maybe this evening I can send you some logfiles.
Lutz
Hi Klaus,
Klaus Schmidinger 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...
I think this patch is still useful. It is needed to skip non DVB cards (for example an PVR250) while finding the device file for grabbing.
The patch contains the adoption of some functionality that was already inside VDR for Kernel 2.4. So it should still be useful for 2.6 users with analog tv cards especially if they use hotplug cards.
The patch only checks for av7110 frontend (which belongs to ttpci and maybe others). It should be easy to extend it to contain a whole list of Kernel 2.6 dvb drivers. I did not found a more generic way to distinguish analog from DVB card :-(. See the comment inside the patch.
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;
vdr mailing list vdr@linuxtv.org http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr