Jump to content

TimeshiftPlus Plugin, erweiterte Timeshift Funktionalität (Ringpuffer)


erwin

Recommended Posts

Sind eigentlich schon ziemlich nach Priorität aufgezählt. Man muss das je nach Lust und Laune machen. Wenn man es erzwingt, bringt es auch nicht viel, jedenfalls nicht Seelenfrieden für sich selbst ;) .

 

Das mit den DataManager-Komponenten stelle ich mir dann so vor wie im neuen OSD-Skin von SnoopyDog.. Bild.. da müsste man dann nur die Tags austauschen.

Edited by CiNcH
Link to comment
Ebenfalls interessante DataManager-Komponenten, welche aber auf Grund variabler Datenraten spätestens ab Timeshift-Runde 2 schwer sind zu berechnen:

- wieviel ist zeitlich gepuffert im Format hh:mm:ss

- wo befindet man sich mit dem Read-Pointer zeitlich im Puffer

Dazu noch ein Gedanke von mir:

 

Reicht es nicht schon, einfach ständig die durchschnittliche Datenrate zu berechnen? Damit kann man dann auf die Puffergröße bzw. Völle abgebildet ca. berechnen, wieviele Sekunden A/V-Content sich im Puffer befinden. Macht man dann eine Positionierung im Puffer, kann man mit der durchschnittlichen Datenrate ermitteln, wo man sich zeitlich ungefähr befindet und dann mit einem Timer die Sekunden weiterzählen, bis dann wieder neu positioniert wird.

 

Die Genauigkeit wäre auf jeden Fall besser wie die DVBViewer-Berechnung, die ja keinen Puffer-Wrap kennt.

Edited by CiNcH
Link to comment
Dazu noch ein Gedanke von mir:

 

Reicht es nicht schon, einfach ständig die durchschnittliche Datenrate zu berechnen? Damit kann man dann auf die Puffergröße bzw. Völle abgebildet ca. berechnen, wieviele Sekunden A/V-Content sich im Puffer befinden. Macht man dann eine Positionierung im Puffer, kann man mit der durchschnittlichen Datenrate ermitteln, wo man sich zeitlich ungefähr befindet und dann mit einem Timer die Sekunden weiterzählen, bis dann wieder neu positioniert wird.

 

Die Genauigkeit wäre auf jeden Fall besser wie die DVBViewer-Berechnung, die ja keinen Puffer-Wrap kennt.

Eigentlich war mein erster Gedanke dazu, die Timestamps im Transportstream (PTS etc.) zu nutzen. Wirkt sich allerdings negativ auf die Performance aus da ja dann bei jedem Read auch der Inhalt geparst werden muss. Wenns zu schlecht ausfällt kommt dann evt. dein Gedanke ins Spiel.

 

erwin

Link to comment
Eigentlich war mein erster Gedanke dazu, die Timestamps im Transportstream (PTS etc.) zu nutzen.

Na klar! Dann wäre man natürlich sehr exakt. Vielleicht bekommt man die irgendwie vom DVBSource!? Man muss halt immer auch PTS/PCR am logischen Anfang und am logischen Ende kennen, um die Dauer zu ermitteln. Beim Spulen kann das natürlich eng werden, wenn im ~500ms Takt eine neue Position angefordert wird.

Edited by CiNcH
Link to comment
Das mit den DataManager-Komponenten stelle ich mir dann so vor wie im neuen OSD-Skin von SnoopyDog.. Bild.. da müsste man dann nur die Tags austauschen.

Da stellt sich für mich die Frage was ich nun konkret in den Datamanager schreibe. Mit den OSD Skins kenne ich mich nicht aus. Können die abgeleitete/berechnete Werte aus dem Datamanager verwenden oder nur direkt?

Schreibe ich nun die Dauer hinein oder die absolute Zeit des Begins oder Beides?

 

 

erwin

Link to comment

