[0.6.238] Fix memory leak due to without unref source element
[platform/core/multimedia/libmm-player.git] / src / mm_player_gst.c
index cefa10e..906be79 100644 (file)
@@ -82,6 +82,28 @@ print_tag(const GstTagList *list, const gchar *tag, gpointer unused)
 #endif
 
 static gboolean
+__mmplayer_is_hls_type(gchar *type) {
+       if (g_strrstr(type, "application/x-hls"))
+               return TRUE;
+       return FALSE;
+}
+
+static gboolean
+__mmplayer_is_mpegts_type(gchar *type) {
+       if (g_strrstr(type, "video/mpegts"))
+               return TRUE;
+       return FALSE;
+}
+
+static gboolean
+__mmplayer_is_mp3_type(gchar *type) {
+       if (g_strrstr(type, "application/x-id3") ||
+               (g_strrstr(type, "audio/mpeg") && g_strrstr(type, "mpegversion=(int)1")))
+               return TRUE;
+       return FALSE;
+}
+
+static gboolean
 __mmplayer_check_error_posted_from_activated_track(mmplayer_t *player, gchar *src_element_name)
 {
        /* check whether the error is posted from not-activated track or not */
@@ -2801,7 +2823,7 @@ __mmplayer_gst_make_rtsp_src(mmplayer_t *player)
        return element;
 }
 
-void __mmplayer_http_src_setup(GstElement *source, gpointer data)
+static void __mmplayer_http_src_setup(GstElement *source, gpointer data)
 {
 #define HTTP_SOURCE_BLOCK_SIZE (64 * 1024)
 
@@ -2817,29 +2839,24 @@ void __mmplayer_http_src_setup(GstElement *source, gpointer data)
 
        LOGD("source element %s", GST_ELEMENT_NAME(source));
 
-       /* get profile attribute */
        attrs = MMPLAYER_GET_ATTRS(player);
        if (!attrs) {
                LOGE("failed to get content attribute");
                return;
        }
 
-       /* get attribute */
        mm_attrs_get_string_by_name(attrs, "streaming_cookie", &cookies);
        mm_attrs_get_string_by_name(attrs, "streaming_user_agent", &user_agent);
 
        if (player->ini.http_timeout != DEFAULT_HTTP_TIMEOUT)
                http_timeout = player->ini.http_timeout;
 
-       /* get attribute */
        SECURE_LOGD("cookies : %s", cookies);
        SECURE_LOGD("user_agent :  %s", user_agent);
        LOGD("timeout : %d", http_timeout);
 
-       /* setting property to streaming source */
        g_object_set(G_OBJECT(source), "timeout", http_timeout, "blocksize", (unsigned long)(HTTP_SOURCE_BLOCK_SIZE), NULL);
 
-       /* parsing cookies */
        if ((cookie_list = _mmplayer_get_cookie_list((const char *)cookies))) {
                g_object_set(G_OBJECT(source), "cookies", cookie_list, NULL);
                g_strfreev(cookie_list);
@@ -2852,6 +2869,31 @@ void __mmplayer_http_src_setup(GstElement *source, gpointer data)
        return;
 }
 
+static void __mmplayer_rtsp_src_setup(GstElement *source, gpointer data)
+{
+       mmplayer_t *player = (mmplayer_t *)data;
+       gchar *user_agent = NULL;
+       MMHandleType attrs = 0;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_IF_FAIL(player);
+
+       attrs = MMPLAYER_GET_ATTRS(player);
+       if (!attrs) {
+               LOGE("failed to get content attribute");
+               return;
+       }
+
+       mm_attrs_get_string_by_name(attrs, "streaming_user_agent", &user_agent);
+
+       SECURE_LOGD("user_agent : %s", user_agent);
+
+       if (user_agent)
+               g_object_set(G_OBJECT(source), "user-agent", user_agent, NULL);
+
+       MMPLAYER_FLEAVE();
+}
+
 static void
 __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, gpointer data)
 {
@@ -2869,16 +2911,7 @@ __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, g
        if (MMPLAYER_IS_HTTP_STREAMING(player)) {
                __mmplayer_http_src_setup(source, data);
        } else if (MMPLAYER_IS_RTSP_STREAMING(player)) {
-               gchar *user_agent = NULL;
-
-               /* get attribute */
-               mm_attrs_get_string_by_name(player->attrs, "streaming_user_agent", &user_agent);
-
-               SECURE_LOGD("user_agent : %s", user_agent);
-
-               /* setting property to streaming source */
-               if (user_agent)
-                       g_object_set(G_OBJECT(source), "user-agent", user_agent, NULL);
+               __mmplayer_rtsp_src_setup(source, data);
        } else if (MMPLAYER_IS_SMOOTH_STREAMING(player)) {
                g_object_set(G_OBJECT(source), "timeout", DEFAULT_HTTP_TIMEOUT, NULL);
        } else if (player->profile.uri_type == MM_PLAYER_URI_TYPE_MEM) {
@@ -2886,10 +2919,12 @@ __mmplayer_gst_found_source(GObject *object, GObject *orig, GParamSpec *pspec, g
                        "size", (gint64)player->profile.input_mem.len, "blocksize", 20480, NULL);
 
                _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "seek-data",
-                                                                               G_CALLBACK(__mmplayer_gst_appsrc_seek_data_mem), (gpointer)&player->profile.input_mem);
+                                               G_CALLBACK(__mmplayer_gst_appsrc_seek_data_mem), (gpointer)&player->profile.input_mem);
                _mmplayer_add_signal_connection(player, G_OBJECT(source), MM_PLAYER_SIGNAL_TYPE_OTHERS, "need-data",
-                                                                               G_CALLBACK(__mmplayer_gst_appsrc_feed_data_mem), (gpointer)&player->profile.input_mem);
+                                               G_CALLBACK(__mmplayer_gst_appsrc_feed_data_mem), (gpointer)&player->profile.input_mem);
        }
+       gst_object_unref (source);
+
        MMPLAYER_FLEAVE();
 }
 
@@ -3073,7 +3108,8 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el
                        /* NOTE : in case of ts streaming, player could not get the correct duration info *
                         *                skip the pull mode(file or ring buffering) setting. */
                        if (dur_bytes > 0) {
-                               if ((!g_strrstr(player->type, "video/mpegts")) && (!g_strrstr(player->type, "application/x-hls"))) {
+                               if (!(__mmplayer_is_mpegts_type(player->type) || __mmplayer_is_hls_type(player->type)
+                                       || __mmplayer_is_mp3_type(player->type))) {
                                        type = MUXED_BUFFER_TYPE_MEM_RING_BUFFER;
                                        player->streamer->ring_buffer_size = player->ini.http_ring_buffer_size;
                                }