avia_av_wdt verbessern

Sklaventreiber
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

avia_av_wdt verbessern

Beitrag von seife »

Tach.
Ich hatte auf mehreren Programmen (Sat, Astra 19.2E) das Problem, daß nach dem Umschalten kurz Ton da war, aber dann verschwand. Betroffen war z.B. "CNN Int.". Da es ja einen Watchdog für den AV Dekoder gibt, wunderte ich mich, warum der das nicht bemerkte. Irgendwie schien es so zu sein, daß da keine interrupts mehr ankamen (oder nur ganz wenige, vom Videodekodieren), was dann nicht reichte, um den Audio-Watchdog zu triggern. Dieser Patch fixt das für mich (die zwei "|" => "||" Änderungen sind nur Correctness-Fixes):

Code: Alles auswählen

Index: driver/dvb/drivers/media/dvb/avia/avia_av_core.c
===================================================================
RCS file: /cvs/tuxbox/driver/dvb/drivers/media/dvb/avia/avia_av_core.c,v
retrieving revision 1.99
diff -u -p -r1.99 avia_av_core.c
--- a/driver/dvb/drivers/media/dvb/avia/avia_av_core.c  8 Jan 2006 21:36:22 -0000       1.99
+++ b/driver/dvb/drivers/media/dvb/avia/avia_av_core.c  19 Sep 2007 16:56:39 -0000
@@ -1478,19 +1478,20 @@ int avia_av_wdt_thread(void)
        int SUM_AUD_DECODED = 0;
        int LAST_SUM_DECODED = 0;
        int LAST_SUM_AUD_DECODED = 0;