Im Mitgliederbereich gibt es den DVBViewer Spy (samt Sourcen soweit ich weiß). Damit kannst du dir die ganzen Datamanager-Tags visualisieren. Das MiniEPG OSD (myMiniEPG.xml) aus dem Bild oben verwendet für die 2 Timeshift-Zeiten Gesamtdauer und aktuelle Zeit die beiden folgenden Tags:

#TV.Timeshift.position
#TV.Timeshift.duration

Wie man solche erzeugt, dürftest du ja bereits wissen. Hast du ja bereits gemacht...

 

#TimeshiftPlus.memory.usage
#TimeshiftPlus.memory.ram
#TimeshiftPlus.memory.virtual
#TimeshiftPlus.memory.buffer.1
#TimeshiftPlus.memory.buffer.1.size
....

Edited by CiNcH
Link to comment

Ach, die Time-Bar habe ich noch vergessen. Da wird der DVBViewer-Tag..

#TV.Timeshift.percentage

..für verwendet (siehe myMiniEPG.xml von diesem OSD-Skin).

 

Stellst du da programmatisch also eigene Tags über den DataManager bereit, kann man die einfach in den OSD XML-Dateien austauschen. Wenn es nach meinen Gedanken geht, soll die Time-Bar nachher in Prozent angeben, wo man sich zwischen logischem Anfang und logischem Ende befindet, siehe Vorschlag von mir:

DataManager-Komponente:

- wo befindet sich der Read-Pointer prozentuell zwischen logischem Anfang und logischem Ende

