[0.6.239] Fix memory leak
[platform/core/multimedia/libmm-player.git] / src / mm_player_priv.c
index f4773fd..6b19906 100644 (file)
@@ -584,6 +584,7 @@ int _mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e t
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
+       LOGD("commit [%d type] resource", type);
        rm_ret = mm_resource_manager_commit(player->resource_manager);
        if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
                LOGE("failed to commit of resource, ret(0x%x)", rm_ret);
@@ -594,6 +595,36 @@ int _mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e t
        return MM_ERROR_NONE;
 }
 
+static void __mmplayer_destroy_hw_resource(mmplayer_t *player)
+{
+       int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
+
+       MMPLAYER_RETURN_IF_FAIL(player);
+       MMPLAYER_RETURN_IF_FAIL(player->resource_manager);
+
+       rm_ret = mm_resource_manager_mark_all_for_release(player->resource_manager);
+       if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+               LOGW("failed to mark all for release of resource, ret(0x%x)", rm_ret);
+               goto rm_destroy;
+       }
+
+       rm_ret = mm_resource_manager_commit(player->resource_manager);
+       if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE)
+               LOGW("failed to commit resource, ret(0x%x)", rm_ret);
+
+rm_destroy:
+       /* de-initialize resource manager */
+       rm_ret = mm_resource_manager_destroy(player->resource_manager);
+       if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
+               LOGW("failed to destroy resource manager, ret(0x%x)", rm_ret);
+               return;
+       }
+
+       player->resource_manager = NULL;
+
+       LOGD("resource manager is destroyed");
+}
+
 static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type)
 {
        int rm_ret = MM_RESOURCE_MANAGER_ERROR_NONE;
@@ -614,9 +645,10 @@ static int __mmplayer_release_hw_resource(mmplayer_t *player, mmplayer_resource_
 
        player->hw_resource[type] = NULL;
 
+       LOGD("commit [%d type] resource", type);
        rm_ret = mm_resource_manager_commit(player->resource_manager);
        if (rm_ret != MM_RESOURCE_MANAGER_ERROR_NONE) {
-               LOGE("failed to commit of resource, ret(0x%x)", rm_ret);
+               LOGE("failed to commit resource, ret(0x%x)", rm_ret);
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
@@ -1688,7 +1720,8 @@ __mmplayer_gst_create_sink_bin(GstElement *elem, GstPad *pad, GstCaps *ref_caps,
                MMPLAYER_GST_GET_CAPS_INFO(ref_caps, str, name, caps_ret);
                if (!caps_ret)
                        goto ERROR;
-
+               if (caps)
+                       gst_caps_unref(caps);
                caps = gst_caps_ref(ref_caps);
        }
 
@@ -2277,10 +2310,6 @@ __mmplayer_gst_caps_notify_cb(GstPad *pad, GParamSpec *unused, gpointer data)
        MMPLAYER_RETURN_IF_FAIL(unused);
        MMPLAYER_RETURN_IF_FAIL(data);
 
-       caps = gst_pad_get_current_caps(pad);
-       if (!caps)
-               return;
-
        MMPLAYER_GST_GET_CAPS_INFO_FROM_PAD(pad, caps, str, name, caps_ret);
        if (!caps_ret)
                goto ERROR;
@@ -4964,12 +4993,6 @@ _mmplayer_destroy(MMHandleType handle)
 
        _mmplayer_release_video_capture(player);
 
-       /* de-initialize resource manager */
-       if (mm_resource_manager_destroy(player->resource_manager)
-               != MM_RESOURCE_MANAGER_ERROR_NONE)
-               LOGE("failed to destroy resource manager");
-       LOGD("resource manager is destroyed");
-
        /* release miscellaneous information */
        __mmplayer_release_misc(player);
 
@@ -4979,6 +5002,8 @@ _mmplayer_destroy(MMHandleType handle)
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
+       __mmplayer_destroy_hw_resource(player);
+
        g_queue_free(player->bus_msg_q);
 
        /* release subtitle info lock and cond */
@@ -6759,9 +6784,9 @@ _mmplayer_set_next_uri(MMHandleType hplayer, const char *uri, bool is_first_path
                        player->uri_info.uri_list = g_list_append(player->uri_info.uri_list, g_strdup(uri));
                        SECURE_LOGD("add original path : %s", uri);
                } else {
-                       player->uri_info.uri_list = g_list_delete_link(player->uri_info.uri_list, g_list_nth(player->uri_info.uri_list, 0));
-                       player->uri_info.uri_list = g_list_insert(player->uri_info.uri_list, g_strdup(uri), 0);
-
+                       g_free(g_list_nth_data(player->uri_info.uri_list, 0));
+                       player->uri_info.uri_list = g_list_prepend(
+                               g_list_delete_link(player->uri_info.uri_list, player->uri_info.uri_list), g_strdup(uri));
                        SECURE_LOGD("change original path : %s", uri);
                }
        } else {
@@ -7741,7 +7766,7 @@ __mmplayer_release_misc(mmplayer_t *player)
 static void
 __mmplayer_release_misc_post(mmplayer_t *player)
 {
-       char *original_uri = NULL;
+       gchar *original_uri = NULL;
        MMPLAYER_FENTER();
 
        /* player->pipeline is already released before. */
@@ -7778,7 +7803,7 @@ __mmplayer_release_misc_post(mmplayer_t *player)
 
                mm_player_set_attribute((MMHandleType)player, NULL, "profile_uri",
                                original_uri, (original_uri) ? strlen(original_uri) : (0), NULL);
-
+               MMPLAYER_FREEIF(original_uri);
        }
 
        /* clear the audio stream buffer list */