analytics: Add python api to get relation path

A new api `Mtd.relation_path()` is added to get relation chain
between two Mtd in RelationMeta.

Usage:
```
for i in mtd1.relation_path(mtd2, max_span=4, relation_type=...):
  pass
```

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8556>
This commit is contained in:
Santosh Mahto 2025-02-24 19:46:12 +05:30 committed by GStreamer Marge Bot
parent 476bd6109e
commit e68eb7bb23
3 changed files with 49 additions and 0 deletions

View File

@ -50,6 +50,9 @@ class Mtd(GstAnalytics.Mtd):
return _gi_gst_analytics.AnalyticsMtdDirectRelatedIterator(
sys.modules[__name__], self, relation, mtd_type)
def relation_path(self, mtd, max_span = 0, reltype = GstAnalytics.RelTypes.ANY):
return _gi_gst_analytics.AnalyticsMtdRelationPath(
sys.modules[__name__], self, mtd.get_id(), max_span, reltype);
__all__.append('Mtd')

View File

@ -219,7 +219,43 @@ _gst_analytics_relation_meta_iterator_next (_GstAnalyticsRelationMetaIterator *
return py_result;
}
static PyObject *
_gi_gst_analytics_mtd_relation_path (PyObject * self, PyObject * args)
{
PyObject *py_module = NULL;
PyObject *py_mtd;
guint id;
guint max_span;
GstAnalyticsRelTypes reltype;
GArray *relation_path;
GstAnalyticsMtd *mtd;
PyObject *pathList;
if (!PyArg_ParseTuple (args, "OOIII", &py_module, &py_mtd, &id, &max_span,
&reltype)) {
return NULL;
}
relation_path = g_array_new (FALSE, FALSE, sizeof (guint));
mtd = (GstAnalyticsMtd *) pygobject_get (py_mtd);
gst_analytics_relation_meta_exist (mtd->meta, mtd->id, id,
max_span, reltype, &relation_path);
pathList = PyList_New (relation_path->len);
for (guint i = 0; i < relation_path->len; i++) {
guint id = g_array_index (relation_path, guint, i);
PyList_SetItem (pathList, i, PyLong_FromUnsignedLong (id));
}
g_array_free (relation_path, TRUE);
return pathList;
}
static PyMethodDef _gi_gst_analytics_functions[] = {
{"AnalyticsMtdRelationPath",
(PyCFunction) _gi_gst_analytics_mtd_relation_path,
METH_VARARGS,
"Returns the relation path between two Mtd"},
{NULL, NULL, 0, NULL}
};

View File

@ -325,3 +325,13 @@ class TestAnalyticsRelationMetaIterator(TestCase):
assert(count == 2)
# Create a relation path as od_mtd -> cls_mtd -> trk_mtd -> seg_mtd
rmeta.set_relation(GstAnalytics.RelTypes.NONE, od_mtd.id, trk_mtd.id) # clear relation
rmeta.set_relation(GstAnalytics.RelTypes.RELATE_TO, cls_mtd.id, trk_mtd.id)
rmeta.set_relation(GstAnalytics.RelTypes.RELATE_TO, trk_mtd.id, seg_mtd.id)
count = 0
expected_rel_ids = [od_mtd.id, cls_mtd.id, trk_mtd.id, seg_mtd.id]
for i in od_mtd.relation_path(seg_mtd, max_span=4):
assert i == expected_rel_ids[count]
count += 1
assert(count == 4)