[0.6.230] Use FIFO ticket lock when use command lock
[platform/core/multimedia/libmm-player.git] / src / include / mm_player_priv.h
index aa44c5d..dc3bd70 100644 (file)
 #include <tbm_bufmgr.h>
 #include <storage.h>
 #include "mm_player.h"
-#include "mm_player_internal.h"
 #include "mm_player_audioeffect.h"
 #include "mm_message.h"
 #include "mm_player_ini.h"
 #include <mm_resource_manager.h>
 #include "mm_player_streaming.h"
+#include "mm_player_attrs.h"
 
 /*===========================================================================================
 |                                                                                                                                                                                      |
@@ -70,6 +70,8 @@
 
 #define VIDEO360_MAX_ZOOM      10.0f
 
+#define DEFAULT_NUM_OF_V_OUT_BUFFER            4
+
 /*---------------------------------------------------------------------------
 |    GLOBAL CONSTANT DEFINITIONS:                                                                                      |
 ---------------------------------------------------------------------------*/
@@ -163,6 +165,7 @@ typedef enum {
        /* it could be a decodebin or could be a typefind. depends on player ini */
        MMPLAYER_M_TYPEFIND,
        MMPLAYER_M_AUTOPLUG,
+       MMPLAYER_M_AUTOPLUG_PARSEBIN,
 
        MMPLAYER_M_AUTOPLUG_V_DEC,
        MMPLAYER_M_AUTOPLUG_A_DEC,
@@ -191,6 +194,9 @@ typedef enum {
        MMPLAYER_M_V_INPUT_SELECTOR,    // video input_select
        MMPLAYER_M_A_INPUT_SELECTOR,    // audio input_select
        MMPLAYER_M_T_INPUT_SELECTOR,    // text input_select
+       MMPLAYER_M_V_CONCAT,    // video concat
+       MMPLAYER_M_A_CONCAT,    // audio concat
+       MMPLAYER_M_T_CONCAT,    // text concat
        MMPLAYER_M_NUM
 } main_element_id_e;
 
@@ -201,15 +207,21 @@ enum audio_element_id {
        MMPLAYER_A_VOL,
        MMPLAYER_A_FILTER,
        MMPLAYER_A_FILTER_SEC,
-       MMPLAYER_A_CAPS_DEFAULT,
        MMPLAYER_A_CONV_BFORMAT,
        MMPLAYER_A_CAPS_360,
        MMPLAYER_A_SINK,
        MMPLAYER_A_RESAMPLER,
-       MMPLAYER_A_DEINTERLEAVE,
        MMPLAYER_A_RGVOL,
        MMPLAYER_A_CONV_PITCH,
        MMPLAYER_A_PITCH,
+       MMPLAYER_A_TEE,
+       MMPLAYER_A_TEE_Q1,
+       MMPLAYER_A_TEE_Q2,
+       MMPLAYER_A_EXTRACT_CONV,
+       MMPLAYER_A_EXTRACT_RESAMPLER,
+       MMPLAYER_A_EXTRACT_CAPS,
+       MMPLAYER_A_EXTRACT_DEINTERLEAVE,
+       MMPLAYER_A_EXTRACT_SINK,
        MMPLAYER_A_NUM
 };
 
@@ -356,6 +368,13 @@ typedef enum {
        MMFILE_AMBISONIC_ORDER_TOA = 3,                 /**< Third order Ambisonics */
 } mmfile_ambisonic_order_e;
 
+typedef enum {
+       MMPLAYER_RESOURCE_TYPE_VIDEO_DECODER,
+       MMPLAYER_RESOURCE_TYPE_VIDEO_OVERLAY,
+       MMPLAYER_RESOURCE_TYPE_AUDIO_OFFLOAD,
+       MMPLAYER_RESOURCE_TYPE_MAX,
+} mmplayer_resource_type_e;
+
 /*---------------------------------------------------------------------------
 |    GLOBAL DATA TYPE DEFINITIONS:                                                                                     |
 ---------------------------------------------------------------------------*/
@@ -375,8 +394,7 @@ typedef struct {
 
 typedef struct {
        float volume;
-       int mute;
-       int bluetooth;  /* enable/disable */
+       bool mute;
        bool rg_enable;
 } mmplayer_sound_info_t;
 
@@ -414,7 +432,7 @@ typedef struct {
        bool rich_audio;
        bool video_zc; // video zero-copy
        bool subtitle_off;
-       bool media_packet_video_stream;
+       bool video_export;
 } mmplayer_setting_mode_t; /* FIXME: renaming */
 
 typedef struct {
@@ -435,12 +453,12 @@ typedef struct {
 } mmplayer_video_roi_t;
 
 typedef struct {
-       gint active_pad_index;
+       gint active_track_index;
        gint total_track_num;
-       GPtrArray *channels;
-       gulong block_id;
-       gulong event_probe_id;
-} mmplayer_selector_t;
+       GPtrArray *streams;
+       gulong block_id;                /* FIXME: will be removed */
+       gulong event_probe_id;  /* FIXME: will be removed */
+} mmplayer_track_t;
 
 typedef struct {
        gboolean running;
@@ -457,12 +475,11 @@ typedef struct {
 typedef struct {
        int channel;
        int bitrate;
-       int depth;
-       bool is_little_endian;
        guint64 channel_mask;
        void *pcm_data;
        int data_size;
        int buff_size;
+       media_format_mimetype_e pcm_format;
 } mmplayer_audio_stream_buff_t;
 
 /**
@@ -487,6 +504,13 @@ typedef struct {
 } 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;
@@ -523,8 +547,9 @@ typedef struct {
        int cmd;
 
        /* command lock */
-       GMutex cmd_lock;
-       GMutex playback_lock;
+       mmplayer_ticket_lock_t *cmd_lock;
+       GMutex reconfigure_lock;
+       GCond reconfigure_cond;
 
        /* gapless play thread */
        GThread *gapless_play_thread;
@@ -556,6 +581,7 @@ typedef struct {
 
        /* player attributes */
        MMHandleType attrs;
+       mmplayer_attrs_spec_t *default_attrs;
 
        /* message callback */
        MMMessageCallback msg_cb;
@@ -572,27 +598,14 @@ typedef struct {
 
        guint64 media_stream_buffer_max_size[MM_PLAYER_STREAM_TYPE_MAX];
        guint media_stream_buffer_min_percent[MM_PLAYER_STREAM_TYPE_MAX];
-       mm_player_media_stream_buffer_status_callback media_stream_buffer_status_cb[MM_PLAYER_STREAM_TYPE_MAX];
-       mm_player_media_stream_seek_data_callback media_stream_seek_data_cb[MM_PLAYER_STREAM_TYPE_MAX];
-       GMutex media_stream_cb_lock;
-
-       int video_num_buffers;  /* total num of buffers in vcodec */
-       int video_extra_num_buffers; /* extra num of buffers in vcodec */
-
-       void *buffer_cb_user_param[MM_PLAYER_STREAM_TYPE_MAX];
-       void *seek_cb_user_param[MM_PLAYER_STREAM_TYPE_MAX];
-
-       /* video stream changed callback */
-       mm_player_stream_changed_callback video_stream_changed_cb;
-       void *video_stream_changed_cb_user_param;
 
        /* audio stream changed callback */
        mm_player_stream_changed_callback audio_stream_changed_cb;
        void *audio_stream_changed_cb_user_param;
 
        /* video stream callback */
-       mm_player_video_stream_callback video_stream_cb;
-       void *video_stream_cb_user_param;
+       mm_player_video_decoded_callback video_decoded_cb;
+       void *video_decoded_cb_user_param;
        GCond video_bo_cond;
        GMutex video_bo_mutex;
        GList *video_bo_list; /* mmplayer_video_bo_info_t, bo list for decoded video data by sw codec */
@@ -600,10 +613,10 @@ typedef struct {
        bool video_stream_prerolled;
 
        /* audio stream callback */
-       mm_player_audio_stream_callback audio_stream_render_cb;
-       void *audio_stream_cb_user_param;
-       bool audio_stream_sink_sync;
+       mm_player_audio_decoded_callback audio_decoded_cb;
+       void *audio_decoded_cb_user_param;
        GList *audio_stream_buff_list; /* mmplayer_audio_stream_buff_t, buff list of extract pcm data */
+       mmplayer_audio_extract_opt_e audio_extract_opt;
 
        /* video capture callback*/
        gulong video_capture_cb_probe_id;
@@ -613,6 +626,7 @@ typedef struct {
 
        /* type string */
        gchar *type;
+       GstCaps *type_caps;
 
        /* video stream caps parsed by demuxer */
        GstCaps *v_stream_caps;
@@ -634,6 +648,8 @@ typedef struct {
        gboolean no_more_pad;
        gint num_dynamic_pad;
        gboolean has_many_types;
+       gboolean need_audio_dec_sorting;
+       gboolean need_video_dec_sorting;
 
        /* progress callback timer */
        /* FIXIT : since duplicated functionality with get_position
@@ -686,6 +702,10 @@ typedef struct {
        /* list of sink elements */
        GList *sink_elements;
 
+       /* for destroy bus thread */
+       GMutex bus_watcher_mutex;
+       GCond bus_watcher_cond;
+
        /* signal notifiers */
        GList *signals[MM_PLAYER_SIGNAL_TYPE_MAX];
        guint bus_watcher;
@@ -705,8 +725,7 @@ typedef struct {
 
        /* resource manager for H/W resources */
        mm_resource_manager_h resource_manager;
-       mm_resource_manager_res_h video_overlay_resource;
-       mm_resource_manager_res_h video_decoder_resource;
+       mm_resource_manager_res_h hw_resource[MMPLAYER_RESOURCE_TYPE_MAX];
        gboolean interrupted_by_resource;
 
        gboolean is_subtitle_off;
@@ -732,10 +751,11 @@ typedef struct {
        GCond subtitle_info_cond;
        GMutex subtitle_info_mutex;
 
-       /* To store the current running audio pad index of demuxer */
-       gint demux_pad_index;
+       /* stream collection */
+       GstStreamCollection *collection;
+       guint stream_notify_id;
 
-       mmplayer_selector_t selector[MM_PLAYER_TRACK_TYPE_MAX];
+       mmplayer_track_t track[MM_PLAYER_TRACK_TYPE_MAX];
 
        guint internal_text_idx;
        guint external_text_idx;
@@ -786,6 +806,8 @@ typedef struct {
        /* build audio offload */
        gboolean build_audio_offload;
        guint audio_device_cb_id;
+
+       int client_pid;
 } mmplayer_t;
 
 typedef struct {
@@ -800,16 +822,6 @@ typedef struct {
        FILE *dump_element_file;
 } mmplayer_dump_t;
 
-typedef struct {
-       char *name;
-       int value_type;
-       int flags;                              // r, w
-       void *default_value;
-       int valid_type;                 // validity type
-       int value_min;                  //<- set validity value range
-       int value_max;          //->
-} mmplayer_attrs_spec_t;
-
 /*===========================================================================================
 |                                                                                                                                                                                      |
 |  GLOBAL FUNCTION PROTOTYPES                                                                                                                          |
@@ -823,33 +835,31 @@ int _mmplayer_create_player(MMHandleType hplayer);
 int _mmplayer_destroy(MMHandleType hplayer);
 int _mmplayer_realize(MMHandleType hplayer);
 int _mmplayer_unrealize(MMHandleType hplayer);
-int _mmplayer_get_state(MMHandleType hplayer, int *pstate);
-int _mmplayer_set_volume(MMHandleType hplayer, mmplayer_volume_type_t volume);
-int _mmplayer_get_volume(MMHandleType hplayer, mmplayer_volume_type_t *volume);
-int _mmplayer_set_mute(MMHandleType hplayer, int mute);
-int _mmplayer_get_mute(MMHandleType hplayer, int *pmute);
+int _mmplayer_get_state(MMHandleType hplayer, int *state);
+int _mmplayer_set_volume(MMHandleType hplayer, float volume);
+int _mmplayer_get_volume(MMHandleType hplayer, float *volume);
+int _mmplayer_set_mute(MMHandleType hplayer, bool mute);
+int _mmplayer_get_mute(MMHandleType hplayer, bool *mute);
 int _mmplayer_start(MMHandleType hplayer);
 int _mmplayer_stop(MMHandleType hplayer);
 int _mmplayer_pause(MMHandleType hplayer);
 int _mmplayer_abort_pause(MMHandleType hplayer);
 int _mmplayer_resume(MMHandleType hplayer);
 int _mmplayer_set_position(MMHandleType hplayer, gint64 pos);
-int _mmplayer_get_position(MMHandleType hplayer, gint64 *pos);
 int _mmplayer_get_duration(MMHandleType hplayer, gint64 *duration);
 int _mmplayer_adjust_subtitle_postion(MMHandleType hplayer, int pos);
 int _mmplayer_set_playspeed(MMHandleType hplayer, float rate, bool streaming);
 int _mmplayer_set_message_callback(MMHandleType hplayer, MMMessageCallback callback, void *user_param);
-int _mmplayer_set_videostream_changed_cb(MMHandleType hplayer, mm_player_stream_changed_callback callback, void *user_param);
 int _mmplayer_set_audiostream_changed_cb(MMHandleType hplayer, mm_player_stream_changed_callback callback, void *user_param);
-int _mmplayer_set_videostream_cb(MMHandleType hplayer, mm_player_video_stream_callback callback, void *user_param);
+int _mmplayer_set_video_decoded_cb(MMHandleType hplayer, mm_player_video_decoded_callback callback, void *user_param);
 int _mmplayer_set_subtitle_silent(MMHandleType hplayer, int silent);
 int _mmplayer_get_subtitle_silent(MMHandleType hplayer, int *silent);
 int _mmplayer_set_external_subtitle_path(MMHandleType hplayer, const char *filepath);
 int _mmplayer_get_buffer_position(MMHandleType hplayer, int *start_pos, int *end_pos);
-int _mmplayer_update_video_param(mmplayer_t *player, char *param_name);
-int _mmplayer_change_videosink(MMHandleType handle, MMDisplaySurfaceType surface_type, void *display_overlay);
+int _mmplayer_update_video_overlay_param(mmplayer_t *player, const char *param_name);
+int _mmplayer_change_videosink(MMHandleType handle, MMDisplaySurfaceType surface_type, int wl_surface_id);
 int _mmplayer_audio_effect_custom_apply(mmplayer_t *player);
-int _mmplayer_set_audiostream_cb(MMHandleType hplayer, bool sync, mm_player_audio_stream_callback callback, void *user_param);
+int _mmplayer_set_audio_decoded_cb(MMHandleType hplayer, mmplayer_audio_extract_opt_e opt, mm_player_audio_decoded_callback callback, void *user_param);
 int _mmplayer_change_track_language(MMHandleType hplayer, mmplayer_track_type_e type, int index);
 int _mmplayer_sync_subtitle_pipeline(mmplayer_t *player);
 int _mmplayer_use_system_clock(MMHandleType hplayer);
@@ -859,7 +869,6 @@ int _mmplayer_get_next_uri(MMHandleType hplayer, char **uri);
 int _mmplayer_has_closed_caption(MMHandleType hplayer, bool *exist);
 void _mm_player_video_stream_internal_buffer_unref(void *buffer);
 int _mmplayer_get_timeout(MMHandleType hplayer, int *timeout);
-int _mmplayer_get_num_of_video_out_buffers(MMHandleType hplayer, int *num, int *extra_num);
 int _mmplayer_manage_external_storage_state(MMHandleType hplayer, int id, int state);
 int _mmplayer_video_stream_release_bo(mmplayer_t *player, void *bo);
 int _mmplayer_get_adaptive_variant_info(MMHandleType hplayer, int *num, char **var_info);
@@ -868,34 +877,48 @@ int _mmplayer_get_max_adaptive_variant_limit(MMHandleType hplayer, int *bandwidt
 int _mmplayer_set_audio_only(MMHandleType hplayer, bool audio_only);
 int _mmplayer_get_audio_only(MMHandleType hplayer, bool *paudio_only);
 int _mmplayer_get_streaming_buffering_time(MMHandleType hplayer, int *prebuffer_ms, int *rebuffer_ms);
-int _mmplayer_set_codec_type(MMHandleType hplayer, mmplayer_stream_type_e stream_type, mmplayer_video_codec_type_e codec_type);
+int _mmplayer_set_codec_type(MMHandleType hplayer, mmplayer_stream_type_e stream_type, mmplayer_codec_type_e codec_type);
 int _mmplayer_set_replaygain_enabled(MMHandleType hplayer, bool enabled);
 int _mmplayer_is_replaygain_enabled(MMHandleType hplayer, bool *enabled);
 int _mmplayer_set_video_roi_area(MMHandleType hplayer, double scale_x, double scale_y, double scale_width, double scale_height);
 int _mmplayer_get_video_roi_area(MMHandleType hplayer, double *scale_x, double *scale_y, double *scale_width, double *scale_height);
+int _mmplayer_audio_offload_is_activated(MMHandleType hplayer, bool *activated);
+int _mmplayer_is_audio_control_available(MMHandleType hplayer, mmplayer_audio_control_opt_e opt, bool *available);
 
 /* internal */
-void __mmplayer_bus_msg_thread_destroy(MMHandleType hplayer);
-
-void __mmplayer_set_state(mmplayer_t *player, int state);
-int __mmplayer_check_state(mmplayer_t *player, mmplayer_command_state_e command);
-gboolean __mmplayer_update_content_attrs(mmplayer_t *player, enum content_attr_flag flag);
-void __mmplayer_cancel_eos_timer(mmplayer_t *player);
-void __mmplayer_audio_stream_clear_buffer(mmplayer_t *player, gboolean send_all);
-MMStreamingType __mmplayer_get_stream_service_type(mmplayer_t *player);
-int __mmplayer_get_video_angle(mmplayer_t *player, int *display_angle, int *orientations);
-gboolean __mmplayer_gst_remove_fakesink(mmplayer_t *player, mmplayer_gst_element_t *fakesink);
-void __mmplayer_add_signal_connection(mmplayer_t *player, GObject *object, mmplayer_signal_type_e type, const gchar *signal, GCallback cb_funct, gpointer u_data);
-void __mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data);
-gint __mmplayer_gst_decode_autoplug_select(GstElement *bin,  GstPad *pad, GstCaps *caps, GstElementFactory *factory, gpointer data);
-gboolean __mmplayer_gst_create_decoder(mmplayer_t *player, GstPad *srcpad, const GstCaps *caps);
-void __mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data);
-GstElement *__mmplayer_gst_make_decodebin(mmplayer_t *player);
-int __mmplayer_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket);
-int __mmplayer_gst_element_link_bucket(GList *element_bucket);
-void __mmplayer_typefind_have_type(GstElement *tf, guint probability, GstCaps *caps, gpointer data);
-int __mmplayer_parse_profile(const char *uri, void *param, mmplayer_parse_profile_t *data);
-
+void _mmplayer_bus_msg_thread_destroy(MMHandleType hplayer);
+void _mmplayer_bus_watcher_remove(MMHandleType hplayer);
+void _mmplayer_watcher_removed_notify(gpointer data);
+void _mmplayer_set_state(mmplayer_t *player, int state);
+int _mmplayer_check_state(mmplayer_t *player, mmplayer_command_state_e command);
+gboolean _mmplayer_update_content_attrs(mmplayer_t *player, enum content_attr_flag flag);
+void _mmplayer_cancel_eos_timer(mmplayer_t *player);
+void _mmplayer_audio_stream_clear_buffer(mmplayer_t *player, gboolean send_all);
+MMStreamingType _mmplayer_get_stream_service_type(mmplayer_t *player);
+int _mmplayer_get_video_angle(mmplayer_t *player, int *display_angle, int *orientations);
+gboolean _mmplayer_gst_remove_fakesink(mmplayer_t *player, mmplayer_gst_element_t *fakesink);
+void _mmplayer_add_signal_connection(mmplayer_t *player, GObject *object, mmplayer_signal_type_e type, const gchar *signal, GCallback cb_funct, gpointer u_data);
+void _mmplayer_gst_decode_pad_added(GstElement *elem, GstPad *pad, gpointer data);
+gint _mmplayer_gst_decode_autoplug_select(GstElement *bin,  GstPad *pad, GstCaps *caps, GstElementFactory *factory, gpointer data);
+GValueArray *_mmplayer_gst_decode_autoplug_sort(GstElement *bin, GstPad *pad, GstCaps *caps, GValueArray *factories, gpointer data);
+gboolean _mmplayer_gst_create_decoder(mmplayer_t *player, GstPad *srcpad, const GstCaps *caps);
+void _mmplayer_gst_element_added(GstElement *bin, GstElement *element, gpointer data);
+GstElement *_mmplayer_gst_make_decodebin(mmplayer_t *player);
+int _mmplayer_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket);
+int _mmplayer_gst_element_link_bucket(GList *element_bucket);
+void _mmplayer_typefind_have_type(GstElement *tf, guint probability, GstCaps *caps, gpointer data);
+int _mmplayer_parse_profile(const char *uri, void *param, mmplayer_parse_profile_t *data);
+int _mmplayer_set_client_pid(MMHandleType hplayer, int pid);
+void _mmplayer_set_reconfigure_state(mmplayer_t *player, gboolean state);
+void _mmplayer_gst_decode_pad_removed(GstElement *elem, GstPad *new_pad, gpointer data);
+void _mmplayer_gst_decode_no_more_pads(GstElement *elem, gpointer data);
+void _mmplayer_gst_decode_drained(GstElement *bin, gpointer data);
+void _mmplayer_gst_about_to_finish(GstElement *bin, gpointer data);
+void _mmplayer_gst_decode_unknown_type(GstElement *elem, GstPad *pad, GstCaps *caps, gpointer data);
+gboolean _mmplayer_gst_decode_autoplug_continue(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer data);
+void _mmplayer_pipeline_complete(GstElement *decodebin, gpointer data);
+void _mmplayer_set_audio_attrs(mmplayer_t *player, GstCaps *caps);
+int _mmplayer_acquire_hw_resource(mmplayer_t *player, mmplayer_resource_type_e type);
 
 #ifdef __cplusplus
        }