Project

General

Profile

Actions

Support Request #4291

closed

Free buffer and sample queue mechanism

Added by hidden over 5 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
Normal
Customer:
AUDI
Department:
EFS
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
Solved Issue
Product Issue Numbers:
Affected Products:
Platform:
Topic:
ADTF::SamplePool
FAQ Links:

Description

Supportanfrage

Ich habe eine Frage zur Sample Queue in ADTF 2.

Hintergrund ist folgender:
Die Sample Queue scheint auf den ADTF Garbage Collector zu vertrauen, da nur eine Referenz auf ein empfangenes Sample gespeichert wird.
Es gibt den Fall, dass wir Third-Party ADTF Module in unserer Signalkette haben, welche nach dem Transmit eines Samples die FreeBuffer Methode aufrufen und somit die Referenz ungültig wird oder einem neuen Sample zugewiesen ist.

Jetzt zu meiner Frage:
Gibt es eine Methode, Den Garbage Collector anzuweisen den Samplespeicher nicht freizugeben, solange die Referenz auf dieses Sample noch in der SampleQueue gehalten wird?
Ziel ist ein Mechanismus, um eine robuste SampleQueue zu verwenden, ohne selbst einen Puffer mit Kopien der Samples anlegen zu müssen.

Lösung

Es gibt in ADTF keinen Garbage Kollektor! Media Samples werden über Reference Counting gehalten bzw. zerstört. Wenn ein Filter ein FreeBuffer auf ein Sample aufruft, dass er schon in den Filtergraphen verschickt hat, muss er selbst sicherstellen, dass entweder keiner mehr eine Referenz auf die Daten hält, oder diejenigen mit den veränderten Daten umgehen können (was insbesondere ein HD Recorder NICHT kann). Für diesen Use Case ist das also so gut wie unmöglich. Es ist ja nicht das Reference Counting das das Sample verändert, sondern der 3rdparty Filter, der davon ausgeht, dass alle nachgeschalteten Filter die Daten synchron verarbeiten.

Es macht auch überhaupt keinen Sinn ein Sample wiederzuverwenden, aber den Buffer freizugeben, da spart man sich ja nicht die Speicherallokation.

Wenn die Möglichkeit, den Filter so anzupassen, dass er für jedes Datum ein neues Sample anlegt und verschickt, nicht besteht, hilft leider nichts anderes als die Daten vor dem Einfügen in eine SampleQueue zu kopieren.

Eventuell ginge noch, dass man die OnPinEvent Methode des verarbeiteten Filters so lange verzögert, bis das Sample wieder aus der Queue geflogen ist und nicht mehr gebraucht wird. Aber das widerspricht wohl den Anforderungen an die Sample Queue.

Hätte es einen positiven Einfluss, im OnPinEvent den MediaSample-Flag auf ReadOnly zu setzen?

Nein weil dann FreeBuffer nicht mehr funktioniert und dadurch der 3rdparty Filter nicht mehr seine Arbeit machen kann. Ein nachgeschalteter Filter sollte Media Samples nicht modifizieren, es sei denn die Filterkette ist genau dafür ausgelegt.

Actions

Also available in: Atom PDF