From: Gilbok Lee Date: Wed, 6 Mar 2019 02:24:38 +0000 (+0900) Subject: [0.6.134] Fix memory leak X-Git-Tag: submit/tizen_5.0/20190408.080132~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92efe0ebf71ce2017a699b03b981e8e80c353bd3;p=platform%2Fcore%2Fmultimedia%2Flibmm-player.git [0.6.134] Fix memory leak Change-Id: I9237851442d3653134359ed929182183c44071a5 --- diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 528952b..21eedee 100644 --- a/packaging/libmm-player.spec +++ b/packaging/libmm-player.spec @@ -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 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index 1c9ab19..453cd6b 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -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"); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 1c72984..fffea77 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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);