Fix resource leak when get caps from pad 06/267906/11
authorbackto.kim <backto.kim@samsung.com>
Mon, 13 Dec 2021 06:47:33 +0000 (15:47 +0900)
committerbackto.kim <backto.kim@samsung.com>
Mon, 27 Dec 2021 04:31:52 +0000 (13:31 +0900)
[Version] 0.3.30
[Issue Type] Resource leak

Change-Id: I1123877111921b88c898299cc2a9ef1f7ae3dec1

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

index 6e9a9b4490763c3e87c391e6718755f4c7a90956..67c5fd64da5991389a573325f93d645e7b04cf9e 100644 (file)
@@ -703,6 +703,7 @@ int _get_filesrc_looping(webrtc_s *webrtc, unsigned int source_id, bool *looping
 int _remove_filesrc_pad_block_probe(webrtc_s *webrtc);
 
 gchar * _get_media_type_from_pad(GstPad *pad);
+gchar * _get_mime_type_from_pad(GstPad *pad);
 bool _is_supported_media_type(const char *media_type);
 bool _is_audio_media_type(const char *media_type);
 
index a4e4faa002f2b50f69f319ff6ef231182c2169fc..3621e85cd0cc3bb709d07f0118d85ddfcd54f33f 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.29
+Version:    0.3.30
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 8df8e29585f200735a779599cedbb0525f7c9d31..a0cc53284cddad777bef99f1e0a5780b889cba2c 100644 (file)
@@ -1252,6 +1252,25 @@ gchar * _get_media_type_from_pad(GstPad *pad)
 
        return media_type;
 }
+
+gchar * _get_mime_type_from_pad(GstPad *pad)
+{
+       GstCaps *caps = NULL;
+       gchar *mime_type = NULL;
+
+       RET_VAL_IF(pad == NULL, NULL, "pad is NULL");
+
+       caps = gst_pad_get_current_caps(pad);
+       RET_VAL_IF(caps == NULL, NULL, "caps is NULL");
+
+       mime_type = g_strdup(gst_structure_get_name(gst_caps_get_structure(caps, 0)));
+       LOG_DEBUG("mime_type [%s]", mime_type);
+
+       gst_caps_unref(caps);
+
+       return mime_type;
+}
+
 //LCOV_EXCL_STOP
 
 bool _is_supported_media_type(const char *media_type)
