[v0.6.2] wait until last drained cb call when doing gapless 23/91423/1 accepted/tizen/common/20161012.154216 accepted/tizen/ivi/20161012.065409 accepted/tizen/mobile/20161012.065251 accepted/tizen/tv/20161012.065319 accepted/tizen/wearable/20161012.065340 submit/tizen/20161012.010406
authorEunhae Choi <eunhae1.choi@samsung.com>
Fri, 7 Oct 2016 10:34:01 +0000 (19:34 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Fri, 7 Oct 2016 10:34:01 +0000 (19:34 +0900)
Change-Id: I40fd0419cbd418a40519c49623120100018d0e52

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

index a459893f27d70b0a5fb1b2b7bae90eef27cdfcdb..d8ce176cfe3902eb687ca19d637df57fd2d71290 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.1
+Version:    0.6.2
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 7288ee430a531954cd42ab80e66ea06df1cdd99c..459be8e2c27cf276493015e3a7d11c9994aa4074 100644 (file)
@@ -2221,7 +2221,8 @@ __mmplayer_gst_selector_event_probe(GstPad * pad, GstPadProbeInfo * info, gpoint
 
        if (GST_EVENT_TYPE(event) != GST_EVENT_STREAM_START &&
                GST_EVENT_TYPE(event) != GST_EVENT_FLUSH_STOP &&
-               GST_EVENT_TYPE(event) != GST_EVENT_SEGMENT)
+               GST_EVENT_TYPE(event) != GST_EVENT_SEGMENT &&
+               GST_EVENT_TYPE(event) != GST_EVENT_EOS)
                return ret;
 
        caps = gst_pad_query_caps(pad, NULL);
@@ -2255,6 +2256,15 @@ __mmplayer_gst_selector_event_probe(GstPad * pad, GstPadProbeInfo * info, gpoint
        LOGD("stream type is %d", stream_type);
 
        switch (GST_EVENT_TYPE(event)) {
+       case GST_EVENT_EOS:
+               {
+                       /* in case of gapless, drop eos event not to send it to sink */
+                       if (player->gapless.reconfigure) {
+                               LOGD("%s:%s EOS received but will be drop", GST_DEBUG_PAD_NAME(pad));
+                               ret = GST_PAD_PROBE_DROP;
+                       }
+                       break;
+               }
        case GST_EVENT_STREAM_START:
                {
                        gint64 stop_running_time = 0;
@@ -11821,6 +11831,11 @@ static void
 __mmplayer_gst_decode_drained(GstElement *bin, gpointer data)
 {
        mm_player_t* player = (mm_player_t*)data;
+       GstIterator *iter = NULL;
+       GValue item = { 0, };
+       GstPad *pad = NULL;
+       gboolean done = FALSE;
+       gboolean is_all_drained = TRUE;
 
        MMPLAYER_FENTER();
        MMPLAYER_RETURN_IF_FAIL(player);
@@ -11837,7 +11852,8 @@ __mmplayer_gst_decode_drained(GstElement *bin, gpointer data)
                return;
        }
 
-       if (!__mmplayer_verify_next_play_path(player)) {
+       if (!player->gapless.reconfigure && /* If it is already checked, skip verify. */
+               !__mmplayer_verify_next_play_path(player)) {
                LOGD("decoding is finished.");
                __mmplayer_reset_gapless_state(player);
                MMPLAYER_CMD_UNLOCK(player);
@@ -11845,6 +11861,40 @@ __mmplayer_gst_decode_drained(GstElement *bin, gpointer data)
        }
 
        player->gapless.reconfigure = TRUE;
+
+       /* check decodebin src pads whether they received EOS or not */
+       iter = gst_element_iterate_src_pads(player->pipeline->mainbin[MMPLAYER_M_AUTOPLUG].gst);
+
+       while (!done) {
+               switch (gst_iterator_next (iter, &item)) {
+               case GST_ITERATOR_OK:
+                       pad = g_value_get_object (&item);
+                       if (!GST_PAD_IS_EOS(pad)) {
+                               LOGW("[%s:%s] not received EOS yet.", GST_DEBUG_PAD_NAME(pad));
+                               is_all_drained = FALSE;
+                               break;
+                       }
+                       g_value_reset (&item);
+                       break;
+               case GST_ITERATOR_RESYNC:
+                       gst_iterator_resync (iter);
+                       break;
+               case GST_ITERATOR_ERROR:
+               case GST_ITERATOR_DONE:
+                       done = TRUE;
+                       break;
+               }
+       }
+       g_value_unset (&item);
+       gst_iterator_free (iter);
+
+       if (!is_all_drained) {
+               LOGD("Wait util the all pads get EOS.");
+               MMPLAYER_CMD_UNLOCK(player);
+               MMPLAYER_FLEAVE();
+               return;
+       }
+
        player->gapless.update_segment[MM_PLAYER_TRACK_TYPE_AUDIO] = FALSE;
        player->gapless.update_segment[MM_PLAYER_TRACK_TYPE_VIDEO] = FALSE;