[ Im Vorposting ist wohl das Quoting etwas durcheinandergeraten. Ich versuche das mal zu korrigieren. ]
Npq hat geschrieben:jw hat geschrieben:Das heisst, es macht garkeinen Sinn, mehr als 128KB-Bloecke zu schreiben? BTW: Muss ich den SPTS-Mode explizit aktivieren oder geht das automatisch? Muss mich dieser Mode ueberhaupt interessieren?
Stell dir den DVR einfach als Eingang zum Demux vor, in den du nun statt des Frontends den TS-Datenstrom schreibst. Daß es nicht wirklich durch den physikalischen Demux geht sollte eigentlich keine Auswirkungen auf die Benutzung haben. DMX_OUT_DECODER heißt dann "sende die TS-Daten an den Dekoder". Von daher ist hier also der SPTS-Mode automatisch aktiviert. Alles andere würde auch eine Filterung (in Software) voraussetzen und ist daher nicht sinnvoll.
Das hatte ich bislang auch so verstanden. Aber die wiederkehrenden Verweise auf SPTS-, Clip- und sonstige Modes hatten mich verwirrt
. Deshalb auch meine Frage, ob mich dieser Mode ueberhaupt interessieren muss ;-)
jw hat geschrieben:Damit ist dann keine Reserve vorhanden, wenn der Scheduler mal die 10ms nicht einhalten sollte.
Es wird in der while-Schleife solange geprüft, bis entweder die Queue genug Platz hat oder sie ganz leer ist (wenn das zu Schreibende größer ist als die Queue).
Wenn ich aber nun in Bloecken von 1MBytes schreibe, dann wartet er _immer_ darauf, dass der Puffer _komplett_ leer wird, bevor _irgendwas_ geschrieben wird. IMHO waere es guenstiger, vor dem schedule-Aufruf wenistens soviel zu schreiben, wie zu diesem Zeitpunkt reinpasst. Und genau das besagt ja IMHO auch die FIXME-Notiz.
jw hat geschrieben: Als erste Naeherung waere es doch denkbar vor dem Schreiben den Fuellstand zu pruefen. Wenn der Puffer ganz leer ist, ist die Wahrscheinlichkeit hoch, dass er leergelaufen war.
Das Problem ist, daß der Füllstand beim Schreiben der Füllstand der Demux-Queue ist und nicht der - hier entscheidende - Füllstand des Avia-Dekoders. Da die Daten vom Avia selbst gelesen werden gibt es keine Routine, die prüfen könnte.
Ist das denn nicht der gleiche Puffer, nur dass der Avia per DMA darauf zugreift? Die Avia-Zeiger werden doch in hw_write_pos/hw_read_pos gespiegelt und sind damit dann auch beim Beschreiben des Puffers sichtbar (bzw koennen mittels avia_gt_dmx_queue_get_write_pos() ermittelt werden), oder nicht?
Man kann den Füllstand des Video-Puffers auslesen,
Das ist dann aber wieder ein andere Puffer?
dies ist aber nur ein momentaner Zustand und kann sich im nächsten Moment schon wieder ändern.
Dass das nur ein momentaner Zustand ist, ist schon klar. Aber wenn der Fuellstand null ist, waere es IMHO vorteilhaft, vorsorglich neu aufzusetzen, auch wenn es (noch) nicht zu Fehlern gekommen ist. Der Effekt der eintritt, wenn der Avia stolpert (fehlerhafte Wiedergabe bis hin zum Absturz, so dass ein power-cycle notwendig wird) ist IMHO viel aergerlicher als ein (vorsorgliches) neu aufsetzen.
Ich habe aber festgestellt, daß der Avia einen Buffer underrun korrekt meldet. Meine Bedenken waren, daß diese Meldung eventuell nicht käme. Das scheint aber so zu sein wie man aus den Debug-Ausgaben erkennt.
Hmm, ich weiss nicht... Das einzige, was bei mir kommt ist:
Code: Alles auswählen
SPTS, queue 0 extended.
avia_av_wdt_thread: video decoding stopped ==> restart
SPTS, queue 0 extended.
avia_av_wdt_thread: video decoding stopped ==> restart
avia_av_wdt_thread: video decoding stopped ==> restart
SPTS, queue 0 extended.
avia_av_wdt_thread: video decoding stopped ==> restart
SPTS, queue 0 extended.
SPTS, queue 0 extended.
Aber das kommt allerhoechstens in 5% der Faelle. Im Normalfall kommt garkeine Meldung. Deswegen glaube ich nicht dass diese Meldungen mit dem Underrun zusammenhaengen...
Der Dekoder scheint übrigens entgegen meiner Vermutung dann auch keinen Restart durchzuführen, sondern einfach nur die Daten anzunehmen und nichts mehr zu tun. Das ist auch die Ursache für den "Blackscreen"-Bug, zumindest bei mir.
Schwarzer Bildschirm und nur bruchstueckhafte Audio-Fetzen? Ja, das habe ich auch, wenn der genannte Puffer-Unterlauf fuer laengere Zeit anhaelt. Tritt das ein, ist auf jeden Fall ein Power-Cycle noetig.
Die Puffer werden gefüllt und transferiert, aber der Dekoder legt nicht mehr los. Muß man nochmal genauer evaluieren, habe dafür aber gerade keine Zeit.
jw hat geschrieben:BTW: beim Stoebern bin ich ueber eine Ungereimtheit in avia_gt_dmx_queue_irq() gestossen: Der Fall OW==R ist garnicht abgedeckt. Das ware doch dann der Fall, wenn der Lesezeiger den (alten) Schreibzeiger einholt. Mit anderen Worten also, wenn der Puffer leer gelaufen ist/war.
Das wäre ja in Ordnung, da ein read nicht mehr Daten lesen kann als vorhanden sind.
Ist schon klar. Ich meinte vielmehr, dass man das als Indiz fuer einen Puffer-Unterlauf nehmen koennte.
Der Lesezeiger dort betrifft nur die Daten, die in den Speicher kopiert werden (Sections, Streamdaten)
Also Daten, die vom FE kommen? Das waere dann eine andere Baustelle.
Die Analyse geht darum, einen Overflow zu erkennen. Wenn z.B. die Daten nicht schnell genug gelesen werden, dann überschreibt der Demux die noch nicht ausgelesenen Daten (weil das per DMA passiert). In diesem Falle kann man aus der Position des Lesezeigers erkennen, ob dies passiert ist oder nicht.
Ich meinte, dass man diesen Fall (OW==R) als Indiz fuer einen _Unterlauf_ nehmen koennte.
Danke nochmal fuer die Ausfuehrlichen Erlaeuterungen.