Rückgabewert von cDevice::Poll wird ignoriert

  • Dies ist die Fortsetzung von
    Sinn und Unsinn von "emergency exit"


    Mich stört schon länger, daß DevicePoll(Poller, 10); in dvbplayer.c den Rückgabewert ignoriert.
    Ein Fehler ist es nicht, da ich schon einen Workaround verwende.


    Ich habe extrem große Ausgabepuffer von bis zu 8s.


    cDevice::Poll liefert false (busy/voll) zurück sobald meine Devicepuffer genügend gefüllt wird.
    Da aber der Rückgabewert nie überprüft wird, wird weiter cDevice::PlayVideo, ... aufgerufen.
    Und die Puffer komplett gefüllt.


    Ich habe mir dadurch geholfen, daß ich in meinem cDevice::PlayVideo cDevice::PlayAudio
    noch einmal prüfe ob für beides genug Daten vorhanden sind und dann weiter Pakete
    ablehne.


    Wenn ich mich richtig errinnere war das Problem, daß die Daten in den Puffern bei
    Sprüngen und Richtungswechseln zu Fehlern führte.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Dies ist die Fortsetzung von
    Sinn und Unsinn von "emergency exit"


    Mich stört schon länger, daß DevicePoll(Poller, 10); in dvbplayer.c den Rückgabewert ignoriert.
    Ein Fehler ist es nicht, da ich schon einen Workaround verwende.


    Ich würde das nicht als "Workaround" bezeichnen, sondern als die richtige Implementierung (siehe unten).
    Ein Ausgabedevice darf nicht zwingend voraussetzen, daß der Player jemals Poll() aufruft. Ein Player könnte ohne weiteres ständig PlayTs() aufrufen, und das Ausgabedevice liefert halt 0 zurück, wenn sein Puffer voll ist. Wenn der Player nicht zu "busy" werden will, dann kann er Poll aufrufen um Zeitscheiben an andere Threads abzugeben. Er ist aber in keinster Weise verpflichtet, den Rückgabewert des Poll-Aufrufes auszuwerten.


    Zitat


    Ich habe extrem große Ausgabepuffer von bis zu 8s.


    Wieso eigentlich? Hat das einen konkreten Grund, daß die Puffer dermaßen groß sind?


    Zitat


    cDevice::Poll liefert false (busy/voll) zurück sobald meine Devicepuffer genügend gefüllt wird.
    Da aber der Rückgabewert nie überprüft wird, wird weiter cDevice::PlayVideo, ... aufgerufen.
    Und die Puffer komplett gefüllt.


    Was ist denn daran falsch, die Puffer komplett gefüllt zu halten?


    Zitat


    Ich habe mir dadurch geholfen, daß ich in meinem cDevice::PlayVideo cDevice::PlayAudio
    noch einmal prüfe ob für beides genug Daten vorhanden sind und dann weiter Pakete
    ablehne.


    Das ist ja auch dein gutes Recht ;)


    Der Aufruf von DevicePoll(Poller, 10) in cDvbPlayer::Action() dient ja nur dazu, daß die Schleife nicht zu "busy" wird, und jederzeit weitermachen kann, sobald der Ausgabepuffer Daten annehmen kann. Aus der Sicht des Players müsste es sogar erlaubt sein, ständig PlayTs() aufzurufen ohne jemals einen Poll zu machen, denn PlayTs() darf nicht "blockieren".


    Zitat


    Wenn ich mich richtig errinnere war das Problem, daß die Daten in den Puffern bei
    Sprüngen und Richtungswechseln zu Fehlern führte.


    Das verstehe ich nicht ganz. Bei Sprüngen und Richtungswechseln werden doch über DeviceClear() die Puffer gelöscht!?


    Klaus


  • Wieso eigentlich? Hat das einen konkreten Grund, daß die Puffer dermaßen groß sind?


    Faulheit.


    Zwischen dem Audio und Video Stream gibt es Teilweise sehr große Zeitabstände.
    Die Zeitstempel für den Ton liegen teilweise bis 1.4s vor dem Bild.
    Habe mich gewundert, aber dvbsnoop zeigt ein ähnlches Bild.
    Dann brauche ich einen Tonpuffer von min 0.3s um Tonaussetzer zu vermeiden.


    Da die Puffer für den Worst Case 8 Kanal bzw. HDTV ausgelegt sind, kommen
    dann bei Stereo und SDTV noch größere Zeiten heraus.


    Zitat


    Was ist denn daran falsch, die Puffer komplett gefüllt zu halten?


    Es entstehen Belastungspeaks beim ersten Befüllen der Puffer.
    Was beim Start oder Sprüngen passiert, hier ist das System durch die
    Dekoder auch besonders belastet.


    Zitat


    Das verstehe ich nicht ganz. Bei Sprüngen und Richtungswechseln werden doch über DeviceClear() die Puffer gelöscht!?


    Es ist jetzt über ein Jahr her, daß ich diesen Teil geschrieben habe. Ich muß nochmal genau gucken was passiert.
    Ich glaube der Player meint er hätte die ~8s bereits gespielt und überspringt so die Daten die bereits im Puffer sind.
    Durch den Clear werden die ja verworfen. Aber dies ist jetzt nur rumraten, ich werde die Puffer noch etwas erhöhen
    und meine Softlimits entfernen.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • So ich habe mir das Problem noch einmal angeschaut.


    So wie es aussieht ist nur die Fortschrittsanzeige falsch.
    Wenn man vom normalen Abspielen auf schnellen Rücklauf umschaltet,
    es geht auch Zeitlupe rückwärts. Springt die Anzeige ein paar Sekunden
    zurück, dann läuft die Anzeige ein paar Schritte nach rechts um dann wieder
    zurückzuspringen und dann endlich richtig nach links zulaufen.


    Meine Puffer werden richtig gelöscht und das Ausgabedevice mit den richtigen
    Paketen gefüttert (Zeitstempel). Bis auf 1-2 noch alten Frames werden dann
    die neuen Frames mit den richtigen Zeitstempel angezeigt.


    Anbei ein Patch der das Softlimit im SoftHdDevice Plugin ausschaltet, bitte testen ob es Probleme
    beim Spulen usw. macht.


    Johns

    Dateien

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!