Поделиться через


Generic representation of a Media Topology, Serialize and De-serialize

Recently I came across a problem where various Media topologies in Windows were represented in different ways. For example, IMFMediaSession topology is represented using IMFTopology (https://msdn.microsoft.com/en-us/library/windows/desktop/ms705488(v=vs.85).aspx) whereas IMFSoureReader and IMFSinkWriter based topologies are represented as a chain of transforms.

I was part of a team that developed a generic library to represent all Media topologies - Topology Builder. The Topology builder library essentially does the following:

a. Helps transform any given Media topology into a Directed Graph.

b. Helps serialize this graph into a JSON string

c. Helps de-serialize the JSON back into a Directed Graph

Building the graph

The Directed Graph (with cycles) implementation was such that it was a collection of vertices. Vertex creation and deletions were managed by a memory pool. Each vertex had:

- a unique identifier

- list of neighbors

- a name attribute

- list of properties associated with the vertex. Each property in the vertex was a key-value pair of GUID and PROPVARIANT.

The public interface for building the directed graph exposed the following methods:

- ability to add a vertex

- ability to associate a set of properties to a vertex

- ability to add an edge from one vertex to another

- ability to serialize the graph into a JSON string (explained below)

Graph serialization

The serialized graph would be represented as a JSON string. We picked JSON to be the format for serialization since JSON is a well know format and there are standard libraries available for JSON writers and readers. We picked a C++ implementation for JSON writer four purpose. For an example of a sample topology representation in JSON, please look at the attached file in this blog.

JSON de-serialization

We used JsonObject present under Windows.Data.Json (https://msdn.microsoft.com/en-us/library/windows/apps/windows.data.json.jsonobject.parse.aspx) namespace in .NET for de-serializing the JSON into:

a. a class

b. a DGML representation for debugging (https://en.wikipedia.org/wiki/DGML)

c. a Database representation for statistical analysis

Here's an example view of a Topology JSON de-serialized into DGML:

The entire implementation was a combination of C++ and C# modules.

- Topology builder graph was a C++ implementation

- JSON serialization was a C++ implementation

- JSON de-serialization was a C# implementation

The was highly performing solution with respect to memory and execution time. The space and time complexity of building a Windows Capture Topology could vary between 6 KB (~1 ms) - 17 KB  (~3 ms) for building the graph and serializing it.

TopologyJSON.zip