Have strict version check for OpenH264 to avoid ABI issues
authorSeppo Yli-Olli <seppo.yli-olli@iki.fi>
Tue, 21 Apr 2020 10:33:54 +0000 (13:33 +0300)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 23 Apr 2020 22:52:23 +0000 (22:52 +0000)
This fixes #1274 and no longer trusts soname alone

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1206>

ext/openh264/gstopenh264plugin.c

index 99c428ab7d0959e04791ce0e4b40f329edf9bdeb..10b0d4f071dab9ea71be26e07fe265bbc1591192 100644 (file)
 #endif
 
 #include <gst/gst.h>
+#include <wels/codec_api.h>
+#include <wels/codec_ver.h>
+#include <string.h>
 #include "gstopenh264dec.h"
 #include "gstopenh264enc.h"
 
 static gboolean
 plugin_init (GstPlugin * plugin)
 {
-  gst_element_register (plugin, "openh264dec", GST_RANK_MARGINAL,
-      GST_TYPE_OPENH264DEC);
-  gst_element_register (plugin, "openh264enc", GST_RANK_MARGINAL,
-      GST_TYPE_OPENH264ENC);
-
+  /* g_stCodecVersion is the version detected at build time as defined in the
+   * headers and WelsGetCodecVersion() is the version detected at runtime.
+   * This is a safeguard to avoid crashes since OpenH264  has been changing
+   * ABI without changing the SONAME.
+   */
+  OpenH264Version libver = WelsGetCodecVersion ();
+  if (memcmp (&libver, &g_stCodecVersion, sizeof (libver))) {
+    gst_element_register (plugin, "openh264dec", GST_RANK_MARGINAL,
+        GST_TYPE_OPENH264DEC);
+    gst_element_register (plugin, "openh264enc", GST_RANK_MARGINAL,
+        GST_TYPE_OPENH264ENC);
+  } else {
+    GST_ERROR ("Incorrect library version loaded, expecting %s", g_strCodecVer);
+  }
   return TRUE;
 }