tizen 2.3.1 release
[framework/multimedia/libmm-player.git] / src / include / mm_player_utils.h
index 81214bd..e22d500 100755 (executable)
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef __MMF_PLAYER_UTILS_H__
-#define __MMF_PLAYER_UTILS_H__
+#ifndef __MM_PLAYER_UTILS_H__
+#define __MM_PLAYER_UTILS_H__
 
 #include <glib.h>
 #include <gst/gst.h>
@@ -54,20 +54,55 @@ do \
                g_mutex_lock(cmd_lock); \
        else \
        { \
-               debug_log("don't get command lock"); \
+               debug_log("no command lock"); \
                return MM_ERROR_PLAYER_NOT_INITIALIZED; \
        } \
-} while (0);
+} while (0)
 
 #define MMPLAYER_CMD_UNLOCK(x_player)  g_mutex_unlock( ((mm_player_t*)x_player)->cmd_lock )
-
 #define MMPLAYER_MSG_POST_LOCK(x_player)       g_mutex_lock( ((mm_player_t*)x_player)->msg_cb_lock )
 #define MMPLAYER_MSG_POST_UNLOCK(x_player)     g_mutex_unlock( ((mm_player_t*)x_player)->msg_cb_lock )
-
 #define MMPLAYER_GET_ATTRS(x_player)           ((mm_player_t*)x_player)->attrs
 
-/* sbs : for bluetooth */
-#define MAX_SOUND_DEVICE_LEN   18      
+#define MMPLAYER_PLAYBACK_LOCK(x_player) \
+do \
+{ \
+       GMutex* playback_lock = ((mm_player_t *)x_player)->playback_lock; \
+       if (playback_lock) \
+       {       \
+               debug_log("lock playback_lock"); \
+               g_mutex_lock(playback_lock); \
+       }       \
+       else \
+       { \
+               debug_log("no playback lock"); \
+       } \
+} while (0)
+
+#define MMPLAYER_PLAYBACK_UNLOCK(x_player) \
+do \
+{ \
+       GMutex* playback_lock = ((mm_player_t *)x_player)->playback_lock; \
+       if (playback_lock) \
+       {       \
+               g_mutex_unlock( ((mm_player_t*)x_player)->playback_lock );      \
+               debug_log("unlock playback_lock"); \
+       }       \
+       else \
+       { \
+               debug_warning("can't unlock> no playback lock"); \
+       } \
+} while (0)
+
+#if 0
+#define MMPLAYER_FENTER();                                     debug_fenter();
+#define MMPLAYER_FLEAVE();                                     debug_fleave();
+#else
+#define MMPLAYER_FENTER();
+#define MMPLAYER_FLEAVE();
+#endif
+
+#define MAX_SOUND_DEVICE_LEN   18
 
 /* element linking */
 #ifdef GST_EXT_PAD_LINK_UNCHECKED
@@ -80,6 +115,7 @@ do \
 #define GST_ELEMENT_LINK_FILTERED      gst_element_link_filtered
 #define GST_ELEMENT_LINK_MANY          gst_element_link_many
 #define GST_ELEMENT_LINK                       gst_element_link
+#define GST_ELEMENT_UNLINK                     gst_element_unlink
 #define GST_ELEMENT_LINK_PADS          gst_element_link_pads
 #define GST_PAD_LINK                           gst_pad_link
 #endif
@@ -92,7 +128,7 @@ do \
        caps_type = gst_caps_to_string(x_caps); \
        debug_log ("caps: %s\n", caps_type ); \
        MMPLAYER_FREEIF (caps_type) \
-} while (0);
+} while (0)
 
 /* message posting */
 #define MMPLAYER_POST_MSG( x_player, x_msgtype, x_msg_param ) \
@@ -101,10 +137,9 @@ __mmplayer_post_message(x_player, x_msgtype, x_msg_param);
 
 /* setting player state */
 #define MMPLAYER_SET_STATE( x_player, x_state ) \
-debug_log("setting player state to %d\n", x_state); \
+debug_log("update state machine to %d\n", x_state); \
 __mmplayer_set_state(x_player, x_state);
 
-
 #define MMPLAYER_CHECK_STATE_RETURN_IF_FAIL( x_player, x_command ) \
 debug_log("checking player state before doing %s\n", #x_command); \
 switch ( __mmplayer_check_state(x_player, x_command) ) \
@@ -116,11 +151,13 @@ switch ( __mmplayer_check_state(x_player, x_command) ) \
        case MM_ERROR_PLAYER_NO_OP: \
                return MM_ERROR_NONE; \
        break; \
+       case MM_ERROR_PLAYER_DOING_SEEK: \
+               return MM_ERROR_PLAYER_DOING_SEEK; \
        default: \
        break; \
 }
 
