[Softhddevice] cant'render mixer: An invalid handle value was provided
-
-
Ich verwende, wenn möglich immer die Neuste Version, im Moment 1.7.33.
In 1.7.32 ist mit den Thread Prioritäten gespielt worden. Daran könnte es liegen.
Johns
-
Und wie mache ich das rückgängig? Ich kann im Source dazu nichts finden.
-
Gute Frage, ich habe nur geraten, weil dies mit meiner Vermutung der Ursache des Problems zusammen passt.
http://projects.vdr-developer.org/git/vdr.git
Ich kenne mich nicht mit den VDR Internas aus, aber wenn im Abspielpfad die Priorität gesenkt wird,
könnte es die beschriebenen Probleme auslösen.Wenn der Sectionhandler bremst, dann könnte dies hier sein:
CodecSectionHandler::cSectionHandler(cDevice *Device) -:cThread("section handler") +:cThread("section handler", true) {
Oder einfach um zu sehen ob es überhaupt daran liegt:
Code
Alles anzeigencThread::~cThread() @@ -248,12 +249,16 @@ void *cThread::StartThread(cThread *Thread) { Thread->childThreadId = ThreadId(); if (Thread->description) { - dsyslog("%s thread started (pid=%d, tid=%d)", Thread->description, getpid(), Thread->childThreadId); + dsyslog("%s thread started (pid=%d, tid=%d, prio=%s)", Thread->description, getpid(), Thread->childThreadId, Thread->lowPriority ? "low" : "high"); #ifdef PR_SET_NAME if (prctl(PR_SET_NAME, Thread->description, 0, 0, 0) < 0) esyslog("%s thread naming failed (pid=%d, tid=%d)", Thread->description, getpid(), Thread->childThreadId); #endif } + if (Thread->lowPriority) { + Thread->SetPriority(19); + Thread->SetIOPriority(7); + } Thread->Action(); if (Thread->description) dsyslog("%s thread ended (pid=%d, tid=%d)", Thread->description, getpid(), Thread->childThreadId);
Herausnehmen.
Johns
-
Also die Threadpriorität ist es nicht.
Klaus hat per Mail angedeutet, dass die Index-Datei nicht eingelesen wird. Ich habe mir jetzt überlegt, dass das Problem ja auch auftreten müsste, wenn ich eine andere Aufnahme schaue.
Wenn ich also eine Aufnahme auf Das Erste HD starte und eine alte Aufnahme von Das Erste HD schaue, kommen die Fehler nicht.
Nur wenn es die Aufnahme ist, die gerade aufgenommen wird.
Ich werde aber mit diesen Meldungen gequält (trotz deiner Patches):
CodeDez 22 18:28:25 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 18:28:25 archvdr vdr[4022]: video: 6:13:25.547 +16 1117 0/\ms 91+3 v-buf Dez 22 18:28:27 archvdr vdr[4022]: video: speed up video, droping frame Dez 22 18:28:27 archvdr vdr[4022]: video: 6:13:28.047 -49 1112 0/\ms 72+1 v-buf Dez 22 18:28:27 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 18:28:27 archvdr vdr[4022]: video: 6:13:28.147 +16 1109 0/\ms 69+3 v-buf Dez 22 18:28:30 archvdr vdr[4022]: video: speed up video, droping frame Dez 22 18:28:30 archvdr vdr[4022]: video: 6:13:30.947 -48 1092 0/\ms 69+1 v-buf Dez 22 18:28:30 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 18:28:30 archvdr vdr[4022]: video: 6:13:31.027 +14 1107 0/\ms 67+3 v-buf
Der Ton läuft aber flüssig.
EDIT: Jetzt hab ichs. Wenn ich nah am am "Ende" der Aufnahme bin, also nur etwa eine Minute hinter der Zeit bin. Kommen die Fehler. Wenn ich 10 min hinter der Zeit bin läuft es problemlos. Mal von den Meldungen im Code-Tag abgesehen.
-
Wenn es nur kurz vor Ende kommt, dann ist der Effekt auch erklärbar.
Ich habe mehrere eigene Videopuffer die "91+3 v-buf", wenn die leer sind,
verlangsame ich das Videobild (empty + dupping Meldungen). Ist aber
wieder alles gut gefüllt, merke ich das die Zeitstempel zuweit auseinander sind
und versuche diese wieder anzugleichen (dropping Meldungen). Und dann geht
es wieder von vorne los.Bei mir, komme ich garnicht so nahe ans Ende heran, weil bei mir die Aufnahme
dort abbricht wo das Ende beim Start der Wiedergabe war.Zu deinen anderen Fehler liegt es daran, daß die Videopuffer sehr schwanken "91+3 v-buf" und "72+1 v-buf".
Der bisherige Patch gleich nur +-1 aus, mußt die Werte nochmal um ein paar ms erhöhen.Was sind denn deine normalen Schwankungen? 16 - -49 = 65ms ist kein Vielfaches von 20ms.
Johns
-
Hier mal ein paar Meldungen bei Live-TV
CodeDez 22 19:19:05 archvdr vdr[4022]: video: 18:29:48.914 +12 385 0/\ms 53+3 v-buf Dez 22 19:19:55 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 19:19:55 archvdr vdr[4022]: video: 18:30:38.894 +5 286 0/\ms 48+3 v-buf Dez 22 19:20:45 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 19:20:45 archvdr vdr[4022]: video: 18:31:28.874 -2 346 0/\ms 47+3 v-buf Dez 22 19:21:35 archvdr vdr[4022]: video: 18:32:18.874 +10 279 0/\ms 49+3 v-buf Dez 22 19:22:25 archvdr vdr[4022]: video: slow down video, duping frame Dez 22 19:22:25 archvdr vdr[4022]: video: 18:33:08.854 +2 307 0/\ms 46+3 v-buf
beantwortet das deine Frage? Welchen Wert soll ich erhöhen? Von welchem der beiden Patches?
-
Da hast aber schon wieder bei "Live TV" Probleme.
Ich meinte den "greater_sync.diff" Patch.
Johns
-
Ja ist ja auch wieder 60Hz. Da der Fehler ja auch mit 50Hz war, fand' ich es wünschenswert wieder die native Auflösung zu fahren.
-
Nachdem im anderen Thread geklärt wurde, dass der Patch gar nicht funktioniert hat. Habe ich die "Anweisungen" befolgt und jetzt ist es wirklich besser.
Code
Alles anzeigenDez 22 23:46:37 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:46:37 archvdr vdr[587]: video: 6:14:46.227 +21 1114 0/\ms 82+3 v-buf Dez 22 23:47:27 archvdr vdr[587]: video: 6:15:36.227 +33 1143 0/\ms 72+3 v-buf Dez 22 23:47:46 archvdr vdr[587]: [598] changing pids of channel 169 from 401+401=2:402=deu@3:0:0 to 501+501=2:502=deu@3:0:0 Dez 22 23:48:17 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:48:17 archvdr vdr[587]: video: 6:16:26.207 +26 1107 0/\ms 79+3 v-buf Dez 22 23:48:57 archvdr vdr[587]: [598] changing caids of channel 562 from 0 to 9B2 Dez 22 23:49:07 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:49:07 archvdr vdr[587]: video: 6:17:16.187 +18 1103 0/\ms 78+3 v-buf Dez 22 23:49:30 archvdr vdr[587]: [740] playing '/srv/vdr/video/Es_ist_20_Uhr/2012-12-18.23.13.11-0.rec/00002.ts' Dez 22 23:49:57 archvdr vdr[587]: video: 6:18:06.187 +31 1132 0/\ms 81+3 v-buf Dez 22 23:50:42 archvdr vdr[587]: [softhddev] empty video packet 13 bytes Dez 22 23:50:47 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:50:47 archvdr vdr[587]: video: 6:18:56.167 +23 1128 0/\ms 80+3 v-buf Dez 22 23:51:37 archvdr vdr[587]: video: 6:19:46.167 +36 1125 0/\ms 76+3 v-buf Dez 22 23:52:27 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:52:27 archvdr vdr[587]: video: 6:20:36.147 +28 1121 0/\ms 75+3 v-buf Dez 22 23:53:17 archvdr vdr[587]: video: slow down video, duping frame Dez 22 23:53:17 archvdr vdr[587]: video: 6:21:26.127 +20 1117 0/\ms 69+3 v-buf
Vergleich Post 25Edit: Auserdem crasht der VDR beim Spulen in einer Aufnahme von Das Erste HD. Die Log wird mit der Fehlermeldung im Threadtitle geflutet.
Backtrace: http://pastebin.com/jEFdtk21
-
Edit: Der angehängt Patch (von Klaus) beseitigt das Problem. Muss mit patch -R angewendet werden.
-
Welches Problem? Den Crash oder wenn die Wiedergabe die Aufnahme einholt?
Ich würde den Patch mit den Flächen drin lassen.
Johns
-
Hier noch ein verbesserter Patch (wieder von Klaus)
Der Patch beseitigt das Stottern in Timeshift-Aufnahmen.
Im Moment habe ich softhddevice nur mit den Änderungen aus dem anderen Thread versehen.
Crashen tut er also immernoch. Das scheint von etwas ganz anderem ausgelöst zu werden.
-
Für den greater sync muß ich nochmal einen vernünftigen Patch erstellen.
Wenn es die Zeit erlaubt, mal 65 - -15 oder 66 - -15 testen.Den Patch von [Softhddevice] cant'render mixer: An invalid handle value was provided würde ich auch erstmal drin lassen.
Johns
-
So die extra Fläche ist nun im GIT. Im Gegensatz zu meinen Patch verwende ich nur 1 Fläche und nicht 2.
Und hier der aktuelle Patch für größeren Syncbereich:
Diff
Alles anzeigendiff --git a/video.c b/video.c index 981f5c8..fba9dd5 100644 --- a/video.c +++ b/video.c @@ -4600,7 +4600,7 @@ static void VaapiSyncDecoder(VaapiDecoder * decoder) goto out; } // both clocks are known - if (audio_clock + VideoAudioDelay <= video_clock + 15 * 90) { + if (audio_clock + VideoAudioDelay <= video_clock + 35 * 90) { goto out; } // out of sync: audio before video @@ -4644,12 +4644,12 @@ static void VaapiSyncDecoder(VaapiDecoder * decoder) ++decoder->FramesDuped; decoder->SyncCounter = 1; goto out; - } else if (video_clock > audio_clock + VideoAudioDelay + 45 * 90) { + } else if (video_clock > audio_clock + VideoAudioDelay + 65 * 90) { err = VaapiMessage(3, "video: slow down video, duping frame\n"); ++decoder->FramesDuped; decoder->SyncCounter = 1; goto out; - } else if (audio_clock + VideoAudioDelay > video_clock + 15 * 90 + if (audio_clock + VideoAudioDelay <= video_clock + 35 * 90) { goto out; } // out of sync: audio before video @@ -8052,12 +8052,12 @@ static void VdpauSyncDecoder(VdpauDecoder * decoder) ++decoder->FramesDuped; decoder->SyncCounter = 1; goto out; - } else if (video_clock > audio_clock + VideoAudioDelay + 45 * 90) { + } else if (video_clock > audio_clock + VideoAudioDelay + 65 * 90) { err = VdpauMessage(2, "video: slow down video, duping frame\n"); ++decoder->FramesDuped; decoder->SyncCounter = 1; goto out; - } else if (audio_clock + VideoAudioDelay > video_clock + 15 * 90 + } else if (audio_clock + VideoAudioDelay > video_clock + 35 * 90 && filled > 1 + 2 * decoder->Interlaced) { err = VdpauMessage(2, "video: speed up video, droping frame\n"); ++decoder->FramesDropped;
-
Zum Synchronisieren werden gelegentlich Wartepausen eingefügt, um die Darstellung eines Frames abzuwarten. Als Referenzwert wird eine Variable vom Typ 'struct timespec' (decoder->FrameTime) verwendet. Diese enthält ja zwei Werte, tv_sec und tv_nsec. Ist es möglich, daß es bei asynchronem Zugriff von Setzen und Lesen gelegentlich zum Verwenden von nicht zusammengehörenden Werten von tv_sec und tv_nsec kommt? Im Ergebnis wäre die Zeit sofort abgelaufen oder es würde 1sec gewartet werden.
Gruß
e9hack -
Der Videodecoder und Videoanzeiger ist nur ein Thread.
Das was von außen zugreift ist über einen Mutex gelockt.
Normal ist dies OSD oder Änderung der Ausgabeposition oder ...
Die FrameTime ist nur ein Schätzeisen, die wird wenn ntpd oder
Ähnliches läuft verändert.Die eigentliche Videosyncronisation passiert im VDPAU Videotreiber.
Ich habe:
undekodierte Videopuffer -> dekodierte Videoframe Puffer -> Treiber interne Videoframe Puffer.Johns
-
Gibts zu dem von mir geposteten Backtrace schon was neues?
Besonders auffällig sind Aufnahmen von Das Erste HD. Einfach mal ein bisschen drin rumspulen und schon knallts.
-
Irgendwo gab es einen patch für die libavcodec, der zumindest den abort bei ff_unused_picture unterdrückte. Ist eventuell bei den neuesten ffmpeg-Versionen drin, sonst muss man selber übersetzen. Jedenfalls hab ich seitdem keinen Absturz in der Ecke mehr gehabt. (Im softhddevice-code von codec.c steht nicht ohne Grund "can crash with bad packets")
-
Also ich bekomme diesen hier: [h264_vdpau @ 0x7f89c041cfb0] Internal error, picture buffer overflow
Und "out of surfaces".
Brauche nur 1 HD Aufnahme von heute mit schnellseten Vorlauf rennen lassen.Was komisch ist, eine alte Aufnahme hat kein Problem.
Edit: der Patch repariert es, nur gab es ohne dieser Funktion manchmal keine Aktuallisierung
bei schnellen Vorlauf oder Rücklauf.Johns
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!