diff options
author | Gilbok Lee <gilbok.lee@samsung.com> | 2022-10-28 13:45:54 +0900 |
---|---|---|
committer | Eunhye Choi <eunhae1.choi@samsung.com> | 2022-11-22 13:55:49 +0900 |
commit | 0025fec427ff6ef74776e34b1889d1e3a6b8c631 (patch) | |
tree | 4680dce37ed57c612a32f436708a80659a26236e | |
parent | bdf6f1092f37388d1fd7971df18b0179588a4777 (diff) | |
download | libmm-player-tizen_6.5.tar.gz libmm-player-tizen_6.5.tar.bz2 libmm-player-tizen_6.5.zip |
[0.6.270] fix crash when player destroy during prepare_asyncsubmit/tizen_6.5/20221122.073613accepted/tizen/6.5/unified/20221123.211759tizen_6.5accepted/tizen_6.5_unified
- The removed element is accessed in the
__mmplayer_release_signal_connection() function
cherry-pick : fd6c5d52629a4edd19d4a0aa0ec697873ede148d
Change-Id: I7d5753e9cba48002fa05f5c4627376fbe9554aeb
-rw-r--r-- | packaging/libmm-player.spec | 2 | ||||
-rw-r--r-- | src/mm_player_gst.c | 37 |
2 files changed, 37 insertions, 2 deletions
diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 4a07c42..778e5a6 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.269 +Version: 0.6.270 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index e509314..6abf729 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -3204,11 +3204,46 @@ __mmplayer_gst_deep_element_added(GstElement *bin, GstBin *child, GstElement *el return; } +static void +__mmplayer_delete_signal_connection(mmplayer_t *player, GstElement *removed_element) +{ + MMPLAYER_FENTER(); + + MMPLAYER_RETURN_IF_FAIL(player); + MMPLAYER_RETURN_IF_FAIL(removed_element); + + LOGD("delete signal on %s", GST_ELEMENT_NAME(removed_element)); + + for (int type = MM_PLAYER_SIGNAL_TYPE_AUTOPLUG; type < MM_PLAYER_SIGNAL_TYPE_ALL; type++) { + GList *node = player->signals[type]; + while (node) { + GList *next_node = node->next; + mmplayer_signal_item_t *item = node->data; + if (item && item->obj == G_OBJECT(removed_element)) { + player->signals[type] = g_list_delete_link(player->signals[type], node); + MMPLAYER_FREEIF(item); + } + node = next_node; + } + } + + MMPLAYER_FLEAVE(); +} + void __mmplayer_gst_deep_element_removed(GstElement *bin, GstBin *child, GstElement *element, gpointer data) { + mmplayer_t *player = (mmplayer_t *)data; + + MMPLAYER_FENTER(); + + MMPLAYER_RETURN_IF_FAIL(player); + LOGD("%s > %s > %s", GST_ELEMENT_NAME(bin), GST_ELEMENT_NAME(child), GST_ELEMENT_NAME(element)); - return; + + __mmplayer_delete_signal_connection(player, element); + + MMPLAYER_FLEAVE(); } static GstElement * |