-/* setting element state */ 
+/* setting element state */
 #define MMPLAYER_ELEMENT_SET_STATE( x_element, x_state ) \
 debug_log("setting state [%s:%d] to [%s]\n", #x_state, x_state, GST_ELEMENT_NAME( x_element ) ); \
 if ( GST_STATE_CHANGE_FAILURE == gst_element_set_state ( x_element, x_state) ) \
@@ -142,27 +179,6 @@ if ( x_player->cmd == MMPLAYER_COMMAND_UNREALIZE || x_player->cmd == MMPLAYER_CO
        debug_log("it's exit state...\n");\
        goto ERROR;  \
 }
-/* volume */
-/* 
-|----|-------|-------|-------|-------|
-|Res. | HFK(7)  |  BT(7)  |  E.J(7)  | SPK(7) |
-|----|-------|-------|-------|-------|
-*/
-
-/* 090424 Fix me : Currently volume is 0~9, so bt volume can be only 0.0 ~ 0.9 */
-#define GET_VOLUME_BT(volume) (volume/10.)
-
-#if 0
-#define GET_VOLUME_SPK(volume) ((volume) & 0x7F)
-#define GET_VOLUME_EARJACK(volume) ((volume >> 7)& 0x7F)
-#define GET_VOLUME_HFK(volume) ((volume >> 21) & 0x7F)
-
-#define SET_VOLUME_SPK(volume,input) (volume |= (input &0x7F))
-#define SET_VOLUME_EARJACK(volume,input) (volume |= ((input & 0x7F)<<7))
-#define SET_VOLUME_BT(volume,input) (volume |= ((input & 0x7F)<<14))
-#define SET_VOLUME_HFK(volume,input) (volume |= ((input & 0x7F)<<21))
-#endif
-
 
 /* pad probe for pipeilne debugging */
 gboolean __util_gst_pad_probe(GstPad *pad, GstBuffer *buffer, gpointer u_data);
@@ -176,8 +192,8 @@ gboolean __util_gst_pad_probe(GstPad *pad, GstBuffer *buffer, gpointer u_data);
 #define MM_PROBE_CLOCK_TIME                    (1 << 5)
 /* ... add more */
 
-/* messages are treated as warnings bcz those code should not be checked in. 
- * and no error handling will supported for same manner. 
+/* messages are treated as warnings bcz those code should not be checked in.
+ * and no error handling will supported for same manner.
  */
 #define MMPLAYER_ADD_PROBE(x_pad, x_flag) \
 debug_warning("adding pad probe\n"); \
@@ -191,15 +207,14 @@ if ( ! gst_pad_add_buffer_probe(x_pad, \
 
 /* generating dot */
 #define MMPLAYER_GENERATE_DOT_IF_ENABLED( x_player, x_name ) \
-if ( PLAYER_INI()->generate_dot ) \
+if ( x_player->ini.generate_dot ) \
 { \
-       debug_log("generating dot file(%s)\n", #x_name); \
        GST_DEBUG_BIN_TO_DOT_FILE (GST_BIN (player->pipeline->mainbin[MMPLAYER_M_PIPE].gst), \
        GST_DEBUG_GRAPH_SHOW_ALL, x_name); \
 }
 
 /* signal manipulation */
-#define MMPLAYER_SIGNAL_CONNECT( x_player, x_object, x_signal, x_callback, x_arg ) \
+#define MMPLAYER_SIGNAL_CONNECT( x_player, x_object, x_type, x_signal, x_callback, x_arg ) \
 do \
 { \
        MMPlayerSignalItem* item = NULL; \
@@ -213,62 +228,98 @@ do \
                item->obj = G_OBJECT( x_object ); \
                item->sig = g_signal_connect( G_OBJECT(x_object), x_signal, \
                                        x_callback, x_arg ); \
-               x_player->signals = g_list_append(x_player->signals, item); \
+               if ((x_type >= MM_PLAYER_SIGNAL_TYPE_AUTOPLUG) && (x_type < MM_PLAYER_SIGNAL_TYPE_MAX)) \
+                       x_player->signals[x_type] = g_list_append(x_player->signals[x_type], item); \
+               else \
+                       debug_error("wrong signal type [%d]\n", x_type ); \
        } \
 } while ( 0 );
 
+/* release element resource */
+#define MMPLAYER_RELEASE_ELEMENT( x_player, x_bin, x_id ) \
+do \
+{ \
+       if (x_bin[x_id].gst) \
+       { \
+               gst_element_set_state(x_bin[x_id].gst, GST_STATE_NULL); \
+               gst_bin_remove(GST_BIN(x_player->pipeline->mainbin[MMPLAYER_M_PIPE].gst), x_bin[x_id].gst); \
+               x_bin[x_id].gst = NULL; \
+               debug_log("release done [element %d]", x_id); \
+       } \
+} while ( 0 )
 
 /* state */
-#define        MMPLAYER_PREV_STATE(x_player)           ((mm_player_t*)x_player)->prev_state 
-#define        MMPLAYER_CURRENT_STATE(x_player)                ((mm_player_t*)x_player)->state 
-#define        MMPLAYER_PENDING_STATE(x_player)                ((mm_player_t*)x_player)->pending_state 
-#define        MMPLAYER_TARGET_STATE(x_player)         ((mm_player_t*)x_player)->target_state 
+#define        MMPLAYER_PREV_STATE(x_player)           ((mm_player_t*)x_player)->prev_state
+#define        MMPLAYER_CURRENT_STATE(x_player)                ((mm_player_t*)x_player)->state
+#define        MMPLAYER_PENDING_STATE(x_player)                ((mm_player_t*)x_player)->pending_state
+#define        MMPLAYER_TARGET_STATE(x_player)         ((mm_player_t*)x_player)->target_state
 #define        MMPLAYER_STATE_GET_NAME(state) __get_state_name(state)
 
 #define        MMPLAYER_PRINT_STATE(x_player) \
-debug_log("-----------------------PLAYER STATE-------------------------\n"); \
-debug_log(" prev %s, current %s, pending %s, target %s \n", \
+debug_log("-- prev %s, current %s, pending %s, target %s --\n", \
        MMPLAYER_STATE_GET_NAME(MMPLAYER_PREV_STATE(x_player)), \
        MMPLAYER_STATE_GET_NAME(MMPLAYER_CURRENT_STATE(x_player)), \
        MMPLAYER_STATE_GET_NAME(MMPLAYER_PENDING_STATE(x_player)), \
-       MMPLAYER_STATE_GET_NAME(MMPLAYER_TARGET_STATE(x_player))); \
-debug_log("------------------------------------------------------------\n"); 
-
+       MMPLAYER_STATE_GET_NAME(MMPLAYER_TARGET_STATE(x_player)));
 
-#define        MMPLAYER_STATE_CHANGE_TIMEOUT(x_player )         ((mm_player_t*)x_player)->state_change_timeout 
+#define        MMPLAYER_STATE_CHANGE_TIMEOUT(x_player )         ((mm_player_t*)x_player)->state_change_timeout
 
 /* streaming */
 #define MMPLAYER_IS_STREAMING(x_player)                        __is_streaming(x_player)
 #define MMPLAYER_IS_RTSP_STREAMING(x_player)   __is_rtsp_streaming(x_player)
+#define MMPLAYER_IS_WFD_STREAMING(x_player)    __is_wfd_streaming(x_player)
 #define MMPLAYER_IS_HTTP_STREAMING(x_player)   __is_http_streaming(x_player)
 #define MMPLAYER_IS_HTTP_PD(x_player)                  __is_http_progressive_down(x_player)
 #define MMPLAYER_IS_HTTP_LIVE_STREAMING(x_player)  __is_http_live_streaming(x_player)
 #define MMPLAYER_IS_LIVE_STREAMING(x_player)   __is_live_streaming(x_player)
+#define MMPLAYER_IS_DASH_STREAMING(x_player)   __is_dash_streaming(x_player)
+#define MMPLAYER_IS_SMOOTH_STREAMING(x_player)   __is_smooth_streaming(x_player)
+
+#define MMPLAYER_URL_HAS_DASH_SUFFIX(x_player) __has_suffix(x_player, "mpd")
+#define MMPLAYER_URL_HAS_HLS_SUFFIX(x_player) __has_suffix(x_player, "m3u8")
 
 /* etc */
 #define        MMF_PLAYER_FILE_BACKUP_PATH             "/tmp/media_temp."
 #define        MMPLAYER_PT_IS_AUDIO( x_pt )            ( strstr(x_pt, "_97") || strstr(x_pt, "audio") )
 #define        MMPLAYER_PT_IS_VIDEO( x_pt )            ( strstr(x_pt, "_96") || strstr(x_pt, "video") )
 
+#define MMPLAYER_VIDEO_SINK_CHECK(x_player) \
+do \
+{ \
+       return_val_if_fail ( x_player && \
+               x_player->pipeline && \
+               x_player->pipeline->videobin && \
+               x_player->pipeline->videobin[MMPLAYER_V_SINK].gst, \
+               MM_ERROR_PLAYER_NOT_INITIALIZED ); \
+} while(0)
+
+enum
+{
+       MMPLAYER_DISPLAY_NULL = 0,
+       MMPLAYER_DISPLAY_HDMI_ACTIVE,
+       MMPLAYER_DISPLAY_MIRRORING_ACTIVE,
+};
+
 bool util_is_sdp_file ( const char *path );
 int64_t uti_get_time ( void );
 int util_get_rank_increase ( const char *factory_class );
 int util_factory_rank_compare(GstPluginFeature *f1, GstPluginFeature *f2); // @
-
-
-bool util_exist_file_path(const char *file_path);
+int util_exist_file_path(const char *file_path);
 bool util_write_file_backup(const char *backup_path, char *data_ptr, int data_size);
 bool util_remove_file_backup(const char *backup_path); /* For Midi Player */
-
 int util_is_midi_type_by_mem(void *mem, int size);
 int util_is_midi_type_by_file(const char *file_path);
-
 char** util_get_cookie_list ( const char *cookies );
 bool util_check_valid_url ( const char *proxy );
+const char* util_get_charset(const char *file_path);
+
+int util_get_is_connected_external_display(void);
+gboolean util_is_miracast_connected(void);
+int util_get_pixtype(unsigned int fourcc);
 
 #ifdef __cplusplus
        }
 #endif
 
-#endif /* __MMF_PLAYER_UTILS_H__ */
+#endif /* __MM_PLAYER_UTILS_H__ */