[0.6.290] Fix adaptive streaming not being prepared due to upgrade to GST 1.22.7
[platform/core/multimedia/libmm-player.git] / src / mm_player_utils.c
index 8af1099..d43a79e 100644 (file)
@@ -37,6 +37,7 @@
 
 #define MEDIA_PATH_EXTERNAL tzplatform_getenv(TZ_SYS_STORAGE) /* external storage, sd card, usb */
 #define FD_NUM_FOR_DEBUG 10
+#define CMD_LOCK_TICKET_MAX (G_MAXUINT - 1)
 
 const gchar *
 _mmplayer_get_stream_type_name(int type)
@@ -133,6 +134,14 @@ _mmplayer_is_smooth_streaming(mmplayer_t *player)
 }
 
 gboolean
+_mmplayer_is_adaptive_streaming(mmplayer_t *player)
+{
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
+       return (_mmplayer_is_http_live_streaming(player) || _mmplayer_is_dash_streaming(player)
+               || _mmplayer_is_smooth_streaming(player)) ? TRUE : FALSE;
+}
+
+gboolean
 _mmplayer_is_ms_buff_src(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
@@ -646,16 +655,91 @@ media_format_mimetype_e _mmplayer_convert_audio_pcm_str_to_media_format_mime(con
        }
 }
 
-gboolean _mmplayer_use_uridecodebin3(mmplayer_t *player) /* MMPLAYER_USE_URIDECODEBIN3(player) */
+gboolean _mmplayer_use_decodebin(mmplayer_t *player) /* MMPLAYER_USE_DECODEBIN(player) */
 {
+       int audio_offload = 0;
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
-       if (MMPLAYER_IS_RTSP_STREAMING(player) ||
-               MMPLAYER_IS_MS_BUFF_SRC(player))
+       mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_AUDIO_OFFLOAD, &audio_offload); /* user requirement */
+
+       if (MMPLAYER_IS_MS_BUFF_SRC(player) || player->ini.use_decodebin || audio_offload)
+               return TRUE;
+
+       return FALSE;
+}
+
+void _mmplayer_cmd_lock_init(mmplayer_t *player)
+{
+       MMPLAYER_RETURN_IF_FAIL(player);
+       player->cmd_lock = g_new0(mmplayer_ticket_lock_t, 1);
+       g_mutex_init(&player->cmd_lock->ticket_mutex);
+       g_cond_init(&player->cmd_lock->ticket_cond);
+       player->cmd_lock->ticket_queue_head = 0;
+       player->cmd_lock->ticket_queue_tail = 0;
+}
+
+void _mmplayer_cmd_lock_deinit(mmplayer_t *player)
+{
+       MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
+       g_mutex_clear(&player->cmd_lock->ticket_mutex);
+       g_cond_clear(&player->cmd_lock->ticket_cond);
+       player->cmd_lock->ticket_queue_head = 0;
+       player->cmd_lock->ticket_queue_tail = 0;
+       g_free(player->cmd_lock);
+}
+
+void _mmplayer_cmd_lock(mmplayer_t *player)
+{
+       guint64 queue_me;
+       GCond *cond;
+       GMutex *mutex;
+
+       MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
+
+       cond = &player->cmd_lock->ticket_cond;
+       mutex = &player->cmd_lock->ticket_mutex;
+       g_mutex_lock(mutex);
+       queue_me = player->cmd_lock->ticket_queue_tail;
+       player->cmd_lock->ticket_queue_tail = (queue_me + 1) % CMD_LOCK_TICKET_MAX;
+       while (queue_me != player->cmd_lock->ticket_queue_head)
+               g_cond_wait(cond, mutex);
+       g_mutex_unlock(mutex);
+}
+
+gboolean _mmplayer_cmd_trylock(mmplayer_t *player)
+{
+       GMutex *mutex;
+
+       MMPLAYER_RETURN_VAL_IF_FAIL(player && player->cmd_lock, FALSE);
+
+       mutex = &player->cmd_lock->ticket_mutex;
+
+       if (!g_mutex_trylock(mutex))
                return FALSE;
 
-       if (!player->ini.use_uridecodebin3)
+       if (player->cmd_lock->ticket_queue_tail != player->cmd_lock->ticket_queue_head) {
+               g_mutex_unlock(mutex);
                return FALSE;
+       }
+       g_mutex_unlock(mutex);
 
+       _mmplayer_cmd_lock(player);
        return TRUE;
 }
+
+void _mmplayer_cmd_unlock(mmplayer_t *player)
+{
+       GCond *cond;
+       GMutex *mutex;
+
+       MMPLAYER_RETURN_IF_FAIL(player && player->cmd_lock);
+
+       cond = &player->cmd_lock->ticket_cond;
+       mutex = &player->cmd_lock->ticket_mutex;
+
+       g_mutex_lock(mutex);
+       player->cmd_lock->ticket_queue_head =
+               (player->cmd_lock->ticket_queue_head + 1) % CMD_LOCK_TICKET_MAX;
+       g_cond_broadcast(cond);
+       g_mutex_unlock(mutex);
+}