Name: libmm-player
Summary: Multimedia Framework Player Library
-Version: 0.6.229
+Version: 0.6.230
Release: 0
Group: Multimedia/Libraries
License: Apache-2.0
} mmplayer_adaptive_variant_info_t;
typedef struct {
+ GCond ticket_cond;
+ GMutex ticket_mutex;
+ guint ticket_queue_head;
+ guint ticket_queue_tail;
+} mmplayer_ticket_lock_t;
+
+typedef struct {
int is_spherical;
int is_stitched;
char *stitching_software;
int cmd;
/* command lock */
- GMutex cmd_lock;
+ mmplayer_ticket_lock_t *cmd_lock;
GMutex reconfigure_lock;
GCond reconfigure_cond;
#define MMPLAYER_GET_ATTRS(x_player) ((mmplayer_t *)x_player)->attrs
/* command */
-#define MMPLAYER_CMD_LOCK(x_player) g_mutex_lock(&((mmplayer_t *)x_player)->cmd_lock)
-#define MMPLAYER_CMD_TRYLOCK(x_player) g_mutex_trylock(&((mmplayer_t *)x_player)->cmd_lock)
-#define MMPLAYER_CMD_UNLOCK(x_player) g_mutex_unlock(&((mmplayer_t *)x_player)->cmd_lock)
+#define MMPLAYER_CMD_LOCK_INIT(x_player) _mmplayer_cmd_lock_init((mmplayer_t *)x_player)
+#define MMPLAYER_CMD_LOCK(x_player) _mmplayer_cmd_lock((mmplayer_t *)x_player)
+#define MMPLAYER_CMD_TRYLOCK(x_player) _mmplayer_cmd_trylock((mmplayer_t *)x_player)
+#define MMPLAYER_CMD_UNLOCK(x_player) _mmplayer_cmd_unlock((mmplayer_t *)x_player)
+#define MMPLAYER_CMD_LOCK_DEINIT(x_player) _mmplayer_cmd_lock_deinit((mmplayer_t *)x_player)
/* pipeline reconfigure */
#define MMPLAYER_RECONFIGURE_LOCK(x_player) g_mutex_lock(&((mmplayer_t *)x_player)->reconfigure_lock)
int _mmplayer_get_pixtype(unsigned int fourcc);
bool _mmplayer_get_storage_info(const char *path, mmplayer_storage_info_t *storage_info);
+/* for command lock */
+void _mmplayer_cmd_lock_init(mmplayer_t *player);
+void _mmplayer_cmd_lock_deinit(mmplayer_t *player);
+void _mmplayer_cmd_lock(mmplayer_t *player);
+gboolean _mmplayer_cmd_trylock(mmplayer_t *player);
+void _mmplayer_cmd_unlock(mmplayer_t *player);
media_format_mimetype_e _mmplayer_convert_audio_pcm_str_to_media_format_mime(const gchar *audio_pcm_str);
#ifdef __cplusplus
}
/* create player lock and cond */
- g_mutex_init(&new_player->cmd_lock);
+ MMPLAYER_CMD_LOCK_INIT(new_player);
g_mutex_init(&new_player->reconfigure_lock);
g_cond_init(&new_player->reconfigure_cond);
if (new_player) {
_mmplayer_destroy((MMHandleType)new_player);
- g_mutex_clear(&new_player->cmd_lock);
+ MMPLAYER_CMD_LOCK_DEINIT(new_player);
g_mutex_clear(&new_player->reconfigure_lock);
g_cond_clear(&new_player->reconfigure_cond);
MMPLAYER_FREEIF(new_player);
MMPLAYER_CMD_UNLOCK(player);
- g_mutex_clear(&((mmplayer_t *)player)->cmd_lock);
+ MMPLAYER_CMD_LOCK(player);
+ MMPLAYER_CMD_UNLOCK(player);
+
+ MMPLAYER_CMD_LOCK_DEINIT(player);
g_mutex_clear(&((mmplayer_t *)player)->reconfigure_lock);
g_cond_clear(&((mmplayer_t *)player)->reconfigure_cond);
#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)
return FALSE;
}
+
+void _mmplayer_cmd_lock_init(mmplayer_t *player)
+{
+ MMPLAYER_FENTER();
+ 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;
+ MMPLAYER_FLEAVE();
+}
+
+void _mmplayer_cmd_lock_deinit(mmplayer_t *player)
+{
+ MMPLAYER_FENTER();
+ 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);
+ MMPLAYER_FLEAVE();
+}
+
+void _mmplayer_cmd_lock(mmplayer_t *player)
+{
+ guint64 queue_me;
+ GCond *cond;
+ GMutex *mutex;
+
+ MMPLAYER_FENTER();
+ 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);
+ MMPLAYER_FLEAVE();
+}
+
+gboolean _mmplayer_cmd_trylock(mmplayer_t *player)
+{
+ GMutex *mutex;
+
+ MMPLAYER_FENTER();
+ MMPLAYER_RETURN_VAL_IF_FAIL(player && player->cmd_lock, FALSE);
+
+ mutex = &player->cmd_lock->ticket_mutex;
+
+ if (!g_mutex_trylock(mutex)) {
+ MMPLAYER_FLEAVE();
+ return FALSE;
+ }
+
+ if (player->cmd_lock->ticket_queue_tail != player->cmd_lock->ticket_queue_head) {
+ g_mutex_unlock(mutex);
+ MMPLAYER_FLEAVE();
+ return FALSE;
+ }
+ g_mutex_unlock(mutex);
+
+ _mmplayer_cmd_lock(player);
+ MMPLAYER_FLEAVE();
+ return TRUE;
+}
+
+void _mmplayer_cmd_unlock(mmplayer_t *player)
+{
+ GCond *cond;
+ GMutex *mutex;
+
+ MMPLAYER_FENTER();
+ 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);
+ MMPLAYER_FLEAVE();
+}