From 1f4b10c7803ee5a50339992f98e1f359cae1a3b0 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Thu, 28 Dec 2023 16:55:57 +0900 Subject: [PATCH] [0.6.291] Fix the external subtitle synchronization problem when player accurate seek Change-Id: I90861549da1b2cb15bd7cb244290721f2334b218 --- packaging/libmm-player.spec | 2 +- src/mm_player_gst.c | 3 +++ src/mm_player_priv.c | 43 ++++++++++++++++++++++++++----------------- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packaging/libmm-player.spec b/packaging/libmm-player.spec index 451159f..c29c45b 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.290 +Version: 0.6.291 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/mm_player_gst.c b/src/mm_player_gst.c index bdce524..78c58d7 100644 --- a/src/mm_player_gst.c +++ b/src/mm_player_gst.c @@ -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); diff --git a/src/mm_player_priv.c b/src/mm_player_priv.c index 1004e50..d8d1141 100644 --- a/src/mm_player_priv.c +++ b/src/mm_player_priv.c @@ -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; -- 2.7.4