index dd9b411a1d5fe2888bb82479cc7f876e3182124e..46c28c2db3006a4bd3d62ee01c09b9d43887cb04 100644 (file)
@@ -361,7 +361,7 @@ static void __decodebin_pad_added_cb(GstElement *decodebin, GstPad *new_pad, gpo
 {
        int ret = WEBRTC_ERROR_NONE;
        webrtc_s *webrtc = (webrtc_s *)user_data;
-       const gchar *media_type;
+       gchar *media_type;
        webrtc_gst_slot_s *sink;
 
        RET_IF(webrtc == NULL, "webrtc is NULL");
@@ -369,15 +369,21 @@ static void __decodebin_pad_added_cb(GstElement *decodebin, GstPad *new_pad, gpo
        if (GST_PAD_DIRECTION(new_pad) != GST_PAD_SRC)
                return;
 
-       media_type = gst_structure_get_name(gst_caps_get_structure(gst_pad_get_current_caps(new_pad), 0));
+       media_type = _get_mime_type_from_pad(new_pad);
 
-       if(!_is_supported_media_type(media_type))
+       if(!_is_supported_media_type(media_type)) {
+               g_free(media_type);
                return;
+       }
 
        LOG_INFO("decodebin[%p, name:%s] new_pad[%s] media_type[%s]", decodebin, GST_ELEMENT_NAME(decodebin), GST_PAD_NAME(new_pad), media_type);
 
        sink = __find_sink_slot(webrtc, GST_ELEMENT_NAME(decodebin));
-       RET_IF(sink == NULL, "could not find an item by [%s] in sink slots", GST_ELEMENT_NAME(decodebin));
+       if (!sink) {
+               g_free(media_type);
+               LOG_ERROR("could not find an item by [%s] in sink slots", GST_ELEMENT_NAME(decodebin));
+               return;
+       }
 
        if (_is_audio_media_type(media_type)) {
                sink->media_types |= MEDIA_TYPE_AUDIO;
@@ -394,6 +400,8 @@ static void __decodebin_pad_added_cb(GstElement *decodebin, GstPad *new_pad, gpo
                _post_error_cb_in_idle(webrtc, ret);
        }
 
+       g_free(media_type);
+
        GENERATE_DOT(webrtc, webrtc->gst.pipeline, "%s.%s", GST_ELEMENT_NAME(webrtc->gst.pipeline), GST_ELEMENT_NAME(decodebin));
 }
 
index ccd4e5ef746c72ebfc916a4a36565e421be48409..01e140f12768e7d9fa502b5e6b02f144793b6fd0 100644 (file)
@@ -2083,7 +2083,7 @@ static void __filesrc_pipeline_decodebin_pad_added_cb(GstElement *element, GstPa
 {
        int ret = WEBRTC_ERROR_NONE;
        webrtc_gst_slot_s *source = data;
-       const gchar *media_type = NULL;
+       gchar *media_type = NULL;
        bool is_audio;
        int av_idx;
        GstElement *queue = NULL;
@@ -2091,17 +2091,21 @@ static void __filesrc_pipeline_decodebin_pad_added_cb(GstElement *element, GstPa
        RET_IF(source == NULL, "source is NULL");
        RET_IF(source->filesrc_pipeline == NULL, "filesrc_pipeline is NULL");
 
-       media_type = gst_structure_get_name(gst_caps_get_structure(gst_pad_get_current_caps(pad), 0));
+       media_type = _get_mime_type_from_pad(pad);
        RET_IF(media_type == NULL, "media_type is NULL");
 
-       if(!_is_supported_media_type(media_type))
+       if(!_is_supported_media_type(media_type)) {
+               g_free(media_type);
                return;
+       }
 
        LOG_INFO("[%s] new_pad[%s] media_type[%s]", GST_ELEMENT_NAME(element), GST_PAD_NAME(pad), media_type);
 
        is_audio = _is_audio_media_type(media_type);
        av_idx = GET_AV_IDX(is_audio);
 
+       g_free(media_type);
+
        if (source->av[av_idx].src_pad_probe_id > 0) {
                LOG_INFO("Pipeline already built");
                ret = __link_decodebin_with_queue(pad, source, is_audio);
@@ -4023,18 +4027,20 @@ static void __loopback_decodebin_pad_added_cb(GstElement *decodebin, GstPad *new
 {
        int ret = WEBRTC_ERROR_NONE;
        webrtc_gst_slot_s *source = (webrtc_gst_slot_s *)user_data;
-       const gchar *media_type;
+       gchar *media_type;
 
        RET_IF(source == NULL, "source is NULL");
 
        if (GST_PAD_DIRECTION(new_pad) != GST_PAD_SRC)
                return;
 
-       media_type = gst_structure_get_name(gst_caps_get_structure(gst_pad_get_current_caps(new_pad), 0));
+       media_type = _get_mime_type_from_pad(new_pad);
        LOG_INFO("source_id[%u], media_type[%s], new_pad[%s]", source->id, media_type, GST_PAD_NAME(new_pad));
 
-       if(!_is_supported_media_type(media_type))
+       if(!_is_supported_media_type(media_type)) {
+               g_free(media_type);
                return;
+       }
 
        if (_is_audio_media_type(media_type)) {
                ret = __build_loopback_audiosink(source, decodebin);
@@ -4054,6 +4060,8 @@ static void __loopback_decodebin_pad_added_cb(GstElement *decodebin, GstPad *new
 
        }
 
+       g_free(media_type);
+
        if (ret != WEBRTC_ERROR_NONE) {
                LOG_ERROR("failed to build loopback rendering sink, ret[0x%x]", ret);
                _post_error_cb_in_idle(source->webrtc, ret);
index d9a49f716d385dc43961e051f469dcdc98e9a701..93fdf21c6fcd6312bf90d2e110a569fd28b0bb4d 100644 (file)
@@ -2898,7 +2898,7 @@ static void __demux_pad_added_cb(GstElement *object, GstPad *pad, gpointer data)
 {
        media_packet_source_s *packet_source = (media_packet_source_s *)data;
        GstPad *sinkpad;
-       const gchar *media_type;
+       const gchar *mime_type;
        GstElement *h264parse;
        GstElement *capsfilter;
        GstCaps *caps;
@@ -2906,10 +2906,12 @@ static void __demux_pad_added_cb(GstElement *object, GstPad *pad, gpointer data)
        g_print("__demux_pad_added_cb(), object[%s] pad[%s] packet_source[%p]\n",
                GST_ELEMENT_NAME(object), GST_PAD_NAME(pad), packet_source);
 
-       media_type = gst_structure_get_name(gst_caps_get_structure(gst_pad_get_current_caps(pad), 0));
+       caps = gst_pad_get_current_caps(pad);
+       mime_type = gst_structure_get_name(gst_caps_get_structure(caps, 0));
+       gst_caps_unref(caps);
 
-       if (g_strrstr(media_type, "audio")) {
-               g_print("skip pad for audio\n");
+       if (g_strrstr(mime_type, "audio")) {
+               g_print("skip pad for audio stream\n");
                return;
        }