[0.6.134] Fix memory leak 19/200919/2
authorGilbok Lee <gilbok.lee@samsung.com>
Wed, 6 Mar 2019 02:24:38 +0000 (11:24 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Thu, 7 Mar 2019 06:40:20 +0000 (15:40 +0900)
Change-Id: I9237851442d3653134359ed929182183c44071a5

packaging/libmm-player.spec
src/mm_player_gst.c
src/mm_player_priv.c

index 528952b737a87a7ac0076ffa4bb5b05c37a3a37b..21eedeed8247c21e9a430b1bacb054d4ca07a32c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.133
+Version:    0.6.134
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 1c9ab1981a0e804432947cac081516220f656f8f..453cd6bf30292ad5d524cf5c7feea44fb02bb88f 100644 (file)
@@ -1414,6 +1414,8 @@ __mmplayer_gst_handle_eos_message(mm_player_t* player, GstMessage *msg)
                        player->audio_stream_cb = NULL;
                        player->audio_stream_cb_user_param = NULL;
 
+                       gst_object_unref(GST_OBJECT(pad));
+
                }
        }
        if ((player->audio_stream_render_cb_ex) && (!player->audio_stream_sink_sync))
@@ -2551,7 +2553,7 @@ __mmplayer_gst_create_es_path(mm_player_t* player, MMPlayerStreamType type, GstC
        }
 
        if (type == MM_PLAYER_STREAM_TYPE_TEXT) {
-               __mmplayer_try_to_plug_decodebin(player, gst_element_get_static_pad(mainbin[queue_id].gst, "src"), caps);
+               __mmplayer_try_to_plug_decodebin(player, srcpad, caps);
        } else {
                if (!__mmplayer_gst_create_es_decoder(player, type, srcpad)) {
                        LOGE("failed to create decoder");
index 1c7298422961229e6c667bb682554a94ef5071df..fffea7787b203c5a124fbdb0a2786e0af0602881 100644 (file)
@@ -349,12 +349,13 @@ __mmplayer_update_content_attrs(mm_player_t* player, enum content_attr_flag flag
                                        caps_a = NULL;
 
                                        has_audio_attrs = TRUE;
-                               } else
+                               } else {
                                        LOGW("not ready to get audio caps");
-
+                               }
                                gst_object_unref(pad);
-                       } else
+                       } else {
                                LOGW("failed to get pad from audiosink");
+                       }
                }
        }
 
@@ -400,10 +401,10 @@ __mmplayer_update_content_attrs(mm_player_t* player, enum content_attr_flag flag
                                        }
 
                                        has_video_attrs = TRUE;
-                               } else
+                               } else {
                                        LOGD("no negitiated caps from videosink");
+                               }
                                gst_object_unref(pad);
-                               pad = NULL;
                        } else {
                                LOGD("no videosink sink pad");
                        }
@@ -1374,6 +1375,9 @@ __mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data)
                }
        }
 
+       gst_object_unref(GST_OBJECT(sinkpad));
+       sinkpad = NULL;
+
        selector = player->pipeline->mainbin[elemId].gst;
        if (selector == NULL) {
                selector = gst_element_factory_make("input-selector", NULL);
@@ -1400,8 +1404,9 @@ __mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data)
 
                gst_element_set_state(selector, GST_STATE_PAUSED);
                gst_bin_add(GST_BIN(pipeline), selector);
-       } else
+       } else {
                LOGD("input-selector is already created.\n");
+       }
 
        // link
        LOGD("Calling request pad with selector %p \n", selector);
@@ -1483,13 +1488,11 @@ static void __mmplayer_handle_text_decode_path(mm_player_t* player, GstElement*
                mm_attrs_set_int_by_name(attrs, "content_text_track_num", (gint)player->selector[MM_PLAYER_TRACK_TYPE_TEXT].total_track_num);
                if (mmf_attrs_commit(attrs))
                        LOGE("failed to commit.\n");
-       } else
+       } else {
                LOGE("cannot get content attribute");
-
-       if (srcpad) {
-               gst_object_unref(GST_OBJECT(srcpad));
-               srcpad = NULL;
        }
+
+       gst_object_unref(GST_OBJECT(srcpad));
 }
 
 static void
@@ -1914,6 +1917,9 @@ __mmplayer_gst_decode_no_more_pads(GstElement *elem, gpointer data)
                }
        }
 
+       gst_object_unref(GST_OBJECT(srcpad));
+       srcpad = NULL;
+
        if (audio_selector) {
                active_index = player->selector[MM_PLAYER_TRACK_TYPE_AUDIO].active_pad_index;
                if ((active_index != DEFAULT_TRACK) &&
@@ -1975,6 +1981,9 @@ __mmplayer_gst_decode_no_more_pads(GstElement *elem, gpointer data)
                        __mmplayer_pipeline_complete(NULL, player);
        }
 
+       gst_object_unref(GST_OBJECT(srcpad));
+       srcpad = NULL;
+
        if (!MMPLAYER_IS_MS_BUFF_SRC(player)) {
                if (text_selector)
                        __mmplayer_handle_text_decode_path(player, text_selector);
@@ -1983,11 +1992,6 @@ __mmplayer_gst_decode_no_more_pads(GstElement *elem, gpointer data)
        MMPLAYER_FLEAVE();
 
 ERROR:
-       if (srcpad) {
-               gst_object_unref(GST_OBJECT(srcpad));
-               srcpad = NULL;
-       }
-
        if (player->gapless.reconfigure) {
                player->gapless.reconfigure = FALSE;
                MMPLAYER_PLAYBACK_UNLOCK(player);
@@ -4175,8 +4179,9 @@ __mmplayer_gst_create_video_pipeline(mm_player_t* player, GstCaps* caps, MMDispl
                        __mmplayer_add_signal_connection(player, G_OBJECT(sink_pad), MM_PLAYER_SIGNAL_TYPE_VIDEOBIN,
                                        "notify::caps", G_CALLBACK(__mmplayer_gst_caps_notify_cb), (gpointer)player);
                        gst_object_unref(GST_OBJECT(sink_pad));
-               } else
+               } else {
                        LOGW("failed to get sink pad from videosink\n");
+               }
        }
 
        /* store it as it's sink element */
@@ -7022,6 +7027,9 @@ __mmplayer_try_to_plug_decodebin(mm_player_t* player, GstPad *srcpad, const GstC
        }
 
        gst_object_unref(GST_OBJECT(sinkpad));
+       sinkpad = NULL;
+       gst_object_unref(GST_OBJECT(qsrcpad));
+       qsrcpad = NULL;
 
        mainbin[MMPLAYER_M_AUTOPLUG].id = MMPLAYER_M_AUTOPLUG;
        mainbin[MMPLAYER_M_AUTOPLUG].gst = decodebin;
@@ -7061,6 +7069,9 @@ ERROR:
        if (sinkpad)
                gst_object_unref(GST_OBJECT(sinkpad));
 
+       if (qsrcpad)
+               gst_object_unref(GST_OBJECT(qsrcpad));
+
        if (queue2) {
                /* NOTE : Trying to dispose element queue0, but it is in READY instead of the NULL state.
                 * You need to explicitly set elements to the NULL state before
@@ -9587,6 +9598,7 @@ __mmplayer_release_dump_list(GList *dump_list)
                        if (dump_s->dump_pad) {
                                if (dump_s->probe_handle_id)
                                        gst_pad_remove_probe(dump_s->dump_pad, dump_s->probe_handle_id);
+                               gst_object_unref(GST_OBJECT(dump_s->dump_pad));
                        }
                        if (dump_s->dump_element_file) {
                                fclose(dump_s->dump_element_file);