Project

General

Profile

Actions

Support Request #12339

closed

Does ADTF delete my reference to a Sample (or is it still valid) ?

Added by hidden over 3 years ago. Updated over 2 years ago.

Status:
Closed
Priority:
Normal
Customer:
AUDI
Department:
EF
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
No Customer Feedback
Product Issue Numbers:
Affected Products:
Platform:
Windows 10 64bit
Topic:
ADTF::Common
FAQ Links:

Description

Supportanfrage

Ich lese in der Process() Methode eines Filters die MediaSamples des InputPins wie folgt aus:

object_ptr<const ISample> pInSample;
while (IS_OK(pReader->GetNextSample(pInSample)))
{...}

Der Filter soll einige der MediaSamples auch über das Ende der Process() hinaus halten, damit später auf den MediaSample-Buffer zugegriffen werden kann.
Nun frage ich mich, wie ADTF die Speicherverwaltung realisiert bzw. ob ich Gefahr laufe, dass ADTF das Sample frei geben kann, obwohl ich es noch brauche.
Ich gehe davon aus, dass bei pReader->GetNextSample(pInSample) keine Daten kopiert werden, sondern lediglich der Pointer eines bestehenden Samples ausgegeben wird. Wenn ich mir jetzt diesen Pointer / dieses Sample speichere, kann ich dann sicher sein, dass es nicht überschrieben wird, solange ich es halte?

Lösung

Die ucom object pointer (adtf::ucom::object_ptr<>) sind shared pointer. Das heißt, solange du einen hältst, bleibt auch das referenzierte Objekt am Leben.
Und die Streaming Architektur ist so ausgelegt, dass Samples die einmal geschrieben wurden, danach nicht mehr verändert werden. Das heist ein Quell-Filter erzeugt für jedes Datum auch ein neues Sample. Das heißt ein Sample dass du mal bekommen hast, verändert sich nicht mehr und du kannst es solange über den object_ptr aufheben wie du willst.

Actions

Also available in: Atom PDF