-       int counter = 0;
+       int counter = 0;
+       int timeout = 0;

        dvb_kernel_thread_setup ("avia_av_wdt");
        printk ("avia_av_core: Starting avia_av_wdt thread.\n");
        for(;;){
-               /* sleep till we got a wakeup signal */
-               interruptible_sleep_on(&avia_av_wdt_sleep);
+               /* sleep for one second or until we got a wakeup signal */
+               timeout = !interruptible_sleep_on_timeout(&avia_av_wdt_sleep, 100);

-               if (counter >= 100) {
+               if (counter >= 100 || timeout) {
                        if (avia_av_dram_read(PROC_STATE) == 0x04) {
                                if (play_state_video == AVIA_AV_PLAY_STATE_PLAYING) {
                                        SUM_DECODED = avia_av_dram_read(N_DECODED);
-                                       if ((SUM_DECODED == 0x00) | (SUM_DECODED == LAST_SUM_DECODED)) {
+                                       if ((SUM_DECODED == 0x00) || (SUM_DECODED == LAST_SUM_DECODED)) {
                                                printk("avia_av_wdt_thread: video decoding stopped ==> restart\n");
                                                avia_av_cmd(SelectStream, 0x00, pid_video);
                                        }
@@ -1498,7 +1499,7 @@ int avia_av_wdt_thread(void)
                                }
                                if (play_state_audio == AVIA_AV_PLAY_STATE_PLAYING) {
                                        SUM_AUD_DECODED = avia_av_dram_read(N_AUD_DECODED);
-                                       if ((SUM_AUD_DECODED == 0x00) | (SUM_AUD_DECODED == LAST_SUM_AUD_DECODED)) {
+                                       if ((SUM_AUD_DECODED == 0x00) || (SUM_AUD_DECODED == LAST_SUM_AUD_DECODED)) {
                                                printk("avia_av_wdt_thread: audio decoding stopped ==> restart\n");
                                                avia_av_cmd(SelectStream, 0x03 - bypass_mode, pid_audio);
                                        }
Ich bin mir nicht ganz sicher, ob die avia_av_cmd()s nicht unter dem avia_command_lock-Spinlock aufgerufen werden müßten, wenn timeout = 1, da das wake_up_interruptible(&avia_cmd_wait) normalerweise immer unter diesem Spinlock aufgerufen wird. Andererseits werden an anderen Stellen in den Treibern auch avia_av_cmd()s ohne diesem Spinlock ausgeführt, drum bin ich mir da nicht schlüssig. Und ich kann nicht von mir behaupten, daß ich diesen Treiber verstanden hätte ;-)

Aber vielleicht hilft es ja jemand.
mash4077
Tuxboxer
Tuxboxer
Beiträge: 4654
Registriert: Samstag 27. April 2002, 13:19

Beitrag von mash4077 »

Hi,

soweit ich mich erinnere, hatte Carjay den Watchdog für den 2.6er Kernel auch schon mal verbessert. Damals wohl aufgrund der Freeze-Problematik der Nokia Avia500 Boxen.

Vielleicht hilft es dir zusätzlich, wenn du dir den ansiehst.

Gruß
mash
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Danke für den Hinweis. Auf die Idee, im 2.6-er Branch zu schauen, bin ich noch gar nicht gekommen :-)

Da ist dann übrigens auch ein "interruptible_sleep_on_timeout" drin, ich liege also nicht vollkommen falsch :-).

Ich schau's mir mal genauer an.
mash4077
Tuxboxer
Tuxboxer
Beiträge: 4654
Registriert: Samstag 27. April 2002, 13:19

Beitrag von mash4077 »

Daran konnte ich mich noch erinnern:
http://forum.tuxbox-cvs.sourceforge.net ... hp?t=35694

Und außerdem:
Npq hat geschrieben:Also, meine Theorie ist, daß der Watchdog in den 2.4er-Treibern ein erhöhtes Interruptaufkommen auslöst, wodurch wohl der Bus bei einigen Boxen überlastet wird (Machine Check beim Transfer Ack).

Für den 2.6er Treiber wurde das Handling mal geändert, aber aus Zeitgründen nicht zurückportiert.
Gruß
mash
T-Tron
Interessierter
Interessierter
Beiträge: 67
Registriert: Mittwoch 2. November 2005, 07:45

Beitrag von T-Tron »

Vielleicht schauen sich die Profis mal in den neuen LinuxTV-Treibern den Part dvb_frontend_swzigzag_autotune an, und sagen was sie davon halten.

Besseres tunen = tunen ohe WD?
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

IMVHO hat das eher wenig miteinander zu tun. Ab und zu crashed der audiodecoder bei mir (vielleicht wegen eines schlechten Signals), und muß neu gestartet werden. Tunen muß ich deswegen nicht :-)
T-Tron
Interessierter
Interessierter
Beiträge: 67
Registriert: Mittwoch 2. November 2005, 07:45

Beitrag von T-Tron »

Aber so bekommst du einen besseren LOCK, Schwarzbild ade und mehr...
Na denn, FFN.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Ich habe übrigens mal das meiste von carjay's 2.6er-Änderungen zurückportiert.
http://ulc.tuxbox-cvs.sourceforge.net/i ... tory=Diffs&
Falls das mal jemand ausprobieren will.
bellum
bbs-Maintainer
Beiträge: 282
Registriert: Montag 23. Oktober 2006, 22:13

Beitrag von bellum »

seife hat geschrieben:Ich habe übrigens mal das meiste von carjay's 2.6er-Änderungen zurückportiert.
http://ulc.tuxbox-cvs.sourceforge.net/i ... tory=Diffs&
Falls das mal jemand ausprobieren will.
Na klar immer doch, aber...

Code: Alles auswählen

patching file avia_av.h
patching file avia_av_core.c
Hunk #6 FAILED at 387.
Hunk #13 FAILED at 988.
Hunk #19 FAILED at 1508.
3 out of 19 hunks FAILED -- saving rejects to file avia_av_core.c.rej
mit folgender avia_av_core.c

Code: Alles auswählen

Revision 1.99 - (view) (download) (as text) (annotate) - [select for diffs] 
Sun Jan 8 21:36:22 2006 UTC (21 months, 3 weeks ago) by carjay 
Branch: MAIN 
CVS Tags: HEAD 
Changes since 1.98: +10 -4 lines 
Diff to previous 1.98 
changes to make ucode work
Gruß bellum
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

ok, dann überarbeite ich das nochmal... :-)
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

hm - patched bei mir problemlos:

Code: Alles auswählen

seife@susi:/local/seife/src/tuxbox-devel/driver> cvs status dvb/drivers/media/dvb/avia/avia_av.h
===================================================================
File: avia_av.h         Status: Up-to-date

   Working revision:    1.29
   Repository revision: 1.29    /cvs/tuxbox/driver/dvb/drivers/media/dvb/avia/avia_av.h,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

seife@susi:/local/seife/src/tuxbox-devel/driver> cvs status dvb/drivers/media/dvb/avia/avia_av_core.c
===================================================================
File: avia_av_core.c    Status: Up-to-date

   Working revision:    1.99
   Repository revision: 1.99    /cvs/tuxbox/driver/dvb/drivers/media/dvb/avia/avia_av_core.c,v
   Sticky Tag:          (none)
   Sticky Date:         (none)
   Sticky Options:      (none)

seife@susi:/local/seife/src/tuxbox-devel/driver> patch -p1 < /tmp/drivers-avia-2.6-backport.diff
patching file dvb/drivers/media/dvb/avia/avia_av.h
patching file dvb/drivers/media/dvb/avia/avia_av_core.c
seife@susi:/local/seife/src/tuxbox-devel/driver>
bellum
bbs-Maintainer
Beiträge: 282
Registriert: Montag 23. Oktober 2006, 22:13

Beitrag von bellum »

seife hat geschrieben:hm - patched bei mir problemlos
Jau, war mein Fehler, Sorry! Der Treiber läuft nun...
Hab das ganze mal mit meiner Sagem kurz angetestet. Wenn ich das richtig verstanden habe beziehen sich die Verbesserungen auf den AVIA Watchdog und ich bekomme bei Sendern die sonst ein schwarzes Bild haben nun (mit kurzer Verzögerung und einigen Rucklern) ein Bild. Weiterer positiver Nebeneffekt, beim Verlassen des Movieplayers friert das Bild/Ton nicht mehr ein... Auf was muss man denn sonst noch achten?

Gruß bellum
PandinusImperator
Interessierter
Interessierter
Beiträge: 32
Registriert: Dienstag 23. Oktober 2007, 09:26

Beitrag von PandinusImperator »

Hi,
mit dem Diff läuft der Ton etwas hinterher.
unsynchron - avia500 nokia cable
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

PandinusImperator hat geschrieben:Hi,
mit dem Diff läuft der Ton etwas hinterher.
unsynchron - avia500 nokia cable
Ja - den avia_av_sync_mode hat carjay kaputtgefixt, der ist jetzt immer auf AVIA_AV_SYNC_MODE_NONE :-)
Ich habe hier schon eine aktuellere Version, die das (und vieles andere) wieder ganz macht, muß ich nur noch ein wenig aufräumen...

Das Problem daran ist, daß ich mich mit der Hardware selbst nicht wirklich auskenne. Also wenn jemand schlecht wird, wenn er sieht, was ich da mit den armen Chips mache, so soll er mich bitte nicht schlagen :-)
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

