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 #1

Updated by hidden over 5 years ago

  • Project changed from Public Support to 11
  • Status changed from New to In Progress
  • Topic set to ADTF::SamplePool
  • Customer set to AUDI
  • Department set to EFS

Hallo Axel,

per default macht ADTF eigentlich immer ein Copy, eine MSF_Reference muss gezielt eingestellt werden und im kompletten Setup berücksichtigt werden.
Siehe hierzu Pins for Filters
Oder habe ich deine Frage falsch verstanden ?

@Martin: Kannst du übernehmen ?

Actions #2

Updated by hidden over 5 years ago

  • Status changed from In Progress to Customer Feedback Required

@Flo: Wenn ich es richtig verstanden habe ist das kein Fall von MSF_Reference, sondern es wird schon ein vom Sample verwalteter Buffer verwendet, der aber nach dem Transmit nochmal verändert wird.

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 entwender 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.

Actions #3

Updated by hidden over 5 years ago

Vielen Dank.
Das sind sehr gute Infos.
Eine abschließende Frage habe ich noch zu dem Thema:
Hätte es einen positiven Einfluss, im OnPinEvent den MediaSample-Flag auf ReadOnly zu setzen?
Mit freundlichen Grüßen
Axel Aigner

Actions #4

Updated by hidden over 5 years ago

  • Status changed from Customer Feedback Required to In Progress
Actions #5

Updated by hidden over 5 years ago

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 #6

Updated by hidden over 5 years ago

  • Status changed from In Progress to Customer Feedback Required
Actions #7

Updated by hidden over 5 years ago

  • Project changed from 11 to Public Support
  • Subject changed from AW: [ADTF] Sample Queue to Free buffer and sample queue mechanism
  • Description updated (diff)
  • Status changed from Customer Feedback Required to To Be Closed
  • Private changed from Yes to No
  • Resolution set to Solved Issue
Actions #8

Updated by hidden over 5 years ago

  • Affected Products ADTF 2.14.2 added
Actions #9

Updated by hidden over 5 years ago

  • Status changed from To Be Closed to Closed
Actions

Also available in: Atom PDF