> So das Dein Delta zu null wird.
Was impliziert, dass es sich hier nicht nur um einen reinen
Phasenakkumulator, sondern um eine Regelschleife handelt. D.h. die
Differenz aus dem PCR und dem eigenen Zähler muss irgendwie in das
Increment des Zählers zurückgeführt werden. Für das "Irgendwie" gibt es
je nach Anwendung beliebig komplizierte Methoden (aka Regelungstechnik,
Stichwort PID-Regler). Meistens reicht es aber aus, die Differenz mit
einem Faktor <<1 zu Multiplizieren und dann auf das Inkrement zu
addieren. Wenn es genauer sein soll, kann man die Differenzen noch mit
einem Faktor akkumulieren und den Wert aufs Inkrement geben.
Der Rest ist eigentlich ganz einfach. Der Phasenakku besteht aus n+m
Bits und ist wirklich nur ein langweiliger Akkumulator ohne Tricks, also
a=a+i.
n ist Anzahl der Bits, die du für deinen Vergleich der Timestamps
brauchst, MPEG war AFAIR 27bit oder so. m ist der Anteil "hinterm"
Komma, der es erlaubt, mit Bruchteilen der eigentlichen Zählerauflösung
zu rechnen. Also nur getarnte Fixkommarechnung... Wieviele Bits da man
braucht, hängt davon ab, wie genau man tracken will.
Insgesamt kommt dann folgender Pseudo-Algorithmus raus:
i(n+m-1 downto m)=1;
i(m-1 downto 0)=0;
Jeden 90kHz-Takt {
a=a+i;
mein_aktueller_pcr=a(n+m-1 downto m);
if (neuer externer_pcr vorhanden) {
diff=mein_aktueller_pcr-externer_pcr;
i=i+diff*faktor;
}
}
Bitbreiten und Vorzeichen bitte nach Bedarf reparieren ;)
Das Problem an dieser simplen Methode ist nur, dass der Faktor von der
Häufigkeit der externen Referenzen abhängt. Ändert sich das zu stark,
kann es sein, dass die Regelung nie hinterherkommt oder ins Schwingen
gerät.
Allerdings stolpern da auch "Grosse" drüber, habe schon genügend
Settop-Boxen gesehen, deren Ton unter ungünstigen Bedingungen anfängt,
zu jaulen. Fängt sich dann auch nur manchmal wieder :)