http://ulc.tuxbox-cvs.sourceforge.net// ... tory=Diffs&
Funktioniert bei mir etwas besser. Außerdem bekommst du in /proc/bus/avia_avsync die Möglichkeit, den sync_mode einzustellen.
Mit "cat /proc/bus/avia_avsync" bekommst du eine Liste der Möglichkeiten.
Default ist 6 (SYNC_MODE_AV), bei mir funktioniert aber 5 besser, insbesondere schlägt da der audio-Watchdog nicht so oft nach dem Umschalten zu.

Dan gibts noch das hier: showptsdiff.tar.gz, damit sieht man schön, ob video und audio in sync sind.

Code: Alles auswählen

/var $ cat /proc/bus/avia_avsync
5
# 0 = none
# 4 = audio
# 5 = video
# 6 = av
/var $ showptsdiff
pic_pts: 06:12:07.655 aud_pts: 06:12:07.671, diff (ms): -16
pic_pts: 06:12:08.695 aud_pts: 06:12:08.679, diff (ms): 16
pic_pts: 06:12:09.695 aud_pts: 06:12:09.687, diff (ms): 8
pic_pts: 06:12:10.695 aud_pts: 06:12:10.695, diff (ms): 0
pic_pts: 06:12:11.736 aud_pts: 06:12:11.703, diff (ms): 33
pic_pts: 06:12:12.736 aud_pts: 06:12:12.711, diff (ms): 25
pic_pts: 06:12:13.735 aud_pts: 06:12:13.743, diff (ms): -8
pic_pts: 06:12:14.735 aud_pts: 06:12:14.727, diff (ms): 8
pic_pts: 06:12:15.735 aud_pts: 06:12:15.759, diff (ms): -24
pic_pts: 06:12:16.775 aud_pts: 06:12:16.767, diff (ms): 8
Viel Spaß :-)
PandinusImperator
Interessierter
Interessierter
Beiträge: 32
Registriert: Dienstag 23. Oktober 2007, 09:26