Wenn das ein Wert zwischen 0 und 100 ist, dürfte das auch schön visualisiert werden, nehme ich an (im OSD XML-File ist die Time/Progress-Bar ein 'item' vom Typ 'tickprogress', müsste man sich mal im Spy anschauen, mit was genau der DVBViewer den Tag #TV.Timeshift.percentage befüllt).

 

"Duration" und "Position" aus dem vorigen Posting stimmen bei Verwendung des TimeshiftPlus-Plugins auch nicht mit denen aus dem DVBViewer überein. Deshalb Vorschlag von mir:

Ebenfalls interessante DataManager-Komponenten, welche aber auf Grund variabler Datenraten spätestens ab Timeshift-Runde 2 schwer sind zu berechnen:

- wieviel ist zeitlich gepuffert im Format hh:mm:ss

- wo befindet man sich mit dem Read-Pointer zeitlich im Puffer

 

So, das waren die 3 DataManager-Komponenten, die in der Timeshift-Anzeige von SnoopyDog's OSD-Skin verwendet werden. Kann man glaub auch gut auf dem Screenshot sehen, die beiden Zeitangaben und die Time-Bar. Die braucht man eben umgemünzt auf das TimeshiftPlus-Plugin. Hoffe, das war verständlich erklärt ;) .

Edited by CiNcH
Link to comment
Stellst du da programmatisch also eigene Tags über den DataManager bereit, kann man die einfach in den OSD XML-Dateien austauschen. Wenn es nach meinen Gedanken geht, soll die Time-Bar nachher in Prozent angeben, wo man sich zwischen logischem Anfang und logischem Ende befindet. Wenn das ein Wert zwischen 0 und 100 ist, dürfte das auch schön visualisiert werden, nehme ich an (im OSD XML-File ist die Time/Progress-Bar ein 'item' vom Typ 'tickprogress', müsste man sich mal im Spy anschauen, mit was genau der DVBViewer den Tag #TV.Timeshift.percentage befüllt).

Ich spamme hier mal eben den Thread zu ;) . Ich habe mir das nun mal angesehen:

timeshift_tags.jpg

 

Rot angedeutet ist das Mapping der Tags auf den OSD-Skin. Hier der "XML-Code" der Einbettung der Timeshift-Informationen, wie sie vom DVBViewer durch Tags zur Verfügung gestellt werden, in den Skin (Auszug aus myMiniEPG.xml) durch SnoopyDog, was in obigem Screenshot visualisiert zu sehen ist:

...
 <item>
   <description>Timeshift background</description>
   <type>Image</type>
   <id>204</id>
   <width>1920</width>
   <height>84</height>
   <texture>background_timeshift.png</texture>
 </item>
 <item>
   <description>Timeshift duration text</description>
   <type>Label</type>
   <id>1</id>
   <disabledcolor>60FFFFFF</disabledcolor>
   <x>1074</x>
   <y>32</y>
   <width>822</width>
   <height>43</height>
   <label>#TV.Timeshift.position	 #TV.Timeshift.duration</label>
   <font>font24b</font>
   <textcolor>FFE8E8E8</textcolor>
   <align>right</align>
 </item>
 <item>
   <description>Timeshift progress</description>
   <type>tickprogress</type>
   <id>2</id>
   <x>305</x>
   <y>2</y>
   <width>1615</width>
   <height>20</height>
   <label>#TV.Timeshift.percentage</label>
   <subcontrols>
...

Edited by CiNcH
Link to comment
Können die abgeleitete/berechnete Werte aus dem Datamanager verwenden oder nur direkt?

Obwohl die Frage nicht abschließend beantwortet ist, entnehme ich den <label>-Tags das es nur direkt geht. Wenn in diesen Tags Formeln oder Funktionsaufrufe gestattet wären würde einiges schon in der vorliegenden Version gehen.

 

Beispiel: aktuelle Wiedergabeposition ergibt sich aus "#aktuelle Uhrzeit - #...remain" (hab das genaue "remain-data" grad nicht parat). So zumindest mache ich es so bei der Anzeige der Bookmark Zeitstempel:

 

"Jump to Bookmark #2 @ 16:52:00"

 

(die euch vorliegende Version zeigt dies noch in relativen Zeiten an)

 

 

erwin

Link to comment
Wenn in diesen Tags Formeln oder Funktionsaufrufe gestattet wären würde einiges schon in der vorliegenden Version gehen.

Nein, das ist nicht möglich.

 

So zumindest mache ich es so bei der Anzeige der Bookmark Zeitstempel:

 

"Jump to Bookmark #2 @ 16:52:00"

Basieren die Bookmark-Zeitstempel bereits auf PCR/PTS? Oder ist das da die Tageszeit?

Edited by CiNcH
Link to comment
Basieren die Bookmark-Zeitstempel bereits auf PCR/PTS? Oder ist das da die Tageszeit?

Wäre möglich

 

"#aktuelle Uhrzeit - #...remain" = Tageszeit - #... remain

 

Wie der DVBV das remain ermittelt weiss ich nicht

Link to comment

Und das 'remain' stimmt auch nach Puffer-Wrap noch? Dann gehe ich davon aus, dass da auch die PCR/PTS für verwendet werden. Denn wenn da irgendwie die Duration mit ins Spiel kommen würde, wäre das Ergebnis spätestens nach einem Puffer-Wrap falsch, weil die Duration im Ring-Puffer dann mehr oder weniger konstant bleibt, die DVBViewer-Timeshift-Duration aber weiter hochzählt.

 

Ich hätte halt gedacht, das remain errechnet sich aus position und duration. Beide dürften aber nach Puffer-Wrap nicht mehr stimmen. remain kann doch nur dann für DVBViewer-Timeshift und TimeshiftPlus funktionieren, wenn PCR/PTS vor und nach einem Sprung verglichen werden.

Edited by CiNcH
Link to comment

OK, Bookmarks habe ich nicht wirklich genutzt, deshalb ist mir das nicht aufgefallen. Die sollten natürlich nicht um Minuten daneben liegen, was wohl passieren würde, wenn man mit durchschnittlichen Bitraten rechnen würde (Minuten ist jetzt vielleicht übertrieben). Vielleicht könnte man es über eine Art Index lösen. Ich zitiere einmal Griga:

Angenommen, es wird jede PCR-Sekunde eine Dateiposition gespeichert, für die 5 Bytes reichen (bis 1024 GB). Für einen Zwei-Stunden-Film wären das 36000 Bytes.

Müsste man für den Ringbuffer-Fall halt noch fertig denken. Bin mir noch nicht ganz sicher, ob das da angemessen ist bzw. überhaupt eine mögliche Lösung darstellt.

Edited by CiNcH
Link to comment

Das mit dem Index etwas weiter gedacht:

 

Man kann nach Wrap natürlich nicht einfach hinten jede Sekunde eine Position wegnehmen. Dann würde man davon ausehen, dass die Gesamtzeit im Ringbuffer konstant ist, was sie aber auf Grund variabler Datenraten nicht ist. Wenn das so wäre, wäre es kein Problem Positionen und Zeiten zu errechnen und man hätte auch das Problem der kollidierenden Read- und Write-Pointer nicht ;) .

 

