[0.6.291] Fix the external subtitle synchronization problem when player accurate... 81/303481/4 accepted/tizen_unified_riscv accepted/tizen/unified/20240116.155504 accepted/tizen/unified/riscv/20240117.041608
authorGilbok Lee <gilbok.lee@samsung.com>
Thu, 28 Dec 2023 07:55:57 +0000 (16:55 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Thu, 11 Jan 2024 03:17:02 +0000 (12:17 +0900)
Change-Id: I90861549da1b2cb15bd7cb244290721f2334b218

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

index 451159f..c29c45b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.290
+Version:    0.6.291
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index bdce524..78c58d7 100644 (file)
@@ -1818,6 +1818,9 @@ __mmplayer_gst_handle_async_done_message(mmplayer_t *player, GstMessage *msg)
                return;
 
        if (player->seek_state == MMPLAYER_SEEK_IN_PROGRESS) {
+               if (player->is_external_subtitle_present)
+                       _mmplayer_sync_subtitle_pipeline(player);
+
                if (MMPLAYER_TARGET_STATE(player) == MM_PLAYER_STATE_PAUSED) {
                        player->seek_state = MMPLAYER_SEEK_NONE;
                        MMPLAYER_POST_MSG(player, MM_MESSAGE_SEEK_COMPLETED, NULL);
index 1004e50..d8d1141 100644 (file)
@@ -4279,17 +4279,13 @@ __mmplayer_subtitle_adjust_position_probe(GstPad *pad, GstPadProbeInfo *info, gp
        gint64 adjusted_timestamp = 0;
        GstBuffer *buffer = gst_pad_probe_info_get_buffer(info);
 
-       MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, GST_PAD_PROBE_DROP);
 
-       if (player->set_mode.subtitle_off) {
-               LOGD("subtitle is OFF.");
-               return TRUE;
-       }
+       if (player->set_mode.subtitle_off)
+               return GST_PAD_PROBE_OK;
 
-       if (player->adjust_subtitle_pos == 0) {
-               LOGD("nothing to do");
-               return TRUE;
-       }
+       if (player->adjust_subtitle_pos == 0)
+               return GST_PAD_PROBE_OK;
 
        cur_timestamp = GST_BUFFER_TIMESTAMP(buffer);
        adjusted_timestamp = (gint64)cur_timestamp + ((gint64)player->adjust_subtitle_pos * G_GINT64_CONSTANT(1000000));
@@ -4297,7 +4293,7 @@ __mmplayer_subtitle_adjust_position_probe(GstPad *pad, GstPadProbeInfo *info, gp
        if (adjusted_timestamp < 0) {
                LOGD("adjusted_timestamp under zero");
                MMPLAYER_FLEAVE();
-               return FALSE;
+               return GST_PAD_PROBE_DROP;
        }
 
        GST_BUFFER_TIMESTAMP(buffer) = (GstClockTime) adjusted_timestamp;
@@ -8071,15 +8067,15 @@ __mmplayer_check_subtitle(mmplayer_t *player)
 
        /* get subtitle attribute */
        attrs = MMPLAYER_GET_ATTRS(player);
-       if (!attrs)
-               return FALSE;
+       MMPLAYER_RETURN_VAL_IF_FAIL(attrs, FALSE);
 
        mm_attrs_get_string_by_name(attrs, "subtitle_uri", &subtitle_uri);
-       if (!subtitle_uri || !strlen(subtitle_uri))
+       if (!subtitle_uri || (strlen(subtitle_uri) == 0)) {
+               MMPLAYER_FLEAVE();
                return FALSE;
+       }
 
        SECURE_LOGD("subtitle uri is %s[%zu]", subtitle_uri, strlen(subtitle_uri));
-       player->is_external_subtitle_present = TRUE;
 
        MMPLAYER_FLEAVE();
 
@@ -8358,14 +8354,26 @@ _mmplayer_sync_subtitle_pipeline(mmplayer_t *player)
 
        LOGD("seek time = %"G_GINT64_FORMAT", rate = %f", time, player->playback_rate);
        event = gst_event_new_seek(player->playback_rate, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH), GST_SEEK_TYPE_SET, time, GST_SEEK_TYPE_NONE, -1);
-       if (event) {
-               _mmplayer_gst_send_event_to_sink(player, event);
-       } else {
+       if (!event) {
                result = MM_ERROR_PLAYER_INTERNAL;
                LOGE("gst_event_new_seek failed"); /* pipeline will got error and can not be recovered */
                goto ERROR;
        }
 
+       if (player->seek_state == MMPLAYER_SEEK_IN_PROGRESS) {
+               GstElement *text_sink = GST_ELEMENT_CAST(player->pipeline->textbin[MMPLAYER_T_FAKE_SINK].gst);
+               if (GST_IS_ELEMENT(text_sink)) {
+                       if (gst_element_send_event(text_sink, event))
+                               LOGD("sending event[%s] to subtitle sink element [%s] success!",
+                                               GST_EVENT_TYPE_NAME(event), GST_ELEMENT_NAME(text_sink));
+                       else
+                               LOGE("sending event[%s] to subtitle sink element [%s] failed!",
+                                               GST_EVENT_TYPE_NAME(event), GST_ELEMENT_NAME(text_sink));
+               }
+       } else {
+               _mmplayer_gst_send_event_to_sink(player, event);
+       }
+
        /* sync state with current pipeline */
        gst_element_sync_state_with_parent(textbin[MMPLAYER_T_BIN].gst);
        gst_element_sync_state_with_parent(mainbin[MMPLAYER_M_SUBPARSE].gst);
@@ -8569,6 +8577,7 @@ _mmplayer_set_external_subtitle_path(MMHandleType hplayer, const char *filepath)
                }
                MMPLAYER_SUBTITLE_INFO_UNLOCK(player);
        }
+       player->is_external_subtitle_present = TRUE;
 
        MMPLAYER_FLEAVE();
        return result;