Beitrag von PandinusImperator »

Nett,
werd showpts mal in technische informationen einbauen, kann man ja immer mal gebrauchen.

danke


----

getestet -> gut
mit 6 habe ich max +-40
mit 5 oft > 100
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

SPTS oder PES mode?
bellum
bbs-Maintainer
Beiträge: 282
Registriert: Montag 23. Oktober 2006, 22:13

Beitrag von bellum »

seife hat geschrieben:http://ulc.tuxbox-cvs.sourceforge.net// ... tory=Diffs&
Funktioniert bei mir etwas besser. Außerdem bekommst du in /proc/bus/avia_avsync die Möglichkeit, den sync_mode einzustellen.
Mit "cat /proc/bus/avia_avsync" bekommst du eine Liste der Möglichkeiten.
Default ist 6 (SYNC_MODE_AV), bei mir funktioniert aber 5 besser, insbesondere schlägt da der audio-Watchdog nicht so oft nach dem Umschalten zu.
Mit dem neuen diff ist das Bild/Ton auf meiner Sagen im PES Mode wieder synchron. Ich bekomme sowohl mit 5 als auch 6 showptsdiff Werte von +- 35 wobei bei 5 auch bei mir der Schwarzbildbug weniger zuschlägt. Soweit so gut. Leider bekommt der diff dem Movieplayer im AC3 Modus gar nicht gut. Nach einer Pause stürzt er ab:

Code: Alles auswählen