Ringpuffer-Index-Fall:

- jede Sekunde wird im Index eine neue Position (Speicherstelle) gespeichert

- es wird immer geprüft, ob die älteste Position, die im Index festgehalten ist, überschrieben wurde (nach Puffer-Wrap wird das natürlich ständig der Fall sein ;) ), wenn ja, wird diese Sekunde, welche durch die Position repräsentiert wird, also eigentlich die Position, entfernt

 

Hört sich für mich nicht so schwer an und ist sehr effektiv. Jedenfalls einfacher als PCR zu parsen, wo man zusätzlich noch Dinge wie unmotivierte PCR-Sprünge oder Wraps behandeln muss. Habe ich was vergessen oder übersehen? Jumps bzw. Postionierungen sollte man so perfekt auflösen können, diverse Zeiten ergeben sich durch den Index und ein bisschen einfache Rechnerei.

Edited by CiNcH
Link to comment

Du wirsd lachen

 

- jede Sekunde wird im Index eine neue Position (Speicherstelle) gespeichert

 

ist sogar schon eingebaut. Dann kam die Weihnachtspause. Muss mal in mich gehen was ich damit genau vor hatte. Ging aber als 'mal sehen was es bringt' in diese Richtung.

 

Bezüglich 'nicht so schwer' will ich jetzt nicht Lars_MQ zitieren, aber der Teufel steckt im Detail und man muss das Gesamtsystem betrachten.

 

Momentan probiere ich mehrere Varianten durch PCR/PTS-Parsing; Einfügen von TS_Paketen mit Spezial-PID die Zeitinformationen tragen etwa jede Sekunden und eben auch diese Indexverfahren

 

erwin

Edited by erwin
Link to comment
Habe ich was bei meinen Überlegungen übersehen?

Nur mal eins von diesen Details die einem schnell die Lust an der vermeindlich schnellen Umsetzung scheinbar einfacher Lösungen nehmen:

 

Falls DVBV 10MB Blöcke schreiben sollte (macht er nicht, aber eine Garantie dass es so bleibt gibst auch nicht) dann sind dass bei enem 8MBit Stream ca 10 Sekunden Content. Wie sieht der Sekunden-Index aus: Alle 10 Sekunden gibts einen neuen Eintrag dazwischen 9 x immer derselbe Eintrag. Nicht sehr nützlich.

 

erwin

Link to comment
Das mit den DataManager-Komponenten stelle ich mir dann so vor wie im neuen OSD-Skin von SnoopyDog.. Bild.. da müsste man dann nur die Tags austauschen.

Schön wärs. Geht aber leider nicht. Der DVBV akzeptiert nur ein Subset der hauseigenen Tags. Versuch mal ein TimeshiftPlus-Tag einzubauen. Buchstaben/Zahlensalat. Bug oder nie für User-Tags geplant?

 

erwin

Link to comment

Das funktioniert wunderbar, selbst die default skin nutzt das, siehe die scripte stoprec, startrec, usw... :) Dran denken, das ist unicode, genauer BStr COM Strings.

Link to comment

Also mal in der default.skin/duration.xml die originären Zeitdaten durch #TimshiftPlus.position ersetzt:

 

post-2941-1265702020_thumb.png

 

Sieht unter Spy so aus:

 

post-2941-1265702005_thumb.png

 

Sollte also kein Unicode-Problem sein

 

erwin

Edited by erwin
Link to comment

