[0.6.63] fix crash during destroy 31/161331/1 accepted/tizen/3.0/common/20171127.084414 accepted/tizen/3.0/mobile/20171127.041605 accepted/tizen/3.0/tv/20171127.041609 accepted/tizen/3.0/wearable/20171127.041613 submit/tizen_3.0/20171123.081321
authorEunhae Choi <eunhae1.choi@samsung.com>
Thu, 23 Nov 2017 01:30:23 +0000 (10:30 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Thu, 23 Nov 2017 01:30:23 +0000 (10:30 +0900)
Change-Id: Id03363569c9aebe4585bc7a5d12d0cdf564d7d65

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

index 6bbd95760047115303b2e7b6945901de5f0ee908..eaa2844327718c59452fc870b2b60917f0e6b73c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.62
+Version:    0.6.63
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index dcac88c37725149ae3d2118580bce8f4fc06107a..b420446b4f6453ee318c15649b8fb06d430e90f7 100644 (file)
@@ -112,6 +112,11 @@ int  mm_player_destroy(MMHandleType player)
 
        result = _mmplayer_destroy(player);
 
+       MMPLAYER_CMD_UNLOCK(player);
+
+       /* to make sure unlocked.
+          @see __mmplayer_gst_callback, GST_MESSAGE_BUFFERING handling */
+       MMPLAYER_CMD_LOCK(player);
        MMPLAYER_CMD_UNLOCK( player );
 
        g_mutex_clear(&((mm_player_t*)player)->cmd_lock);
index bc1db16167a79fd505c7604a082bf8d1caed1dc2..fc521748106c7bd36f114608a7a4754b811162c2 100644 (file)
@@ -1282,22 +1282,13 @@ __mmplayer_gst_callback(GstBus *bus, GstMessage *msg, gpointer data) // @
                        MMMessageParamType msg_param = {0, };
                        int bRet = MM_ERROR_NONE;
 
-                       if (!MMPLAYER_IS_STREAMING(player))
+                       if (!(player->pipeline && player->pipeline->mainbin)) {
+                               LOGE("player pipeline handle is null");
                                break;
+                       }
 
-                       /* ignore the prev buffering message */
-                       if ((player->streamer) && (player->streamer->is_buffering == FALSE) && (player->streamer->is_buffering_done == TRUE)) {
-                               gint buffer_percent = 0;
-
-                               gst_message_parse_buffering(msg, &buffer_percent);
-
-                               if (buffer_percent == MAX_BUFFER_PERCENT) {
-                                       LOGD("Ignored all the previous buffering msg!(got %d%%)\n", buffer_percent);
-                                       player->streamer->is_buffering_done = FALSE;
-                               }
-
+                       if (!MMPLAYER_IS_STREAMING(player))
                                break;
-                       }
 
                        if (player->pd_mode == MM_PLAYER_PD_MODE_URI) {
                                if (!MMPLAYER_CMD_TRYLOCK(player)) {
@@ -1314,6 +1305,26 @@ __mmplayer_gst_callback(GstBus *bus, GstMessage *msg, gpointer data) // @
                                }
                        } else {
                                MMPLAYER_CMD_LOCK(player);
+                               if (!player->pipeline) { /* during destroy, msg can be delivered. */
+                                       LOGE("pipeline is destroyed.");
+                                       MMPLAYER_CMD_UNLOCK(player);
+                                       break;
+                               }
+                       }
+
+                       /* ignore the prev buffering message */
+                       if ((player->streamer) && (player->streamer->is_buffering == FALSE)
+                               && (player->streamer->is_buffering_done == TRUE)) {
+                               gint buffer_percent = 0;
+
+                               gst_message_parse_buffering(msg, &buffer_percent);
+
+                               if (buffer_percent == MAX_BUFFER_PERCENT) {
+                                       LOGD("Ignored all the previous buffering msg!(got %d%%)\n", buffer_percent);
+                                       player->streamer->is_buffering_done = FALSE;
+                               }
+                               MMPLAYER_CMD_UNLOCK(player);
+                               break;
                        }
 
                        __mmplayer_update_buffer_setting(player, msg);