Support Request #11155
closedUsing dynamic properties in ADTF 3.x
Description
Supportanfrage
ich würde gerne bei einem Streaming Source Filter dynamische Properties hinzufügen.
Im Detail: Man setzt im Configuration Editor z.B.: ein existierendes Property "Anzahl Felder" auf den Wert 3.
Danach sollten die Properties Feld0, Feld1, Feld2 dynamisch erzeugt werden, in Editor unter Properties angezeigt werden und Werte zugewiesen werden können.
Das Ganze sollte noch vor der eigentlichen Initalisierungsphase des Filters passieren.
Gibt es dazu eine Möglichkeit?
Lösung
Das wird ab ADTF 3.7.0 unterstützt
Um dynamische Elemente wie Pins und Properties zu erzeugen, wird in ADTF 3.x ein QML Filter Editor verwendet.
D.h. du musst in deinen Filter Code im Konstruktor ein Qml File relativ zur Plugindescription referenzieren (siehe SetEditor).
Dann bekommt dein Filter ein Kontextmenu Eintrag und ein Qml Code wird ausgeführt.
Hierzu gibt es eine API und Bsp, siehe https://support.digitalwerk.net/adtf/v3/adtf_html/page_filter_editor.html
Der Player nutzt z.b. diesen Mechanismus um Pins für die Streams aus dem adtfdat file anzulegen, das qml file findest du ebenso im delivery.
Eine Property Variable bietet dir quasi eine Referenz auf eine statische Variable an.
Das klappt natürlich bei dynamischen Properties nicht.
Du kannst direkt auf der Property arbeiten, wenn es keine statische ist.
Im folgenden Snippet hast du z.B. eine Property myFilename vom Typ cFilename erstellt:
// get all properties
object_ptr<const IProperties> pProperties;
RETURN_IF_FAILED(this->GetProperties(pProperties));
// get the specific property
adtf::base::ant::property<cFilename> oProp;
RETURN_IF_FAILED(pProperties->GetProperty("myFilename", oProp));
// do something, e.g. print
cString strValue;
oProp.GetValue()->ToString(adtf_string_intf(strValue));
LOG_INFO(strValue.GetPtr());
Alternativ kannst auch ausschließlich statt dem Snippet die elegantere template Funktion verwendet werden:
auto strFilename = adtf::base::get_property<cFilename>(*this, "myFilename");
Um Auch Sub-Properties auszulesen nimmt man am besten
auto strFilename = adtf::base::get_property_by_path<cFilename>(*this, "parent/child/myFilename");
Zur Vollständig:
Man kann property_variable<> auch für "dynamische" Properties verwenden, müssen dann aber an anderer Stelle registriert werden um nicht in der Plugin Description zu landen:
// zur Aufbewahrung ein Member
std::vector<std::unique_ptr<property_variable<tInt32>>> m_oProperties;
// dann in der Init oder sonst wo
for (tSize nPropertyIndex = 0; nPropertyIndex < 10; ++nPropertyIndex)
{
m_oProperties.push_back(std::make_unique<property_variable<tInt32>>());
RegisterPropertyVariable(("value" + std::to_string(nPropertyIndex)).c_str(), *m_oProperties.back());
}
Ich empfehle aber den vereinfachten template Weg zum Einlesen und einen QML Filter Editor zum Anlegen im CE.
Related issues