Naja was soll ich sagen, es wird von allen möglichen Sachen fröhlich genutzt. Ich weiss nicht wie die korrekt auf der C seite erzeugt werden müssen, es sind wie gesagt COM Strings. Das sieht mir aus als würde wild durch einen speicherbereich gelesen...

Link to comment

Solche Sachen wie

 

osd.showInfoinTVpic Datamanager.Value("#TimeshiftPlus.position"),1000

 

in der Command.vbs funktionieren allerdings tadellos

 

Und noch was: der obige Screenshot ist natürlich eine Momentaufnahme. Irgenwas wie eine hochlaufende Sekunde ist in diesem Buchstabensalat durchaus erkennbar.

 

erwin

Link to comment

Solche Sachen wie

 

osd.showInfoinTVpic Datamanager.Value("#TimeshiftPlus.position"),1000

 

in der Command.vbs funktionieren allerdings tadellos

 

Und noch was: der obige Screenshot ist natürlich eine Momentaufnahme. Irgenwas wie eine hochlaufende Sekunde ist in diesem Buchstabensalat durchaus erkennbar.

 

EDIT: #TimeshiftPlus.position existiert erst nachdem neu positioniert wurde. Beim ersten Aufruf also noch nicht. Vielleicht das die Ursache?

 

erwin

Link to comment

@Lars_MQ

So ich habs.

 

#TimeshiftPlus.position

 

offenbar wird das Tag nicht als ganzes gelesen sondern nur bis

 

#Time

 

nachfolgende Zeichen werden vom DVBV dann als Formatierungskenner verwendet:

 

s z.B für die Sekunden

 

Stellt sich die Frage Absicht? Wenn ja, was sind dann _verbotene_ Tagnamen.

 

erwin

Link to comment
Nur #time , daran hab ich nicht gedacht. :) Am besten immer etwas davorsetzen wie #TV. oder ähnliches...

OK. #TimeshiftPlus.* wird zu Plugin.TimeshiftPlus.* (Ich hoffe es gibt keine Längenprobleme)

 

erwin

Link to comment
  • 1 month later...

Ein kleiner Zwischenbericht zum aktuellem Stand.

 

Der Einbau einer eigenen Clock hat TimeshiftPlus gut getan, zieht jedoch auch eine Fülle von Anpassungen nach sich. Das neue Release lässt deshalb noch ein wenig auf sich warten. Auch das der DVBV vom Beta zum RTM wird, muss erstmal abgewartet werden, denn bisher hat jedes neue Beta Verbesserungenn gebracht die auch in TimeshiftPlus zu Anpassungsarbeiten führen (z.B. das "SpingSpulen"). Hier mal ein OSD (MiniEPG) basierend auf den neuen TimshiftPlus-Datamanagertags:

 

#Plugin.TimeshiftPlus.starttime - der älteste zurückholbare TimeshiftPlus-Eintrag

 

#Plugin.TimeshiftPlus.freepercentage - % des noch freien Ringbuffers. Geht in der ersten Runde gegen Null, dann fängt auch #Plugin.TimeshiftPlus.startime an zu ticken.

 

#Plugin.TimeshiftPlus.position - die Zeit der aktuellen Wiedergabe oder "live".

 

#Plugin.TimeshiftPlus.percentage - die prozentuale Position der aktuellen Wiedergabe bezogen auf die Kapazität

des Ringbuffers. Da diese konstant ist bleibt diese Position (bis auf Schwankungen der Datenrate) auch nach der

Einstellung fixiert - im Gegensatz zum originären Timeshiftslider.

 

#Plugin.TimeshiftPlus.logo - der TimmeshiftPlus On/Off - Indikator.

 

#Plugin.TimeshiftPlus.channelname - (hier nicht sichtbar) der geschaute Kanal wenn dieser vom getuneten

abweicht (Kanalübergreifendes Timeshift)

 

post-2941-1268287301_thumb.png

 

Dem TimeshiftPlus-Ringbuffer liegt hier ein 8GB USB-Stick-Backstore zu Grunde.

 

Wenn noch Ideen oder Anregungenn vorliegen, dann her damit.

 

erwin

Link to comment

