Project

General

Profile

Actions

Support Request #11155

closed

Using dynamic properties in ADTF 3.x

Added by hidden almost 4 years ago. Updated over 3 years ago.

Status:
Closed
Priority:
Normal
Customer:
ACADEMIC
Department:
LINZ
Requester's Priority:
Normal
Support Level:
2nd Level
Resolution:
Solved Issue
Affected Products:
Platform:
Ubuntu 16.04 64bit
Topic:
ADTF::CE
FAQ Links:

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

Related to Public Support - Support Request #11244: Using dynamic properties in ADTF 3.xClosedActions
Related to Public Support - Support Request #11587: Dynamic property is not createdClosedActions
Related to Public Support - Support Request #11623: Generate dynamic propertiesClosedActions
Actions

Also available in: Atom PDF