webrtc_private: Checking caps before creating payload elements 40/261140/6
authorbackto.kim <backto.kim@samsung.com>
Mon, 12 Jul 2021 09:22:17 +0000 (18:22 +0900)
committerbackto.kim <backto.kim@samsung.com>
Tue, 13 Jul 2021 08:04:36 +0000 (17:04 +0900)
"media" in caps must be "audio" or "video" for normal communication.
However, some payload's media is "applications".
So let these elements skip when searching.

[Version] 0.2.41
[Issue Type] Improvement

Change-Id: I3cdbc33b61c3d337aa38115a04c7e7a93f789454

include/webrtc_private.h
packaging/capi-media-webrtc.spec
src/webrtc_private.c
src/webrtc_sink.c
src/webrtc_source.c

index 0e705a698f036d86f67872df24debee01c576679..74c3d3c29919d3d47c1146ef374974589591904e 100644 (file)
@@ -212,6 +212,9 @@ do { \
 #define DEFAULT_VIDEO_SINK_ELEMENT      "tizenwlsink"
 #define DEFAULT_AUDIO_SINK_ELEMENT      "pulsesink"
 
+#define GST_KLASS_NAME_PAYLOADER_RTP   "Codec/Payloader/Network/RTP"
+#define GST_KLASS_NAME_DEPAYLOADER_RTP "Codec/Depayloader/Network/RTP"
+
 #define MEDIA_TYPE_AUDIO_RAW            "audio/x-raw"
 #define MEDIA_TYPE_AUDIO_OPUS           "audio/x-opus"
 #define MEDIA_TYPE_AUDIO_VORBIS         "audio/x-vorbis"
index f105a60e6994477bb1b92651496d71cf70c994cd..044761abbadcef2a0df05bb3f501d65eb6e6b94d 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.2.40
+Version:    0.2.41
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 13d13757eacb0764100f63574d4ceb64b491dd86..e16fab526c9944e23c6f0e8ac6005d251559b363 100644 (file)
@@ -505,6 +505,49 @@ GstElement *_create_element(const char *factory_name, const char *name)
        return element;
 }
 
+static gboolean __is_acceptable_element(GstElementFactory *factory, GstPadDirection direction)
+{
+       const GList *templates = NULL;
+       GstStaticPadTemplate *temp = NULL;
+       GstCaps *caps = NULL;
+       GList *walk = NULL;
+       const GValue *value = NULL;
+       const gchar *media = NULL;
+
+       RET_VAL_IF(!factory, FALSE, "factory is NULL");
+
+       templates = gst_element_factory_get_static_pad_templates(factory);
+
+       for (walk = (GList *)templates; walk; walk = g_list_next(walk)) {
+               temp = walk->data;
+
+               if (temp->direction != direction)
+                       continue;
+
+               caps = gst_static_caps_get(&temp->static_caps);
+               value = gst_structure_get_value(gst_caps_get_structure(caps, 0), "media");
+
+               if (!value || GST_VALUE_HOLDS_LIST(value)) {
+                       gst_caps_unref(caps);
+                       return TRUE;
+               }
+
+               media = g_value_get_string(value);
+
+               if (g_strrstr(media, "audio") || g_strrstr(media, "video")) {
+                       gst_caps_unref(caps);
+                       return TRUE;
+               }
+
+               LOG_WARNING("[%s] not supported media [%s]", GST_OBJECT_NAME(factory), media);
+               gst_caps_unref(caps);
+       }
+
+       LOG_WARNING("not acceptable factory [%s]", GST_OBJECT_NAME(factory));
+
+       return FALSE;
+}
+
 static gboolean __element_filter(GstPluginFeature *feature, gpointer data)
 {
        element_info_s *elem_info = (element_info_s *)data;
@@ -522,6 +565,11 @@ static gboolean __element_filter(GstPluginFeature *feature, gpointer data)
        if (!elem_info || !g_strrstr(factory_klass, elem_info->klass_name))
                return FALSE;
 
+       if (g_strrstr(factory_klass, GST_KLASS_NAME_PAYLOADER_RTP) && !__is_acceptable_element(factory, GST_PAD_SRC))
+               return FALSE;
+       else if (g_strrstr(factory_klass, GST_KLASS_NAME_DEPAYLOADER_RTP) && !__is_acceptable_element(factory, GST_PAD_SINK))
+               return FALSE;
+
        if (GST_IS_CAPS(elem_info->src_caps))
                src_can_accept = gst_element_factory_can_src_any_caps(factory, elem_info->src_caps);
 
index 584dcb4c6e2dbdda18b09d6f1d5003ad607973bd..7a42cd3a1a24b05c4c9c1141b1b19836ee8e6fed 100644 (file)
@@ -19,8 +19,6 @@
 #include <gst/video/videooverlay.h>
 #include <media_packet_internal.h>
 
-#define GST_KLASS_NAME_DEPAYLOADER_RTP "Codec/Depayloader/Network/RTP"
-
 #define DEFAULT_ELEMENT_CAPSFILTER    "capsfilter"
 #define DEFAULT_ELEMENT_AUDIOCONVERT  "audioconvert"
 #define DEFAULT_ELEMENT_AUDIORESAMPLE "audioresample"
index 0534de2774980f2fd379f4c16818585f3874ba03..1a016d6d8c25d488f1d715969dfa233e1befa604 100644 (file)
@@ -25,7 +25,6 @@
 #define GST_KLASS_NAME_ENCODER_VIDEO   "Codec/Encoder/Video"
 #define GST_KLASS_NAME_DECODER_AUDIO   "Codec/Decoder/Audio"
 #define GST_KLASS_NAME_DECODER_VIDEO   "Codec/Decoder/Video"
-#define GST_KLASS_NAME_PAYLOADER_RTP   "Codec/Payloader/Network/RTP"
 #define GST_KLASS_NAME_CONVERTER_AUDIO "Filter/Converter/Audio"
 #define GST_KLASS_NAME_CONVERTER_VIDEO "Filter/Converter/Video"