[mp] Startplay
[mp] PlayFileThread starts
[mp] found pida[0]: 0x0100, ac3=0
[mp] found pida[1]: 0x0101, ac3=1
[movieplayer.cpp] apid changed to 257
[mp] plain TS file with vpid=(0x00FF) apid=(0x0101) ac3=(1)
[mp] buffer (1701400 bytes) created, using (25) total segments, opt = (18)
[mp] reader thread started ...
[mp] buffering ...
[mp] entering player loop
avia_av_sync_mode_set: tried to set mode while inactive
SPTS, queue 0 extended.
avia_av: new_audio_config timeout
[mp] pause
[mp] continue
avia_av: status timeout - chip didn't accept command 0x231
avia_av_event: $Id: avia_av_event.c,v 1.11 2003/10/26 16:32:51 obi Exp $
Vielleicht willst Du Dir einmal http://forum.tuxbox-cvs.sourceforge.net ... 093#343093 anschauen.
Seitdem ich mit meiner Sagem auf avia600vb022 gewechselt bin habe ich mit diesem diff keine Probleme sowohl mit dem Schwarzbildbug als auch mit dem Movieplayer mehr denn ich bin eigentlich kein Freund von irgendwelchen Watchdogs... (Mit der Nokia sieht es leider anders aus :( ). Auf jeden Fall vielen Dank für Deine Bemühungen die Treiber zu verbessern!

Gruß bellum
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Ich habe mir diesen Post (und den diff) schon angeschaut.
Allerdings macht er mehrere Dinge auf einmal:
- Tuning ändern
- Irgendwas seltsames in avia_av_core

Da die beide nichts miteinander zu tun haben (IMHO), war es mir dann einfach zuviel Arbeit, diesen Patch zu durchforsten.

(Und ja, mein Patch hier macht auch mehrere Sachen, aber das meiste sind einfach die backports von carjay's fixes aus dem 2.6er branch, plus zusätzliche fixes für den komplettreset des avia. Und dann, hauptsächlich zum testen, noch das /proc/bus/avia_avsync).

Movieplayer fiel mir gestern auch schon auf, aber ich habe es auf eine kaputte datei geschoben (war eine remuxed VDR-Aufnahme). Da ich den aber eh praktisch nie nutze, zwickt mich das nur wenig :-)
bellum
bbs-Maintainer
Beiträge: 282
Registriert: Montag 23. Oktober 2006, 22:13

Beitrag von bellum »

seife hat geschrieben:Ich habe mir diesen Post (und den diff) schon angeschaut.
Allerdings macht er mehrere Dinge auf einmal:
- Tuning ändern
- Irgendwas seltsames in avia_av_core

Da die beide nichts miteinander zu tun haben (IMHO), war es mir dann einfach zuviel Arbeit, diesen Patch zu durchforsten.

(Und ja, mein Patch hier macht auch mehrere Sachen, aber das meiste sind einfach die backports von carjay's fixes aus dem 2.6er branch, plus zusätzliche fixes für den komplettreset des avia. Und dann, hauptsächlich zum testen, noch das /proc/bus/avia_avsync).

Movieplayer fiel mir gestern auch schon auf, aber ich habe es auf eine kaputte datei geschoben (war eine remuxed VDR-Aufnahme). Da ich den aber eh praktisch nie nutze, zwickt mich das nur wenig :-)
O.K. kein Problem, das sollte wirklich kein Vorwurf sein, für mich ist halt der Movieplayer ein Killerfeature...

Gruß bellum
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

Hm, mein Movieplayer-Problem lag an meinen unqualifizierten Versuchen, eine "Echtzeitanzeige" einzubauen. Mit einem ungepatchten movieplayer.cpp geht es bei mir mit meinem gepatchten Treiber.

Edit:
Ah - ich übersah den "AC3 Modus". Mangels Hardware habe ich das noch nie benutzt / probiert.

Eigentlich sollte sich der Treiber - abgesehen von den Watchdogs und dem verbesserten reset-Handling - gleich verhalten wie vorher, aber man weiß natürlich nie.
Zuletzt geändert von seife am Samstag 3. November 2007, 15:53, insgesamt 1-mal geändert.
bellum
bbs-Maintainer
Beiträge: 282
Registriert: Montag 23. Oktober 2006, 22:13

Beitrag von bellum »

seife hat geschrieben:Hm, mein Movieplayer-Problem lag an meinen unqualifizierten Versuchen, eine "Echtzeitanzeige" einzubauen. Mit einem ungepatchten movieplayer.cpp geht es bei mir mit meinem gepatchten Treiber.
Auch bei AC3 Ton? Mit normalem Ton geht er bei mir auch...
Gruß bellum
gerry6n
Neugieriger
Neugieriger
Beiträge: 6
Registriert: Donnerstag 24. Februar 2005, 14:42

Beitrag von gerry6n »

Hi,

kann mir jemand helfen. Ich würde gerne den verbesserten avia watchdog testen. Ist es möglich die .Diff datei in ein vorhandenes Image einzuspielen oder muss ich selber ein image erstellen.

Sorry bin absoluter noob im image bauen. Aber besitze auch eine Sagem DBOX2 die des öfteren mucken macht.

Besten Dank

MfG Gerrit
wolgade
Semiprofi
Semiprofi
Beiträge: 1313
Registriert: Donnerstag 2. Dezember 2004, 00:18

Beitrag von wolgade »

gerry6n hat geschrieben:Ist es möglich die .Diff datei in ein vorhandenes Image einzuspielen
Nein. Eine Diff enthält Quellcode bzw. Quellcodeänderungen.
seife
Developer
Beiträge: 4189
Registriert: Sonntag 2. November 2003, 12:36

Beitrag von seife »

gerry6n hat geschrieben:Hi,

kann mir jemand helfen. Ich würde gerne den verbesserten avia watchdog testen. Ist es möglich die .Diff datei in ein vorhandenes Image einzuspielen
Im Prinzip ja...
oder muss ich selber ein image erstellen.
Im Prinzip nein... :-)
Sorry bin absoluter noob im image bauen.
Dann wohl eher nicht...
Wenn die ersten Images da sind, die meinen gerade eingecheckten busybox-Patch drin haben, dann kannst du einfach die Module bauen (mit Patch) und dann nach /var/lib/modules kopieren.
Aber besitze auch eine Sagem DBOX2 die des öfteren mucken macht.
Was für Mucken macht sie denn?