Mal eine Frage zur Fehlereingrenzung.

 

Nutzt Timeshift Plus C/C++?

 

Ich hab seit kurzem nämlich häufig Abstürze beim Senderwechsel mit entsprechender Fehlermeldung. Und DVBV selbst nutzt laut Lars MQ kein C Runtime...

Edited by Klassikfan
Link to comment
Nutzt Timeshift Plus C/C++?

Ja!

 

Ich hab seit kurzem nämlich häufig Abstürze beim Senderwechsel mit entsprechender Fehlermeldung.

"seit kurzem" heisst, es hat sich was geändert. Vielleicht kannst Du es ja eingrenzen. Andere TimeshiftPlus Optionen? Am DVBV was geändert (Version/Einstellungen) ? ...

 

erwin

Link to comment
  • 6 months later...

Hi Erwin!

Ich habe leider schon lange nichts mehr von deinem sehr interessanten Projekt gelesen. Arbeitest du derzeit noch daran? Gibt es eigentlich Überlegungen das Ganze irgendwann in den DVBViewer zu integrieren? Wäre eigentlich eine schöne Sache! Mehr als 3 oder 4GB will ich bestimmt nicht spulen ;-)

 

Grüsse

Michael

Edited by Diablo_Vmax1200
Link to comment

Hab's erst jetzt gelesen. 'Tschultigung für die späte Antwort.

 

Arbeitest du derzeit noch daran?

Momentan: Jein! Also eher NaJa.

Es hat sich eigentlich eine Menge getan. Meine Vorabankündigungen kann ja man hier im Forum nachlesen.

Leider bringe ich es z.Z nicht Fertig. Ich bin z.Z. ziemlich "durch den Wind" - Mutter im Krankenaus!

 

Gibt es eigentlich Überlegungen das Ganze irgendwann in den DVBViewer zu integrieren?

Ich gehöre nicht zum DVBV Entwicklerteam(-chen) (forsche hier mal ein wenig nach ,wer DIE sind). Ich habe nur ein Plugin programmmiert. Zu dem, was die DVBV-Mannen vorhaben kann ich nichts sagen.

 

 

mfg erwin

Link to comment
  • 3 weeks later...

Hallo Erwin,

 

jetzt habe ich es erst gelesen, dachte ich hätte das Thema aboniert...

 

Dass privates stets Vorrang hat ist ja selbstverständlich! Dann wünsche ich dir dass alles wieder in geregelte Bahnen kommt!

 

Es ist auch schön zu hören dass du das Thema nicht ganz zu Seite gelegt hast. Es ist doch eine tolle Funktion! Dass du nicht zum Entwickler Team gehörst ist mir bewusst, aber es stünde ja auch nichts dagegen, dass das "Kernteam" in Absprache mit dir dein Stück Code in eine Version einfließen lassen würde. Denn der VDR und Mediaportal haben Timeshift als Ringspeicher warum sollte der Viewer das denn nicht auch bieten?

 

Grüsse

Michael

Link to comment
  • 2 months later...

Hallo,

 

gerade wieder passiert:

 

ich habe auf Sky Cinema Ice Age 3 geschaut, zwischendurch mal auf Pause gedrückt,

Punkt 21:45 Uhr kam das Sky Magazin, Timeshift bricht ab und zeigt mir wieder Live TV.

sprich, den Film konnte ich nicht zu Ende schauen :-(

 

Klar, ich kann den jetzt auf Sky Cinema +1 weiter schauen aber dass Timeshift abbricht

ist ja nicht im Sinne des Erfinders.

 

Passiert nur mit diesem Plugin. Plain Timeshift ohne das Plugin nimmt solange auf bis

die Platte voll ist ;)

 

Gibt's zu dem Plugin hier vll. den Source? Dann könnten wir da evtl. weiter dran

entwickeln solange Erwin nicht am Start ist.

 

Könnte es sein, daß der Film als AC3 5.1 übertragen wurde, Sky Magazin aber als

Stereo MPEG2 übertragen wird, und deshalb der Abbruch statt fand?

Edited by test
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...