Support Request #12339
closedDoes ADTF delete my reference to a Sample (or is it still valid) ?
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.