Dear visitor, welcome to VDR Portal. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.
Wenn der Kernel meint, der IRQ kommt vom Device, für den der Treiber zuständig ist, aber die HW dahinter hat gar keinen ausgelöst. Kann IMHO nur bei shared Interrupts kommen, evtl. reicht der Kernel die Interrupts auch an alle Treiber weiter, die diesen IRQ registriert haben bis ein Treiber signalisiert, das er ihn behandelt hat.Wann kann eigentlich dieser Fall eintreten?
|
|
Source code |
1 2 3 4 5 6 7 8 |
Jul 15 17:13:53 Supernova kernel: [ 0.837395] pci 0000:00:01.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:53 Supernova kernel: [ 0.837403] pci 0000:00:1c.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:53 Supernova kernel: [ 0.837422] pci 0000:00:1c.4: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:53 Supernova kernel: [ 1.409861] xhci_hcd 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:53 Supernova kernel: [ 1.457727] xhci_hcd 0000:01:00.0: irq 16, io mem 0xfbefe000 Jul 15 17:13:53 Supernova kernel: [ 21.317953] SAA716x FF 0000:03:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:57 Supernova kernel: [ 25.252313] i915 0000:00:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 Jul 15 17:13:57 Supernova kernel: [ 25.747893] cx88-mpeg driver manager 0000:06:02.2: PCI INT A -> GSI 16 (level, low) -> IRQ 16 |
|
|
Source code |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CPU0 CPU1 CPU2 CPU3
16: 27417 304933 0 0 IO-APIC-fasteoi cx88[0]
43: 1 0 0 0 PCI-MSI-edge xhci_hcd
44: 0 0 0 0 PCI-MSI-edge xhci_hcd
45: 0 0 0 0 PCI-MSI-edge xhci_hcd
46: 0 0 0 0 PCI-MSI-edge xhci_hcd
47: 0 0 0 0 PCI-MSI-edge xhci_hcd
48: 8780068 0 0 0 PCI-MSI-edge SAA716x Core
49: 1503651 6084 57004 0 PCI-MSI-edge i915
CPU0 CPU1 CPU2 CPU3
16: 27417 304933 0 0 IO-APIC-fasteoi cx88[0]
43: 1 0 0 0 PCI-MSI-edge xhci_hcd
44: 0 0 0 0 PCI-MSI-edge xhci_hcd
45: 0 0 0 0 PCI-MSI-edge xhci_hcd
46: 0 0 0 0 PCI-MSI-edge xhci_hcd
47: 0 0 0 0 PCI-MSI-edge xhci_hcd
48: 8782420 0 0 0 PCI-MSI-edge SAA716x Core
49: 1504224 6084 57004 0 PCI-MSI-edge i915
|
, wo lernt man sowas?
Im Transfer-Modus kommen die Daten genau in dem Tempo vom Sender, wie sie die Karte wiedergibt. Damit beide die exakt gleiche Geschwindigkeit einhalten, synchronisiert sich das Ausgabedevice mit der Program Clock Reference des Senders. Daher sollte EAGAIN in dieser Situation überhaupt nicht auftreten. Wenn es hier dennoch so massiv auftritt, ist es meiner Meinung nach eher ein Hinweis darauf, dass das Ausgabedevice seine Wiedergabe gar nicht begonnen hat. Ein Versuch eines Workarounds wäre, einfach nochmal die notwendigen Kommandos an die Karte zu schicken, die die Wiedergabe starten sollen.
Als - vermutlich nicht zusammenhängende - Randnotiz: Mir ist schon mehrfach aufgefallen, dass manchmal die Umschaltung zwischen Play und Pause fehlerhaft ist, und bei Play nur der Ton losläuft, das Bild aber nicht. Selbst beim Umschalten von Pause auf Live-Modus habe ich das schon beobachtet. Ein 'harter' Sprung im Videostream (Seek der Aufnahme oder Senderwechsel) hilft dann.
Bevor ihr noch ewig mit EAGAIN in PlayTsVideo kämpft:
Es ist vollkommen normal, dass EAGAIN in PlayTsVideo auftritt. Die Funktion heißt aus gutem Grund WriteAllOrNothing: -1/EAGAIN ist genau der "or nothing" Teil! Der Aufrufer der PlayTs-Funktion ist verpflichtet, auf EAGAIN zu reagieren, und die Daten später noch einmal anzubieten.
Bei Wiedergabe von Aufzeichnungen füttert VDR das Device so lange mit Daten, bis die Play-Funktionen mit EAGAIN signalisieren, dass sie voll sind. Würde man dann einfach Daten verwerfen, würde er in Festplatten-Lesegeschwindigkeit durch die Aufnahme jagen, und fast nichts anzeigen.
Quoted
Im Transfer-Modus kommen die Daten genau in dem Tempo vom Sender, wie sie die Karte wiedergibt. Damit beide die exakt gleiche Geschwindigkeit einhalten, synchronisiert sich das Ausgabedevice mit der Program Clock Reference des Senders.
Quoted
Daher sollte EAGAIN in dieser Situation überhaupt nicht auftreten. Wenn es hier dennoch so massiv auftritt, ist es meiner Meinung nach eher ein Hinweis darauf, dass das Ausgabedevice seine Wiedergabe gar nicht begonnen hat. Ein Versuch eines Workarounds wäre, einfach nochmal die notwendigen Kommandos an die Karte zu schicken, die die Wiedergabe starten sollen.
Quoted
Als - vermutlich nicht zusammenhängende - Randnotiz: Mir ist schon mehrfach aufgefallen, dass manchmal die Umschaltung zwischen Play und Pause fehlerhaft ist, und bei Play nur der Ton losläuft, das Bild aber nicht. Selbst beim Umschalten von Pause auf Live-Modus habe ich das schon beobachtet. Ein 'harter' Sprung im Videostream (Seek der Aufnahme oder Senderwechsel) hilft dann.
Nun, wirklich schlauer bin ich nach 14 Stunden rumprobieren immer noch nicht. Das einzige, was aus den Logs ausgeht, ist, dass nach einiger Zeit im Interrupt-handler die Ereignisse ISR_DATA_MASK und ISR_OSD_READY_MASK nicht mehr eintreten, dadurch die WaitQueues nicht mehr aufgeweckt werden, was letzendlich zu den timeouts führt. Hat jemand eine Idee, wo die Ursache liegen könnte? Ich habe sogar die Anzahl Bytes zusammengezählt, die erfolgreich übertragen werden, bevor es zum timeout kommt. Es sind aber doch recht unterschiedliche, mal um die 16 MB, mal 26 MB.
Es ist vollkommen normal, dass EAGAIN in PlayTsVideo auftritt. Die Funktion heißt aus gutem Grund WriteAllOrNothing: -1/EAGAIN ist genau der "or nothing" Teil! Der Aufrufer der PlayTs-Funktion ist verpflichtet, auf EAGAIN zu reagieren, und die Daten später noch einmal anzubieten.
Meine *Vermutung* ist, daß beim gepatchten Plugin die Daten an die Karte ausgegeben werden, wenn sie diese gar nicht annehmen kann. Dann laufen die Ringbuffer in VDR und Treiber über. Artefakte sind das Ergebnis.
Daher mein Vorschlag, in so einem Fall die Daten wegzuwerfen. (Damit der Ringpuffer in VDR geleert wird.)
Sollte klar sein, daß man dies nur im Transfermode machen darf, nicht bei Wiedergabe einer Aufzeichnung!
Ich habe versucht, alles mögliche auszugeben, die ich im Treiber ausgeben kannNun, wirklich schlauer bin ich nach 14 Stunden rumprobieren immer noch nicht. Das einzige, was aus den Logs ausgeht, ist, dass nach einiger Zeit im Interrupt-handler die Ereignisse ISR_DATA_MASK und ISR_OSD_READY_MASK nicht mehr eintreten, dadurch die WaitQueues nicht mehr aufgeweckt werden, was letzendlich zu den timeouts führt. Hat jemand eine Idee, wo die Ursache liegen könnte? Ich habe sogar die Anzahl Bytes zusammengezählt, die erfolgreich übertragen werden, bevor es zum timeout kommt. Es sind aber doch recht unterschiedliche, mal um die 16 MB, mal 26 MB.
Es ist vollkommen normal, dass EAGAIN in PlayTsVideo auftritt. Die Funktion heißt aus gutem Grund WriteAllOrNothing: -1/EAGAIN ist genau der "or nothing" Teil! Der Aufrufer der PlayTs-Funktion ist verpflichtet, auf EAGAIN zu reagieren, und die Daten später noch einmal anzubieten.
Daraus ergeben sich mir ein paar Fragen:
-Ist es denn so, dass die PlayTs Funktion der normalen device.c verwendet wird?
Quoted
-Wird das Verhalten, die Daten noch einmal anzubieten, nicht sowieso durch die Funktion "cTransfer::Receive" in der transfer.c abgedeckt (100x10ms warten...)?
Quoted
Meine *Vermutung* ist, daß beim gepatchten Plugin die Daten an die Karte ausgegeben werden, wenn sie diese gar nicht annehmen kann. Dann laufen die Ringbuffer in VDR und Treiber über. Artefakte sind das Ergebnis.
Was können wir tun, um Deine Vermutung zu bestätigen und der Ursache auf den Grund zu gehen?
Daher mein Vorschlag, in so einem Fall die Daten wegzuwerfen. (Damit der Ringpuffer in VDR geleert wird.)
Sollte klar sein, daß man dies nur im Transfermode machen darf, nicht bei Wiedergabe einer Aufzeichnung!
Sollte dafür dann die transfer.c geändert werden oder gibt es eine Art Flag, falls in der PlayTsVideo eine Aufzeichnung verarbeitet wird?
Das ist falsch. Für das Ausgabedevice ist Transfermode das gleiche wie Wiedergabe von der Platte. Nix mit PCR!
So war es bei der alten FF-Karte (und ich vermute, hier ist es genauso):
Die Karte läuft mit ihrer internen STC. Die Clock-Abweichung zwischen Sender und Wiedergabe wird durch Pufferung in VDR bzw. Treiber ausgeglichen.
Quoted
Daher mein Vorschlag, in so einem Fall die Daten wegzuwerfen. (Damit der Ringpuffer in VDR geleert wird.)
Sollte klar sein, daß man dies nur im Transfermode machen darf, nicht bei Wiedergabe einer Aufzeichnung!
Daraus ergeben sich mir ein paar Fragen:
-Ist es denn so, dass die PlayTs Funktion der normalen device.c verwendet wird?
-Wird das Verhalten, die Daten noch einmal anzubieten, nicht sowieso durch die Funktion "cTransfer::Receive" in der transfer.c abgedeckt (100x10ms warten...)?
Das ist falsch. Für das Ausgabedevice ist Transfermode das gleiche wie Wiedergabe von der Platte. Nix mit PCR!
So war es bei der alten FF-Karte (und ich vermute, hier ist es genauso):
Die Karte läuft mit ihrer internen STC. Die Clock-Abweichung zwischen Sender und Wiedergabe wird durch Pufferung in VDR bzw. Treiber ausgeglichen.
... und wieder was gelernt.
Letztlich kann der Clock der Karte und der des Senders aber doch nie 100% synchron sein, d.H. es muss zwangsläufig irgendwann zu einem frame drop oder zu einem fehlenden frame kommen, oder?
Quoted
Quoted
Daher mein Vorschlag, in so einem Fall die Daten wegzuwerfen. (Damit der Ringpuffer in VDR geleert wird.)
Sollte klar sein, daß man dies nur im Transfermode machen darf, nicht bei Wiedergabe einer Aufzeichnung!
Das macht ja der transfer mode: Nach 100 Versuchen bzw. 1 Sekunde verwirft er das Paket. So wird man natürlich nicht viele Daten los, vermutlich wird daher der Receiver eher Daten verlieren.
Ich habe nun mal ein 2 Minuten Stück geschnitten, wo eine zweite Tonspur (ENG) zugeschaltet wird (nach ca. einer Minute). Am VDR entstehen Bild- und Tonstörungen beim Abspielen. Der Fehler ist wohl in der Aufnahme schon drin, weil mit VLC der selbe Effekt zu sehen und Hören ist. Der Mediaplayer hingegen stürzt ab.
|
|
Source code |
1 2 |
media_build_experimental/v4l/cx23885-cards.c:29:50: fatal error: ../../../staging/altera-stapl/altera.h: No such file or directory compilation terminated. |
|
|
Source code |
1 2 3 4 |
#include <linux/firmware.h> #include "../../../staging/altera-stapl/altera.h" #include "cx23885.h" |
|
|
Source code |
1 |
WARNING: "put_compat_timespec" [/home/nagyi/VDR/TT6400/fresh/media_build_experimental/v4l/v4l2-compat-ioctl32.ko] undefined! |
|
|
Source code |
1 2 3 4 5 |
if (phiISR & ISR_FE_READY_MASK) {
SAA716x_EPWR(PHI_1, FPGA_ADDR_EMI_ICLR, ISR_FE_READY_MASK);
phiISR &= ~ISR_FE_READY_MASK;
dprintk(SAA716x_INFO, 1, "FE_READY interrupt source");
}
|
Zwangsläufig! Da ja die Tonspur dazugeschaltet wird. Mit VDR1.6 ist die "Störung" aber minimal. Es fehlen ein paar Frames; aber Standbild, Verpixelung, stotternder Ton ist erst seit der TT-6400 und HD VDR 1.7... Die Störungen sind schon relativ stark (mehrere Sekunden!). Im Treiber kann bestimmt noch was verbessert werden - allein in Bezug auf den Ton beim Springen oder Spulen. In der Zeitlupe spielt komischerweise auch Ton...Ich habe nun mal ein 2 Minuten Stück geschnitten, wo eine zweite Tonspur (ENG) zugeschaltet wird (nach ca. einer Minute). Am VDR entstehen Bild- und Tonstörungen beim Abspielen. Der Fehler ist wohl in der Aufnahme schon drin, weil mit VLC der selbe Effekt zu sehen und Hören ist. Der Mediaplayer hingegen stürzt ab.
Die Datei enthält "Continuity Counter Errors", d.h. es fehlen Datenpakete. Klar, daß es dort eine Störung gibt.
Im Log steht nicht zufällig etwas von "retuning due to modification of channel". Das wäre dann die Ursache...
CU
Oliver
Diesen Fall hatte ich auch schon, ca 1s nach Aufnahmebeginn ist das Bild für ca. 1s verpixelt und im VDR Log findet sich die retuning Meldung. IMHO hat VDR 1.6 dann das Broken-Link Flag im MPEG 2 Datenstrom gesetzt (Logmeldung: ""SetBrokenLink: no GOP header found in video packet") weshalb es dort nicht aufgefallen ist, aber mangels Streamanalyse im VDR 1.7 ist das nicht mehr möglich ist. Kann man das für MEPG2 im Treiber oder FW realisieren?Zwangsläufig! Da ja die Tonspur dazugeschaltet wird. Mit VDR1.6 ist die "Störung" aber minimal. Es fehlen ein paar Frames; aber Standbild, Verpixelung, stotternder Ton ist erst seit der TT-6400 und HD VDR 1.7... Die Störungen sind schon relativ stark (mehrere Sekunden!). Im Treiber kann bestimmt noch was verbessert werden - allein in Bezug auf den Ton beim Springen oder Spulen. In der Zeitlupe spielt komischerweise auch Ton...Die Datei enthält "Continuity Counter Errors", d.h. es fehlen Datenpakete. Klar, daß es dort eine Störung gibt.
Im Log steht nicht zufällig etwas von "retuning due to modification of channel". Das wäre dann die Ursache...
CU
Oliver
|
|
Source code |
1 |
timeout = wait_event_interruptible_timeout(sti7109->cmd_ready_wq, sti7109->cmd_ready == 1, timeout); |
|
|
Source code |
1 2 3 4 5 6 7 8 9 |
if (timeout == -ERESTARTSYS || sti7109->cmd_ready == 0) {
if (timeout == -ERESTARTSYS) {
/* a signal arrived */
dprintk(SAA716x_ERROR, 1, "cmd ERESTARTSYS");
return -ERESTARTSYS;
}
dprintk(SAA716x_ERROR, 1, "timed out waiting for command ready %lu. Let the shit go on...", timeout);
//return -EIO;
}
|
|
|
Source code |
1 2 3 4 5 |
static int sti7109_raw_cmd(struct sti7109_dev * sti7109, osd_raw_cmd_t * cmd) static int sti7109_raw_osd_cmd(struct sti7109_dev * sti7109, osd_raw_cmd_t * cmd) static int sti7109_raw_data(struct sti7109_dev * sti7109, osd_raw_data_t * data) |
Zwangsläufig! Da ja die Tonspur dazugeschaltet wird.Ich habe nun mal ein 2 Minuten Stück geschnitten, wo eine zweite Tonspur (ENG) zugeschaltet wird (nach ca. einer Minute). Am VDR entstehen Bild- und Tonstörungen beim Abspielen. Der Fehler ist wohl in der Aufnahme schon drin, weil mit VLC der selbe Effekt zu sehen und Hören ist. Der Mediaplayer hingegen stürzt ab.
Die Datei enthält "Continuity Counter Errors", d.h. es fehlen Datenpakete. Klar, daß es dort eine Störung gibt.
Im Log steht nicht zufällig etwas von "retuning due to modification of channel". Das wäre dann die Ursache...
Quoted
Mit VDR1.6 ist die "Störung" aber minimal.
Quoted
Es fehlen ein paar Frames; aber Standbild, Verpixelung, stotternder Ton ist erst seit der TT-6400 und HD VDR 1.7... Die Störungen sind schon relativ stark (mehrere Sekunden!). Im Treiber kann bestimmt noch was verbessert werden - allein in Bezug auf den Ton beim Springen oder Spulen. In der Zeitlupe spielt komischerweise auch Ton...
IMHO hat VDR 1.6 dann das Broken-Link Flag im MPEG 2 Datenstrom gesetzt (Logmeldung: ""SetBrokenLink: no GOP header found in video packet") weshalb es dort nicht aufgefallen ist, aber mangels Streamanalyse im VDR 1.7 ist das nicht mehr möglich ist. Kann man das für MEPG2 im Treiber oder FW realisieren?
Ein Retuning ist unnötig, es würde genügen, die Tonspur zuzuschalten.