From: backto.kim Date: Mon, 12 Jul 2021 09:22:17 +0000 (+0900) Subject: webrtc_private: Checking caps before creating payload elements X-Git-Tag: submit/tizen/20210729.023123~19 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0bb2042d1f2a9f5552b5bdb58a7145ec10f930a3;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_private: Checking caps before creating payload elements "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 --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 0e705a69..74c3d3c2 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -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" diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index f105a60e..044761ab 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -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 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 13d13757..e16fab52 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -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); diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index 584dcb4c..7a42cd3a 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -19,8 +19,6 @@ #include #include -#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" diff --git a/src/webrtc_source.c b/src/webrtc_source.c index 0534de27..1a016d6d 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -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"