From: backto.kim Date: Mon, 13 Dec 2021 06:47:33 +0000 (+0900) Subject: Fix resource leak when get caps from pad X-Git-Tag: submit/tizen/20211229.072812~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F06%2F267906%2F11;p=platform%2Fcore%2Fapi%2Fwebrtc.git Fix resource leak when get caps from pad [Version] 0.3.30 [Issue Type] Resource leak Change-Id: I1123877111921b88c898299cc2a9ef1f7ae3dec1 --- diff --git a/include/webrtc_private.h b/include/webrtc_private.h index 6e9a9b44..67c5fd64 100644 --- a/include/webrtc_private.h +++ b/include/webrtc_private.h @@ -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); diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index a4e4faa0..3621e85c 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.3.29 +Version: 0.3.30 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_private.c b/src/webrtc_private.c index 8df8e295..a0cc5328 100644 --- a/src/webrtc_private.c +++ b/src/webrtc_private.c @@ -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) diff --git a/src/webrtc_sink.c b/src/webrtc_sink.c index dd9b411a..46c28c2d 100644 --- a/src/webrtc_sink.c +++ b/src/webrtc_sink.c @@ -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)); } diff --git a/src/webrtc_source.c b/src/webrtc_source.c index ccd4e5ef..01e140f1 100644 --- a/src/webrtc_source.c +++ b/src/webrtc_source.c @@ -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); diff --git a/test/webrtc_test.c b/test/webrtc_test.c index d9a49f71..93fdf21c 100644 --- a/test/webrtc_test.c +++ b/test/webrtc_test.c @@ -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; }