support rtsp playback
[platform/core/multimedia/libmm-player.git] / src / mm_player_utils.c
index 1f03baf..4d273d3 100644 (file)
 #include <storage.h>
 #include <tzplatform_config.h>
 #include "mm_player_utils.h"
+#include "media_format.h"
 
 #define MEDIA_PATH_EXTERNAL tzplatform_getenv(TZ_SYS_STORAGE) /* external storage, sd card, usb */
+#define FD_NUM_FOR_DEBUG 10
 
 const gchar *
-__get_stream_type_name(int type)
+_mmplayer_get_stream_type_name(int type)
 {
        switch (type) {
        case MM_PLAYER_STREAM_TYPE_AUDIO:
@@ -54,7 +56,7 @@ __get_stream_type_name(int type)
 }
 
 const gchar *
-__get_state_name(int state)
+_mmplayer_get_state_name(int state)
 {
        switch (state) {
        case MM_PLAYER_STATE_NULL:
@@ -73,7 +75,7 @@ __get_state_name(int state)
 }
 
 gboolean
-__is_rtsp_streaming(mm_player_t *player)
+_mmplayer_is_rtsp_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -81,7 +83,7 @@ __is_rtsp_streaming(mm_player_t *player)
 }
 
 gboolean
-__is_http_streaming(mm_player_t *player)
+_mmplayer_is_http_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -89,24 +91,25 @@ __is_http_streaming(mm_player_t *player)
 }
 
 gboolean
-__is_streaming(mm_player_t *player)
+_mmplayer_is_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
-       return (__is_rtsp_streaming(player) || __is_http_streaming(player)
-               || __is_http_live_streaming(player) || __is_dash_streaming(player) || __is_smooth_streaming(player)) ? TRUE : FALSE;
+       return (_mmplayer_is_rtsp_streaming(player) || _mmplayer_is_http_streaming(player)
+               || _mmplayer_is_http_live_streaming(player) || _mmplayer_is_dash_streaming(player)
+               || _mmplayer_is_smooth_streaming(player)) ? TRUE : FALSE;
 }
 
 gboolean
-__is_live_streaming(mm_player_t *player)
+_mmplayer_is_live_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
-       return (__is_rtsp_streaming(player) && player->streaming_type == STREAMING_SERVICE_LIVE) ? TRUE : FALSE;
+       return (_mmplayer_is_rtsp_streaming(player) && player->streaming_type == STREAMING_SERVICE_LIVE) ? TRUE : FALSE;
 }
 
 gboolean
-__is_http_live_streaming(mm_player_t *player)
+_mmplayer_is_http_live_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -114,7 +117,7 @@ __is_http_live_streaming(mm_player_t *player)
 }
 
 gboolean
-__is_dash_streaming(mm_player_t *player)
+_mmplayer_is_dash_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -122,7 +125,7 @@ __is_dash_streaming(mm_player_t *player)
 }
 
 gboolean
-__is_smooth_streaming(mm_player_t *player)
+_mmplayer_is_smooth_streaming(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -130,7 +133,7 @@ __is_smooth_streaming(mm_player_t *player)
 }
 
 gboolean
-__is_ms_buff_src(mm_player_t *player)
+_mmplayer_is_ms_buff_src(mmplayer_t *player)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
@@ -138,7 +141,7 @@ __is_ms_buff_src(mm_player_t *player)
 }
 
 gboolean
-__has_suffix(mm_player_t *player, const gchar *suffix)
+_mmplayer_has_suffix(mmplayer_t *player, const gchar *suffix)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
        MMPLAYER_RETURN_VAL_IF_FAIL(suffix, FALSE);
@@ -146,9 +149,12 @@ __has_suffix(mm_player_t *player, const gchar *suffix)
        gboolean ret = FALSE;
        gchar *t_url = g_ascii_strdown(player->profile.uri, -1);
        gchar *t_suffix = g_ascii_strdown(suffix, -1);
+       gchar *opt = strchr(t_url, '?');
 
-       if (g_str_has_suffix(player->profile.uri, suffix))
-               ret = TRUE;
+       if (opt)
+               *opt = '\0';
+
+       ret = g_str_has_suffix(t_url, t_suffix);
 
        MMPLAYER_FREEIF(t_url);
        MMPLAYER_FREEIF(t_suffix);
@@ -157,14 +163,43 @@ __has_suffix(mm_player_t *player, const gchar *suffix)
 }
 
 gboolean
