More of unusual stuff: mix of Media Foundation pipeline, with a custom media source specifically, with GStreamer pipeline. It appears that with all bulkiness of GStreamer runtime, the framework remains open for integrations and flexible for a mix of pre-built and custom components.
PoC push source plugin on top of Media Foundation media session and media source is reasonably small, and is mixed in pipeline in a pretty straightforward way.
...
auto const Registry = gst_registry_get();
std::string PluginDirectory = "D:\\gstreamer\\1.18\\1.0\\msvc_x86_64\\lib\\gstreamer-1.0";
for(auto&& FileName: { "gstopenh264.dll", "gstopengl.dll" })
{
CHAR Path[MAX_PATH];
PathCombineA(Path, PluginDirectory.c_str(), FileName);
G::Error Error;
GstPlugin* Plugin = gst_plugin_load_file(Path, &Error);
assert(!Error);
assert(Plugin);
auto const Result = gst_registry_add_plugin(Registry, Plugin);
assert(Result);
}
GST_PLUGIN_STATIC_REGISTER(customsrc);
#pragma endregion
{
G::Error Error;
Gst::Element const Pipeline { gst_parse_launch("customsrc ! openh264dec ! glimagesink", &Error) };
assert(!Error);
gst_element_set_state(Pipeline.get(), GST_STATE_PLAYING);
...
As codebase and plugin development environment GStreamer is closer to DirectShow rather than Media Foundation: there is a structure of base classes for reuse, implemented, however, in C (not even C++) with, respectively, a mere amount of chaos inside.
Still, GStreamer looks cool overall and over years accumulated a bunch of useful plugins. Long list includes multiple integrations and implementation of MPEG stuff of sorts, and RTP related pieces in particular.