-__mmplayer_post_message(mm_player_t *player, enum MMMessageType msgtype, MMMessageParamType *param)
+_mmplayer_is_videosink_ready(mmplayer_t *player, int surface_type)
+{
+       int curr_type = MM_DISPLAY_SURFACE_NUM;
+
+       if (!player ||
+               !player->pipeline ||
+               !player->pipeline->mainbin ||
+               !player->pipeline->videobin ||
+               !player->pipeline->videobin[MMPLAYER_V_BIN].gst ||
+               !player->pipeline->videobin[MMPLAYER_V_SINK].gst) {
+               LOGW("videosink is not ready yet");
+               return FALSE;
+       }
+
+       if (surface_type == MM_DISPLAY_SURFACE_NUM) /* don't care the surface type */
+               return TRUE;
+
+       mm_attrs_get_int_by_name(player->attrs, "display_surface_type", &curr_type);
+
+       if (curr_type != surface_type) {
+               LOGW("surface type is mismatched %d, %d", curr_type, surface_type);
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+_mmplayer_post_message(mmplayer_t *player, enum MMMessageType msgtype, MMMessageParamType *param)
 {
        MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
 
        if (!player->msg_cb)
                return FALSE;
-
-       //LOGD("Message (type : %d)  will be posted using msg-cb(%p).", msgtype, player->msg_cb);
+#ifdef __DEBUG__
+       LOGD("Message (type : %d)  will be posted using msg-cb(%p).", msgtype, player->msg_cb);
+#endif
 
        player->msg_cb(msgtype, param, player->msg_cb_param);
 
@@ -172,7 +207,7 @@ __mmplayer_post_message(mm_player_t *player, enum MMMessageType msgtype, MMMessa
 }
 
 gboolean
-__mmplayer_dump_pipeline_state(mm_player_t *player)
+_mmplayer_dump_pipeline_state(mmplayer_t *player)
 {
        GstIterator *iter = NULL;
        gboolean done = FALSE;
@@ -192,6 +227,8 @@ __mmplayer_dump_pipeline_state(mm_player_t *player)
                player->pipeline->mainbin,
                FALSE);
 
+       MMPLAYER_GENERATE_DOT_IF_ENABLED(player, "pipeline-status-error-dump");
+
        iter = gst_bin_iterate_recurse(GST_BIN(player->pipeline->mainbin[MMPLAYER_M_PIPE].gst));
 
        if (iter != NULL) {
@@ -199,12 +236,14 @@ __mmplayer_dump_pipeline_state(mm_player_t *player)
                        switch (gst_iterator_next(iter, &item)) {
                        case GST_ITERATOR_OK:
                                element = g_value_get_object(&item);
-                               gst_element_get_state(element, &state, &pending, time);
-
-                               factory = gst_element_get_factory(element) ;
-                               if (factory)
-                                       LOGE("%s:%s : From:%s To:%s   refcount : %d", GST_OBJECT_NAME(factory) , GST_ELEMENT_NAME(element) ,
-                                               gst_element_state_get_name(state), gst_element_state_get_name(pending) , GST_OBJECT_REFCOUNT_VALUE(element));
+                               if (element) {
+                                       gst_element_get_state(element, &state, &pending, time);
+
+                                       factory = gst_element_get_factory(element) ;
+                                       if (factory)
+                                               LOGE("%s:%s : From:%s To:%s   refcount : %d", GST_OBJECT_NAME(factory) , GST_ELEMENT_NAME(element) ,
+                                                       gst_element_state_get_name(state), gst_element_state_get_name(pending) , GST_OBJECT_REFCOUNT_VALUE(element));
+                               }
                                g_value_reset(&item);
                                break;
                        case GST_ITERATOR_RESYNC:
@@ -246,7 +285,7 @@ __mmplayer_dump_pipeline_state(mm_player_t *player)
 }
 
 int
-util_exist_file_path(const char *file_path)
+_mmplayer_exist_file_path(const char *file_path)
 {
        int fd = 0;
        struct stat stat_results = {0, };
@@ -271,18 +310,23 @@ util_exist_file_path(const char *file_path)
                LOGE("failed to get file status");
        } else if (stat_results.st_size == 0) {
                LOGE("file size is zero");
+               if (fd < FD_NUM_FOR_DEBUG)
+                       LOGW("close fd %d", fd);
                close(fd);
                return MM_ERROR_PLAYER_FILE_NOT_FOUND;
-       } else
+       } else {
                LOGW("file size : %lld bytes", (long long)stat_results.st_size);
+       }
 
+       if (fd < FD_NUM_FOR_DEBUG)
+               LOGW("close fd %d", fd);
        close(fd);
 
        return MM_ERROR_NONE;
 }
 
 char **
-util_get_cookie_list(const char *cookies)
+_mmplayer_get_cookie_list(const char *cookies)
 {
        char **cookie_list = NULL;
        char *temp = NULL;
@@ -325,7 +369,7 @@ EXIT:
 
 /* check the given path is indicating sdp file */
 bool
-util_is_sdp_file(const char *path)
+_mmplayer_is_sdp_file(const char *path)
 {
        gboolean ret = FALSE;
        gchar *uri = NULL;
@@ -363,7 +407,7 @@ util_is_sdp_file(const char *path)
 }
 
 const char *
-util_get_charset(const char *file_path)
+_mmplayer_get_charset(const char *file_path)
 {
        UCharsetDetector *ucsd;
        const UCharsetMatch *ucm;
@@ -434,16 +478,16 @@ done:
 }
 
 int
-util_get_pixtype(unsigned int fourcc)
+_mmplayer_get_pixtype(unsigned int fourcc)
 {
        int pixtype = MM_PIXEL_FORMAT_INVALID;
 
-    /*
+#ifdef __DEBUG__
        char *pfourcc = (char *)&fourcc;
 
        LOGD("fourcc(%c%c%c%c)",
                pfourcc[0], pfourcc[1], pfourcc[2], pfourcc[3]);
-    */
+#endif
 
        switch (fourcc) {
        case GST_MAKE_FOURCC('S', 'N', '1', '2'):
@@ -509,10 +553,10 @@ util_get_pixtype(unsigned int fourcc)
 }
 
 static int
-_util_storage_supported_cb(int storage_id, storage_type_e type,
+__mmplayer_storage_supported_cb(int storage_id, storage_type_e type,
        storage_state_e state, const char *path, void *user_data)
 {
-       MMPlayerStorageInfo *storage_info = (MMPlayerStorageInfo *)user_data;
+       mmplayer_storage_info_t *storage_info = (mmplayer_storage_info_t *)user_data;
 
        MMPLAYER_RETURN_VAL_IF_FAIL(storage_info, FALSE);
 
@@ -526,7 +570,7 @@ _util_storage_supported_cb(int storage_id, storage_type_e type,
 }
 
 bool
-util_get_storage_info(const char *path, MMPlayerStorageInfo *storage_info)
+_mmplayer_get_storage_info(const char *path, mmplayer_storage_info_t *storage_info)
 {
        int ret = 0;
        const char *file_path = path;
@@ -542,7 +586,7 @@ util_get_storage_info(const char *path, MMPlayerStorageInfo *storage_info)
                memset(storage_info->path, 0x00, MM_MAX_URL_LEN);
                g_snprintf(storage_info->path, MM_MAX_URL_LEN, "%s", file_path);
 
-               ret = storage_foreach_device_supported((storage_device_supported_cb)_util_storage_supported_cb, storage_info);
+               ret = storage_foreach_device_supported((storage_device_supported_cb)__mmplayer_storage_supported_cb, storage_info);
                if (ret != STORAGE_ERROR_NONE) {
                        LOGE("failed to check supported storage 0x%x", ret);
                        return false;
@@ -560,3 +604,57 @@ util_get_storage_info(const char *path, MMPlayerStorageInfo *storage_info)
        LOGD("storage info %d:%d:%d", storage_info->type, storage_info->id, storage_info->state);
        return true;
 }
+
+media_format_mimetype_e _mmplayer_convert_audio_pcm_str_to_media_format_mime(const gchar *audio_pcm_str)
+{
+       if (!audio_pcm_str) {
+               LOGW("audio pcm str is NULL");
+               return MEDIA_FORMAT_MAX;
+       }
+
+       if (strstr(audio_pcm_str, "S16LE"))
+               return MEDIA_FORMAT_PCM_S16LE;
+       else if (strstr(audio_pcm_str, "S24LE"))
+               return MEDIA_FORMAT_PCM_S24LE;
+       else if (strstr(audio_pcm_str, "S32LE"))
+               return MEDIA_FORMAT_PCM_S32LE;
+       else if (strstr(audio_pcm_str, "S16BE"))
+               return MEDIA_FORMAT_PCM_S16BE;
+       else if (strstr(audio_pcm_str, "S24BE"))
+               return MEDIA_FORMAT_PCM_S24BE;
+       else if (strstr(audio_pcm_str, "S32BE"))
+               return MEDIA_FORMAT_PCM_S32BE;
+       else if (strstr(audio_pcm_str, "F32LE"))
+               return MEDIA_FORMAT_PCM_F32LE;
+       else if (strstr(audio_pcm_str, "F32BE"))
+               return MEDIA_FORMAT_PCM_F32BE;
+       else if (strstr(audio_pcm_str, "U16LE"))
+               return MEDIA_FORMAT_PCM_U16LE;
+       else if (strstr(audio_pcm_str, "U24LE"))
+               return MEDIA_FORMAT_PCM_U24LE;
+       else if (strstr(audio_pcm_str, "U32LE"))
+               return MEDIA_FORMAT_PCM_U32LE;
+       else if (strstr(audio_pcm_str, "U16BE"))
+               return MEDIA_FORMAT_PCM_U16BE;
+       else if (strstr(audio_pcm_str, "U24BE"))
+               return MEDIA_FORMAT_PCM_U24BE;
+       else if (strstr(audio_pcm_str, "U32BE"))
+               return MEDIA_FORMAT_PCM_U32BE;
+       else {
+               LOGW("Not supported audio pcm format str : %s", audio_pcm_str);
+               return MEDIA_FORMAT_MAX;
+       }
+}
+
+gboolean _mmplayer_use_uridecodebin3(mmplayer_t *player) /* MMPLAYER_USE_URIDECODEBIN3(player) */
+{
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
+
+       if (MMPLAYER_IS_MS_BUFF_SRC(player))
+               return FALSE;
+
+       if (!player->ini.use_uridecodebin3)
+               return FALSE;
+
+       return TRUE;
+}