[0.6.198] restructure the player attribute 63/209363/8
authorEunhye Choi <eunhae1.choi@samsung.com>
Fri, 5 Jul 2019 07:15:15 +0000 (16:15 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Mon, 8 Jul 2019 11:11:19 +0000 (20:11 +0900)
- restructure the player attr to support array type
- refactoring about setting video display param

Change-Id: I53224139434ef251d6f0fe2d474e147ce0554523

packaging/libmm-player.spec
src/include/mm_player_attrs.h
src/include/mm_player_priv.h
src/include/mm_player_utils.h
src/mm_player_attrs.c
src/mm_player_priv.c
src/mm_player_utils.c

index 82c0f92..bc0cc88 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-player
 Summary:    Multimedia Framework Player Library
-Version:    0.6.197
+Version:    0.6.198
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 62d40aa..da46c4c 100644 (file)
 #define        __MM_PLAYER_ATTRS_H__
 
 #ifdef __cplusplus
-       extern "C" {
+extern "C" {
 #endif
 
+typedef enum {
+       MMPLAYER_ATTRS_PROFILE_URI,              /* 0 */
+       MMPLAYER_ATTRS_PROFILE_USER_PARAM,
+       MMPLAYER_ATTRS_PROFILE_PLAY_COUNT,
+       MMPLAYER_ATTRS_PROFILE_PREPARE_ASYNC,
+       MMPLAYER_ATTRS_STREAMING_USER_AGENT,
+       MMPLAYER_ATTRS_STREAMING_COOKIE,         /* 5 */
+       MMPLAYER_ATTRS_SUBTITLE_URI,
+       MMPLAYER_ATTRS_CONTENT_BITRATE,
+       MMPLAYER_ATTRS_CONTENT_MAX_BITRATE,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_FOUND,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_CODEC,      /* 10 */
+       MMPLAYER_ATTRS_CONTENT_VIDEO_BITRATE,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_FPS,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_WIDTH,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_HEIGHT,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_ORIENTATION,
+       MMPLAYER_ATTRS_CONTENT_VIDEO_IS_SPHERICAL,
+       MMPLAYER_ATTRS_CONTENT_AUDIO_CODEC,
+       MMPLAYER_ATTRS_CONTENT_AUDIO_BITRATE,
+       MMPLAYER_ATTRS_CONTENT_AUDIO_CHANNELS,
+       MMPLAYER_ATTRS_CONTENT_AUDIO_SAMPLERATE, /* 20 */
+       MMPLAYER_ATTRS_CONTENT_AUDIO_FORMAT,
+       MMPLAYER_ATTRS_CONTENT_TEXT_TRACK_NUM,
+       MMPLAYER_ATTRS_CONTENT_TEXT_TRACK_INDEX,
+       MMPLAYER_ATTRS_TAG_ARTIST,
+       MMPLAYER_ATTRS_TAG_TITLE,
+       MMPLAYER_ATTRS_TAG_ALBUM,
+       MMPLAYER_ATTRS_TAG_GENRE,
+       MMPLAYER_ATTRS_TAG_AUTHOR,
+       MMPLAYER_ATTRS_TAG_COPYRIGHT,
+       MMPLAYER_ATTRS_TAG_DATE,                 /* 30 */
+       MMPLAYER_ATTRS_TAG_DESCRIPTION,
+       MMPLAYER_ATTRS_TAG_TRACK_NUM,
+       MMPLAYER_ATTRS_TAG_ALBUM_COVER,
+       MMPLAYER_ATTRS_DISPLAY_ROTATION,
+       MMPLAYER_ATTRS_DISPLAY_VISIBLE,
+       MMPLAYER_ATTRS_DISPLAY_METHOD,
+       MMPLAYER_ATTRS_DISPLAY_OVERLAY,
+       MMPLAYER_ATTRS_DISPLAY_WIN_ROI_X,
+       MMPLAYER_ATTRS_DISPLAY_WIN_ROI_Y,
+       MMPLAYER_ATTRS_DISPLAY_WIN_ROI_WIDTH,    /* 40 */
+       MMPLAYER_ATTRS_DISPLAY_WIN_ROI_HEIGHT,
+       MMPLAYER_ATTRS_DISPLAY_SURFACE_TYPE,
+       MMPLAYER_ATTRS_SOUND_STREAM_TYPE,
+       MMPLAYER_ATTRS_SOUND_STREAM_INDEX,
+       MMPLAYER_ATTRS_SOUND_LATENCY_MODE,
+       MMPLAYER_ATTRS_PCM_EXTRACTION_SAMPLERATE,
+       MMPLAYER_ATTRS_PCM_EXTRACTION_CHANNELS,
+       MMPLAYER_ATTRS_ACCURATE_SEEK,
+       MMPLAYER_ATTRS_PCM_EXTRACTION_FORMAT,
+       MMPLAYER_ATTRS_DRC_MODE,                 /* 50 */
+       MMPLAYER_ATTRS_GAPLESS_MODE,
+       MMPLAYER_ATTRS_ENABLE_VIDEO_DECODED_CB,
+       MMPLAYER_ATTRS_VIDEO_CODEC_TYPE,
+       MMPLAYER_ATTRS_AUDIO_CODEC_TYPE,
+       MMPLAYER_ATTRS_VIDEO_BUFFER_TOTAL_SIZE,
+       MMPLAYER_ATTRS_VIDEO_BUFFER_EXTRA_SIZE,
+       MMPLAYER_ATTRS_PREBUFFER_MS,
+       MMPLAYER_ATTRS_REBUFFER_MS,
+       MMPLAYER_ATTRS_PITCH_CONTROL,
+       MMPLAYER_ATTRS_PITCH_VALUE,             /* 60 */
+       MMPLAYER_ATTRS_AUDIO_OFFLOAD,
+       MMPLAYER_ATTRS_NUM
+} mmplayer_attrs_id_e;
+
+typedef bool (*mmplayer_commit_func_t)(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+
+typedef struct {
+       mmplayer_attrs_id_e attrid;
+       char *name;
+       int value_type;
+       int flags;
+       union {
+               void *value_void;
+               char *value_string;
+               int value_int;
+               double value_double;
+       } default_value;
+       MMAttrsValidType valid_type;
+       union {
+               int *int_array;
+               int int_min;
+               double *double_array;
+               double double_min;
+       } validity_value_1;
+       union {
+               int int_max;
+               double double_max;
+               int count;
+       } validity_value_2;
+       mmplayer_commit_func_t attr_commit;  /* called before committing attr */
+} mmplayer_attrs_spec_t;
+
 /**
  * This function set values of attributes.
  *
index 9e79236..0fdbf4c 100644 (file)
@@ -802,16 +802,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                                                                                                                          |
@@ -846,7 +836,7 @@ 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_update_video_overlay_param(mmplayer_t *player, const char *param_name);
 int _mmplayer_change_videosink(MMHandleType handle, MMDisplaySurfaceType surface_type, void *display_overlay);
 int _mmplayer_audio_effect_custom_apply(mmplayer_t *player);
 int _mmplayer_set_audio_decoded_cb(MMHandleType hplayer, mmplayer_audio_extract_opt_e opt, mm_player_audio_decoded_callback callback, void *user_param);
index e0ffbc5..b0f9630 100644 (file)
@@ -300,6 +300,7 @@ gboolean _mmplayer_is_dash_streaming(mmplayer_t *player);
 gboolean _mmplayer_is_smooth_streaming(mmplayer_t *player);
 gboolean _mmplayer_is_ms_buff_src(mmplayer_t *player);
 gboolean _mmplayer_has_suffix(mmplayer_t *player, const gchar *suffix);
+gboolean _mmplayer_is_videosink_ready(mmplayer_t *player, int surface_type);
 
 gboolean _mmplayer_post_message(mmplayer_t *player, enum MMMessageType msgtype, MMMessageParamType *param);
 gboolean _mmplayer_dump_pipeline_state(mmplayer_t *player);
index 6f43df6..d46ea14 100644 (file)
 |                                                                                                                                                                                      |
 ========================================================================================== */
 
-/*---------------------------------------------------------------------------
-|    LOCAL FUNCTION PROTOTYPES:                                                                                                |
----------------------------------------------------------------------------*/
-int
-__mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name);
+/*-----------------------------------------------------------------------
+|    LOCAL FUNCTION PROTOTYPES:                                                |
+-----------------------------------------------------------------------*/
+static bool __mmplayer_commit_gapless_mode(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+static bool __mmplayer_commit_enable_video_decoded_cb(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+static bool __mmplayer_commit_audio_pitch_value(MMHandleType handle, int attr_idx, const MMAttrsValue *value);
+
+/*-----------------------------------------------------------------------
+|    LOCAL VARIABLE DEFINITIONS for internal                           |
+-----------------------------------------------------------------------*/
+mmplayer_attrs_spec_t player_attrs[] = {
+       {
+               MMPLAYER_ATTRS_PROFILE_URI,            /* ID */
+               (char *)"profile_uri",                 /* Name */
+               MM_ATTRS_TYPE_STRING,                  /* Value Type */
+               MM_ATTRS_FLAG_RW,                      /* Flag */
+               {(void *)NULL},                        /* default value */
+               MM_ATTRS_VALID_TYPE_NONE,              /* validity type */
+               {0},                                   /* validity min value */
+               {0},                                   /* validity max value */
+               NULL,                                  /* Runtime setting function of the attribute */
+       },
+       {
+               MMPLAYER_ATTRS_PROFILE_USER_PARAM,
+               (char *)"profile_user_param",
+               MM_ATTRS_TYPE_DATA,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PROFILE_PLAY_COUNT,
+               (char *)"profile_play_count",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)1},                        /* -1 : repeat continually */
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = -1},
+               {.int_max = 1},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PROFILE_PREPARE_ASYNC,
+               (char *)"profile_prepare_async",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = 1},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_STREAMING_USER_AGENT,
+               (char *)"streaming_user_agent",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_STREAMING_COOKIE,
+               (char *)"streaming_cookie",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_SUBTITLE_URI,
+               (char *)"subtitle_uri",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_BITRATE,
+               (char *)"content_bitrate",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_MAX_BITRATE,
+               (char *)"content_max_bitrate",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_FOUND,
+               (char *)"content_video_found",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = 1},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_CODEC,
+               (char *)"content_video_codec",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_BITRATE,
+               (char *)"content_video_bitrate",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_FPS,
+               (char *)"content_video_fps",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_WIDTH,
+               (char *)"content_video_width",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_HEIGHT,
+               (char *)"content_video_height",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_ORIENTATION,
+               (char *)"content_video_orientation",   /* orientation of video content */
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_VIDEO_IS_SPHERICAL,
+               (char *)"content_video_is_spherical",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)-1},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = -1},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_AUDIO_CODEC,
+               (char *)"content_audio_codec",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_AUDIO_BITRATE,
+               (char *)"content_audio_bitrate",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_AUDIO_CHANNELS,
+               (char *)"content_audio_channels",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_AUDIO_SAMPLERATE,
+               (char *)"content_audio_samplerate",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_AUDIO_FORMAT,
+               (char *)"content_audio_format",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_TEXT_TRACK_NUM,
+               (char *)"content_text_track_num",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_CONTENT_TEXT_TRACK_INDEX,
+               (char *)"current_text_track_index",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)-1},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = -1},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_ARTIST,
+               (char *)"tag_artist",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_TITLE,
+               (char *)"tag_title",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_ALBUM,
+               (char *)"tag_album",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_GENRE,
+               (char *)"tag_genre",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_AUTHOR,
+               (char *)"tag_author",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_COPYRIGHT,
+               (char *)"tag_copyright",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_DATE,
+               (char *)"tag_date",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_DESCRIPTION,
+               (char *)"tag_description",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_TRACK_NUM,
+               (char *)"tag_track_num",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_TAG_ALBUM_COVER,
+               (char *)"tag_album_cover",
+               MM_ATTRS_TYPE_DATA,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_ROTATION,
+               (char *)"display_rotation",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)MM_DISPLAY_ROTATION_NONE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MM_DISPLAY_ROTATION_NONE},
+               {.int_max = MM_DISPLAY_ROTATION_270},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_VISIBLE,
+               (char *)"display_visible",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_METHOD,
+               (char *)"display_method",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)MM_DISPLAY_METHOD_LETTER_BOX},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MM_DISPLAY_METHOD_LETTER_BOX},
+               {.int_max = MM_DISPLAY_METHOD_CUSTOM_ROI},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_OVERLAY,
+               (char *)"display_overlay",
+               MM_ATTRS_TYPE_DATA,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_WIN_ROI_X,
+               (char *)"display_win_roi_x",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MMPLAYER_MIN_INT},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_WIN_ROI_Y,
+               (char *)"display_win_roi_y",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MMPLAYER_MIN_INT},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_WIN_ROI_WIDTH,
+               (char *)"display_win_roi_width",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_WIN_ROI_HEIGHT,
+               (char *)"display_win_roi_height",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DISPLAY_SURFACE_TYPE,
+               (char *)"display_surface_type",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)MM_DISPLAY_SURFACE_NULL},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MM_DISPLAY_SURFACE_OVERLAY},
+               {.int_max = MM_DISPLAY_SURFACE_NUM - 1},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_SOUND_STREAM_TYPE,
+               (char *)"sound_stream_type",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_SOUND_STREAM_INDEX,
+               (char *)"sound_stream_index",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = -1},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_SOUND_LATENCY_MODE,
+               (char *)"sound_latency_mode",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)1},                         /* 0: low latency, 1: middle latency 2: high latency */
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = 2},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PCM_EXTRACTION_SAMPLERATE,
+               (char *)"pcm_extraction_samplerate", /* set samplerate for pcm extraction */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)44100},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PCM_EXTRACTION_CHANNELS,
+               (char *)"pcm_extraction_channels",   /* set channels for pcm extraction */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)1},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_ACCURATE_SEEK,
+               (char *)"accurate_seek",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)0},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = 0},
+               {.int_max = 1},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PCM_EXTRACTION_FORMAT,
+               (char *)"pcm_extraction_format",
+               MM_ATTRS_TYPE_STRING,
+               MM_ATTRS_FLAG_RW,
+               {(void *)NULL},
+               MM_ATTRS_VALID_TYPE_NONE,
+               {0},
+               {0},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_DRC_MODE,
+               (char *)"drc_mode",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_GAPLESS_MODE,
+               (char *)"gapless_mode",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               __mmplayer_commit_gapless_mode,
+       },
+       {
+               MMPLAYER_ATTRS_ENABLE_VIDEO_DECODED_CB,
+               (char *)"enable_video_decoded_cb",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               __mmplayer_commit_enable_video_decoded_cb,
+       },
+       {
+               MMPLAYER_ATTRS_VIDEO_CODEC_TYPE,
+               (char *)"video_codec_type",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)MM_PLAYER_CODEC_TYPE_DEFAULT},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MM_PLAYER_CODEC_TYPE_DEFAULT},
+               {.int_max = MM_PLAYER_CODEC_TYPE_SW},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_AUDIO_CODEC_TYPE,
+               (char *)"audio_codec_type",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)MM_PLAYER_CODEC_TYPE_DEFAULT},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MM_PLAYER_CODEC_TYPE_DEFAULT},
+               {.int_max = MM_PLAYER_CODEC_TYPE_SW},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_VIDEO_BUFFER_TOTAL_SIZE,
+               (char *)"video_buffer_total_size",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)DEFAULT_NUM_OF_V_OUT_BUFFER},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MMPLAYER_MIN_INT},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_VIDEO_BUFFER_EXTRA_SIZE,
+               (char *)"video_buffer_extra_size",
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)DEFAULT_NUM_OF_V_OUT_BUFFER},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MMPLAYER_MIN_INT},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PREBUFFER_MS,
+               (char *)"prebuffer_ms", /* user setting */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *) MIN_BUFFERING_TIME},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MIN_BUFFERING_TIME},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_REBUFFER_MS,
+               (char *)"rebuffer_ms", /* user setting */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *) MIN_BUFFERING_TIME},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = MIN_BUFFERING_TIME},
+               {.int_max = MMPLAYER_MAX_INT},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PITCH_CONTROL,
+               (char *)"pitch_control",        /* MM_PLAYER_PITCH_CONTROL */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               NULL,
+       },
+       {
+               MMPLAYER_ATTRS_PITCH_VALUE,
+               (char *)"pitch_value",          /* MM_PLAYER_PITCH_VALUE */
+               MM_ATTRS_TYPE_DOUBLE,
+               MM_ATTRS_FLAG_RW,
+               {.value_double = 1.0},
+               MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
+               {.double_min = 0.5},
+               {.double_max = 2},
+               __mmplayer_commit_audio_pitch_value,
+       },
+       {
+               MMPLAYER_ATTRS_AUDIO_OFFLOAD,
+               (char *)"audio_offload",        /* MM_PLAYER_AUDIO_OFFLOAD */
+               MM_ATTRS_TYPE_INT,
+               MM_ATTRS_FLAG_RW,
+               {(void *)FALSE},
+               MM_ATTRS_VALID_TYPE_INT_RANGE,
+               {.int_min = FALSE},
+               {.int_max = TRUE},
+               NULL,
+       },
+};
 
 /*===========================================================================================
 |                                                                                                                                                                                                              |
@@ -49,11 +738,125 @@ __mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name);
 |                                                                                                                                                                                                              |
 ========================================================================================== */
 
-int
-_mmplayer_get_attribute(MMHandleType handle,  char **err_attr_name, const char *attribute_name, va_list args_list)
+static bool __mmplayer_commit_enable_video_decoded_cb(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
+{
+       mmplayer_t *player = MM_PLAYER_CAST(handle);
+       mmplayer_gst_element_t *videobin = NULL;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(player && value, false);
+
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_NUM)) {
+               LOGD("will be applied when videosink is ready");
+               return true;
+       }
+
+       if (!player->set_mode.video_export) {
+               LOGW("there is no callback for enabling");
+               return true;
+       }
+
+       videobin = player->pipeline->videobin;
+
+       LOGD("[update plugin][videosink] handoff %d", value->value.i_val);
+
+       g_object_set(videobin[MMPLAYER_V_SINK].gst,
+                               "signal-handoffs", (value->value.i_val) ? TRUE : FALSE, NULL);
+
+       return true;
+}
+
+static bool __mmplayer_commit_gapless_mode(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
+{
+       mmplayer_t *player = MM_PLAYER_CAST(handle);
+       mmplayer_gst_element_t *videobin = NULL;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(player && value, false);
+
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_NUM)) {
+               LOGD("will be applied when videosink is ready");
+               return true;
+       }
+
+       videobin = player->pipeline->videobin;
+
+       if (value->value.i_val > 0) {
+               LOGD("[update plugin][videosink] disable last sample for gapless");
+               g_object_set(videobin[MMPLAYER_V_SINK].gst, "enable-last-sample", FALSE, NULL);
+       }
+
+       return true;
+}
+
+static bool __mmplayer_commit_audio_pitch_value(MMHandleType handle, int attr_idx, const MMAttrsValue *value)
+{
+       mmplayer_t *player = MM_PLAYER_CAST(handle);
+       mmplayer_pipeline_info_t *pipeline;
+       int pitch_control = 0;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(player && value, false);
+       MMPLAYER_RETURN_VAL_IF_FAIL(player->pipeline && player->pipeline->mainbin, true);
+
+       pipeline = player->pipeline;
+       mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_PITCH_CONTROL, &pitch_control);
+
+       if (!pitch_control || !pipeline->audiobin[MMPLAYER_A_PITCH].gst) {
+               LOGW("audio pitch is disabled");
+               return true;
+       }
+
+       LOGD("[update plugin][pitch] value to %1.3f", value->value.d_val);
+       g_object_set(pipeline->audiobin[MMPLAYER_A_PITCH].gst, "pitch", (value->value.d_val), NULL);
+
+       return true;
+}
+
+static void __mmplayer_print_attrs(const char *attr_name, const MMAttrsValue * value, const char *prefix)
+{
+       switch (value->type) {
+       case MM_ATTRS_TYPE_INT:
+               LOGD("[ %s : %s : %d ]", prefix, attr_name, value->value.i_val);
+               break;
+       case MM_ATTRS_TYPE_DOUBLE:
+               LOGD("[ %s : %s : %f ]", prefix, attr_name, value->value.d_val);
+               break;
+       case MM_ATTRS_TYPE_STRING:
+               LOGD("[ %s : %s : %s ]", prefix, attr_name, value->value.s_val);
+               break;
+       case MM_ATTRS_TYPE_DATA:
+               LOGD("[ %s : %s : %p ]", prefix, attr_name, value->value.p_val);
+               break;
+       default:
+               break;
+       }
+
+       return;
+}
+
+bool _mmplayer_commit_attribute(int attr_idx, const char *attr_name, const MMAttrsValue *value, void *user_data)
+{
+       bool ret = false;
+       mmplayer_t *player = MM_PLAYER_CAST(user_data);
+
+       MMPLAYER_RETURN_VAL_IF_FAIL(player && (attr_idx >= 0) && attr_name && value, false);
+
+       if (player_attrs[attr_idx].attr_commit) {
+               __mmplayer_print_attrs(attr_name, value, "Dynamic");
+               ret = player_attrs[attr_idx].attr_commit((MMHandleType)user_data, attr_idx, value);
+       } else {
+               __mmplayer_print_attrs(attr_name, value, "Static");
+               ret = true;
+       }
+
+       return ret;
+}
+
+int _mmplayer_get_attribute(MMHandleType handle,  char **err_attr_name, const char *attribute_name, va_list args_list)
 {
        int result = MM_ERROR_NONE;
-       MMHandleType attrs = 0;
+       MMHandleType attrs = NULL;
 
        /* NOTE : Don't need to check err_attr_name because it can be set NULL */
        /* if it's not want to know it. */
@@ -70,11 +873,37 @@ _mmplayer_get_attribute(MMHandleType handle,  char **err_attr_name, const char *
        return result;
 }
 
-int
-_mmplayer_set_attribute(MMHandleType handle,  char **err_attr_name, const char *attribute_name, va_list args_list)
+int __mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name)
+{
+       mmplayer_t *player = NULL;
+
+       MMPLAYER_FENTER();
+       MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
+       MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
+
+       player = MM_PLAYER_CAST(handle);
+
+       /* apply display attr value to player handle */
+       if (!g_strrstr(attribute_name, "display"))
+               return MM_ERROR_NONE;
+
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_NUM)) {
+               LOGD("will be applied when videosink is ready");
+               return MM_ERROR_NONE;
+       }
+
+       if (_mmplayer_update_video_overlay_param(player, attribute_name) != MM_ERROR_NONE) {
+               LOGW("not supported video param %s", attribute_name);
+               return MM_ERROR_NONE;
+       }
+
+       return MM_ERROR_NONE;
+}
+
+int _mmplayer_set_attribute(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list args_list)
 {
        int result = MM_ERROR_NONE;
-       MMHandleType attrs = 0;
+       MMHandleType attrs = NULL;
 
        /* NOTE : Don't need to check err_attr_name because it can be set NULL */
        /* if it's not want to know it. */
@@ -91,20 +920,21 @@ _mmplayer_set_attribute(MMHandleType handle,  char **err_attr_name, const char *
                return result;
        }
 
+       /* Note: 'attr_commit' function is called before committing the new value to attr struct.
+                so if there is a value to apply after committing, it should be added below function. */
        result = __mmplayer_apply_attribute(handle, attribute_name);
        if (result != MM_ERROR_NONE) {
                LOGE("failed to apply attributes");
                return result;
        }
 
-       return result;
+       return MM_ERROR_NONE;
 }
 
-int
-_mmplayer_get_attributes_info(MMHandleType handle,  const char *attribute_name, mmplayer_attrs_info_t *dst_info)
+int _mmplayer_get_attributes_info(MMHandleType handle,  const char *attribute_name, mmplayer_attrs_info_t *dst_info)
 {
        int result = MM_ERROR_NONE;
-       MMHandleType attrs = 0;
+       MMHandleType attrs = NULL;
        MMAttrsInfo src_info = {0, };
 
        MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
@@ -158,664 +988,22 @@ _mmplayer_get_attributes_info(MMHandleType handle,  const char *attribute_name,
        return result;
 }
 
-int
-__mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name)
-{
-       mmplayer_t *player = 0;
-
-       MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
-       MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
-
-       player = MM_PLAYER_CAST(handle);
-       mmplayer_pipeline_info_t *pipeline = player->pipeline;
-
-       /* before preparing, just keep the attr value */
-       MMPLAYER_RETURN_VAL_IF_FAIL(pipeline && pipeline->mainbin, MM_ERROR_NONE);
-
-       if (g_strrstr(attribute_name, MM_PLAYER_PITCH_VALUE)) {
-               int pitch_control = 0;
-               double pitch_value = 0;
-
-               mm_attrs_multiple_get(player->attrs, NULL,
-                                       MM_PLAYER_PITCH_CONTROL, &pitch_control,
-                                       MM_PLAYER_PITCH_VALUE, &pitch_value,
-                                       NULL);
-
-               if (!pitch_control || !pipeline->audiobin[MMPLAYER_A_PITCH].gst)
-                       return MM_ERROR_PLAYER_NO_OP;
-
-               LOGD("set pitch value to %1.3f", pitch_value);
-               g_object_set(pipeline->audiobin[MMPLAYER_A_PITCH].gst, "pitch", (gdouble)pitch_value, NULL);
-       }
-
-       /* Currently, there are only display related implementation at below */
-       if (!pipeline->videobin ||
-               !pipeline->videobin[MMPLAYER_V_SINK].gst) {
-               /*
-                * The attribute should be committed even though videobin is not created yet.
-                * So, true should be returned here.
-                * Otherwise, video can be diaplayed abnormal.
-                */
-               return MM_ERROR_NONE;
-       }
-
-       if (g_strrstr(attribute_name, "display")) {
-               char *param_name = NULL;
-               int str_len = strlen(attribute_name);
-               param_name = g_malloc0(str_len + 1);
-               if (!param_name) {
-                       LOGE("failed to alloc param_name");
-                       return MM_ERROR_PLAYER_INTERNAL;
-               }
-               strncpy(param_name, attribute_name, str_len);
-               param_name[str_len] = '\0';
-               LOGD(" param_name: %s", param_name);
-               if (MM_ERROR_NONE != _mmplayer_update_video_param(player, param_name)) {
-                       MMPLAYER_FREEIF(param_name);
-                       LOGE("failed to update video param");
-                       return MM_ERROR_PLAYER_INTERNAL;
-               }
-               MMPLAYER_FREEIF(param_name);
-       }
-
-       if (g_strrstr(attribute_name, MM_PLAYER_GAPLESS_MODE)) {
-               int gapless = 0;
-
-               mm_attrs_get_int_by_name(player->attrs, MM_PLAYER_GAPLESS_MODE, &gapless);
-               if (gapless > 0) {
-                       LOGD("disable last-sample at videosink");
-                       g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "enable-last-sample", FALSE, NULL);
-               }
-       }
-
-       if (g_strrstr(attribute_name, MM_PLAYER_ENABLE_VIDEO_DECODED_CB)) {
-               if (!player->set_mode.video_export) {
-                       LOGE("there is no callback to export video");
-                       return MM_ERROR_PLAYER_INTERNAL;
-               }
-               int enable = 0;
-               mm_attrs_get_int_by_name(player->attrs, "enable_video_decoded_cb", &enable);
-               g_object_set(player->pipeline->videobin[MMPLAYER_V_SINK].gst, "signal-handoffs", enable ? TRUE : FALSE, NULL);
-       }
-
-       return MM_ERROR_NONE;
-}
-
-MMHandleType
-_mmplayer_construct_attribute(MMHandleType handle)
+MMHandleType _mmplayer_construct_attribute(MMHandleType handle)
 {
        int result = MM_ERROR_NONE;
        int idx = 0;
-       MMHandleType attrs = 0;
+       MMHandleType attrs = NULL;
        int num_of_attrs = 0;
        MMAttrsConstructInfo *base = NULL;
 
        MMPLAYER_RETURN_VAL_IF_FAIL(handle, 0);
 
-       mmplayer_attrs_spec_t player_attrs[] = {
-               {
-                       "profile_uri",                                  // name
-                       MM_ATTRS_TYPE_STRING,           // type
-                       MM_ATTRS_FLAG_RW,                       // flag
-                       (void *)NULL,                           // default value
-                       MM_ATTRS_VALID_TYPE_NONE,       // validity type
-                       0,                                                      // validity min value
-                       0                                                       // validity max value
-               },
-               {
-                       "profile_user_param",
-                       MM_ATTRS_TYPE_DATA,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "profile_play_count",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)1,                      /* -1 : repeat continually */
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       -1,
-                       1
-               },
-               {
-                       "profile_prepare_async",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       1
-               },
-               {
-                       "streaming_user_agent",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "streaming_cookie",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "subtitle_uri",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "content_bitrate",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_max_bitrate",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_video_found",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       1
-               },
-               {
-                       "content_video_codec",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "content_video_bitrate",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_video_fps",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_video_width",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_video_height",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_audio_codec",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "content_audio_bitrate",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_audio_channels",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_audio_samplerate",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "content_audio_format",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "content_text_track_num",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "current_text_track_index",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)-1,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       -1,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "tag_artist",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_title",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_album",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL
-               },
-               {
-                       "tag_genre",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_author",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_copyright",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_date",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_description",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "tag_track_num",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "tag_album_cover",
-                       MM_ATTRS_TYPE_DATA,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "display_rotation",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)MM_DISPLAY_ROTATION_NONE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MM_DISPLAY_ROTATION_NONE,
-                       MM_DISPLAY_ROTATION_270
-               },
-               {
-                       "display_visible",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       1
-               },
-               {
-                       "display_method",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)MM_DISPLAY_METHOD_LETTER_BOX,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MM_DISPLAY_METHOD_LETTER_BOX,
-                       MM_DISPLAY_METHOD_CUSTOM_ROI
-               },
-               {
-                       "display_overlay",
-                       MM_ATTRS_TYPE_DATA,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "display_win_roi_x",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MMPLAYER_MIN_INT,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "display_win_roi_y",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MMPLAYER_MIN_INT,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "display_win_roi_width",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "display_win_roi_height",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "display_surface_type",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)MM_DISPLAY_SURFACE_NULL,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MM_DISPLAY_SURFACE_OVERLAY,
-                       MM_DISPLAY_SURFACE_NUM - 1
-               },
-               {
-                       "sound_stream_type",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "sound_stream_index",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       -1,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "sound_latency_mode",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)1,                      // 0: low latency, 1: middle latency 2: high latency
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       2
-               },
-               {
-                       "pcm_extraction_samplerate",    // set samplerate for pcm extraction
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)44100,                          // hz
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "pcm_extraction_channels",      // set channels for pcm extraction
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)1,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "accurate_seek",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)0,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       0,
-                       1
-               },
-               {
-                       "content_video_orientation",    // orientation of video content
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "pcm_extraction_format",
-                       MM_ATTRS_TYPE_STRING,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)NULL,
-                       MM_ATTRS_VALID_TYPE_NONE,
-                       0,
-                       0
-               },
-               {
-                       "drc_mode",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       FALSE,
-                       TRUE
-               },
-               {
-                       "gapless_mode",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       FALSE,
-                       TRUE
-               },
-               {
-                       "enable_video_decoded_cb",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       FALSE,
-                       TRUE
-               },
-               {
-                       "content_video_is_spherical",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)-1,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       -1,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "video_codec_type",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)MM_PLAYER_CODEC_TYPE_DEFAULT,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MM_PLAYER_CODEC_TYPE_DEFAULT,
-                       MM_PLAYER_CODEC_TYPE_SW
-               },
-               {
-                       "audio_codec_type",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)MM_PLAYER_CODEC_TYPE_DEFAULT,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MM_PLAYER_CODEC_TYPE_DEFAULT,
-                       MM_PLAYER_CODEC_TYPE_SW
-               },
-               {
-                       "video_buffer_total_size",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)DEFAULT_NUM_OF_V_OUT_BUFFER,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MMPLAYER_MIN_INT,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "video_buffer_extra_size",
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)DEFAULT_NUM_OF_V_OUT_BUFFER,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MMPLAYER_MIN_INT,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "prebuffer_ms", /* user setting */
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *) MIN_BUFFERING_TIME,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MIN_BUFFERING_TIME,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "rebuffer_ms", /* user setting */
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *) MIN_BUFFERING_TIME,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       MIN_BUFFERING_TIME,
-                       MMPLAYER_MAX_INT
-               },
-               {
-                       "audio_offload",        /* MM_PLAYER_AUDIO_OFFLOAD */
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       FALSE,
-                       TRUE
-               },
-               {
-                       "pitch_control",        /* MM_PLAYER_PITCH_CONTROL */
-                       MM_ATTRS_TYPE_INT,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)FALSE,
-                       MM_ATTRS_VALID_TYPE_INT_RANGE,
-                       FALSE,
-                       TRUE
-               },
-               {
-                       "pitch_value",          /* MM_PLAYER_PITCH_VALUE */
-                       MM_ATTRS_TYPE_DOUBLE,
-                       MM_ATTRS_FLAG_RW,
-                       (void *)1,
-                       MM_ATTRS_VALID_TYPE_DOUBLE_RANGE,
-                       0.5,
-                       2
-               },
-       };
-
        num_of_attrs = ARRAY_SIZE(player_attrs);
 
        base = g_try_new(MMAttrsConstructInfo, num_of_attrs);
        if (!base) {
                LOGE("failed to alloc attrs constructor");
-               return 0;
+               return NULL;
        }
 
        /* initialize values of attributes */
@@ -823,36 +1011,48 @@ _mmplayer_construct_attribute(MMHandleType handle)
                base[idx].name = player_attrs[idx].name;
                base[idx].value_type = player_attrs[idx].value_type;
                base[idx].flags = player_attrs[idx].flags;
-               base[idx].default_value = player_attrs[idx].default_value;
+               base[idx].default_value = player_attrs[idx].default_value.value_void; /* FIXME: need to consider the double data type */
        }
 
        result = mm_attrs_new(base, num_of_attrs, "mmplayer_attrs",
-                                                       NULL, NULL, &attrs);
+                                                       _mmplayer_commit_attribute, (void *)handle, &attrs);
 
        /* clean */
        MMPLAYER_FREEIF(base);
 
        if (result) {
                LOGE("failed to create player attrs");
-               return 0;
+               return NULL;
        }
 
        /* set validity type and range */
        for (idx = 0; idx < num_of_attrs; idx++) {
+               mm_attrs_set_valid_type(attrs, idx, player_attrs[idx].valid_type);
                switch (player_attrs[idx].valid_type) {
                case MM_ATTRS_VALID_TYPE_INT_RANGE:
-               {
-                       mm_attrs_set_valid_type(attrs, idx, MM_ATTRS_VALID_TYPE_INT_RANGE);
                        mm_attrs_set_valid_range(attrs, idx,
-                                       player_attrs[idx].value_min,
-                                       player_attrs[idx].value_max,
-                                       (int)(intptr_t)(player_attrs[idx].default_value));
-               }
+                                       player_attrs[idx].validity_value_1.int_min,
+                                       player_attrs[idx].validity_value_2.int_max,
+                                       player_attrs[idx].default_value.value_int);
                        break;
-
                case MM_ATTRS_VALID_TYPE_INT_ARRAY:
-               case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
+                       if (player_attrs[idx].validity_value_1.int_array &&
+                                       player_attrs[idx].validity_value_2.count > 0)
+                               mm_attrs_set_valid_array(attrs, idx,
+                                               (const int *)(player_attrs[idx].validity_value_1.int_array),
+                                               player_attrs[idx].validity_value_2.count,
+                                               player_attrs[idx].default_value.value_int);
+                       break;
                case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
+                       mm_attrs_set_valid_double_range(attrs, idx,
+                                       player_attrs[idx].validity_value_1.double_min,
+                                       player_attrs[idx].validity_value_2.double_max,
+                                       player_attrs[idx].default_value.value_double);
+                       break;
+               case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
+                       LOGW("FIXME: need to set range value if required.");
+               case MM_ATTRS_VALID_TYPE_NONE:
+               case MM_ATTRS_VALID_TYPE_INVALID:
                default:
                        break;
                }
@@ -862,23 +1062,22 @@ _mmplayer_construct_attribute(MMHandleType handle)
        if (mm_attrs_commit_all(attrs)) {
                LOGE("failed to update attributes");
                mm_attrs_free(attrs);
-               return 0;
+               return NULL;
        }
 
        return attrs;
 }
 
-bool
-_mmplayer_deconstruct_attribute(MMHandleType handle) // @
+bool _mmplayer_deconstruct_attribute(MMHandleType handle)
 {
        mmplayer_t *player = MM_PLAYER_CAST(handle);
 
-       MMPLAYER_RETURN_VAL_IF_FAIL(player, FALSE);
+       MMPLAYER_RETURN_VAL_IF_FAIL(player, false);
 
        if (player->attrs) {
                mm_attrs_free(player->attrs);
-               player->attrs = 0;
+               player->attrs = NULL;
        }
 
-       return TRUE;
+       return true;
 }
index bee6733..77de952 100644 (file)
@@ -1788,20 +1788,6 @@ __mmplayer_get_property_value_for_rotation(mmplayer_t *player, int display_angle
 }
 
 int
-__mmplayer_video_param_check_video_sink_bin(mmplayer_t *player)
-{
-       /* check video sinkbin is created */
-       MMPLAYER_RETURN_VAL_IF_FAIL(player &&
-               player->pipeline &&
-               player->pipeline->videobin &&
-               player->pipeline->videobin[MMPLAYER_V_BIN].gst &&
-               player->pipeline->videobin[MMPLAYER_V_SINK].gst,
-               MM_ERROR_PLAYER_NOT_INITIALIZED);
-
-       return MM_ERROR_NONE;
-}
-
-int
 _mmplayer_get_video_angle(mmplayer_t *player, int *display_angle, int *orientation)
 {
        int display_rotation = 0;
@@ -1861,8 +1847,7 @@ _mmplayer_get_video_angle(mmplayer_t *player, int *display_angle, int *orientati
        return MM_ERROR_NONE;
 }
 
-void
-__mmplayer_video_param_set_display_rotation(mmplayer_t *player)
+static void __mmplayer_video_param_set_display_rotation(mmplayer_t *player)
 {
        int rotation_value = 0;
        int orientations = 0; // current supported angle values are 0, 90, 180, 270
@@ -1870,7 +1855,7 @@ __mmplayer_video_param_set_display_rotation(mmplayer_t *player)
        MMPLAYER_FENTER();
 
        /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
 
        _mmplayer_get_video_angle(player, &display_angle, &orientations);
@@ -1881,15 +1866,14 @@ __mmplayer_video_param_set_display_rotation(mmplayer_t *player)
        LOGD("set video param : rotate %d", rotation_value);
 }
 
-void
-__mmplayer_video_param_set_display_visible(mmplayer_t *player)
+static void __mmplayer_video_param_set_display_visible(mmplayer_t *player)
 {
        MMHandleType attrs = 0;
        int visible = 0;
        MMPLAYER_FENTER();
 
        /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
 
        attrs = MMPLAYER_GET_ATTRS(player);
@@ -1900,15 +1884,14 @@ __mmplayer_video_param_set_display_visible(mmplayer_t *player)
        LOGD("set video param : visible %d", visible);
 }
 
-void
-__mmplayer_video_param_set_display_method(mmplayer_t *player)
+static void __mmplayer_video_param_set_display_method(mmplayer_t *player)
 {
        MMHandleType attrs = 0;
        int display_method = 0;
        MMPLAYER_FENTER();
 
        /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
 
        attrs = MMPLAYER_GET_ATTRS(player);
@@ -1919,18 +1902,15 @@ __mmplayer_video_param_set_display_method(mmplayer_t *player)
        LOGD("set video param : method %d", display_method);
 }
 
-void
-__mmplayer_video_param_set_video_roi_area(mmplayer_t *player)
+static void __mmplayer_video_param_set_video_roi_area(mmplayer_t *player)
 {
        MMHandleType attrs = 0;
        void *handle = NULL;
        MMPLAYER_FENTER();
 
        /* check video sinkbin is created */
-       if (__mmplayer_video_param_check_video_sink_bin(player) != MM_ERROR_NONE) {
-               LOGW("There is no video sink");
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
-       }
 
        attrs = MMPLAYER_GET_ATTRS(player);
        MMPLAYER_RETURN_IF_FAIL(attrs);
@@ -1944,8 +1924,7 @@ __mmplayer_video_param_set_video_roi_area(mmplayer_t *player)
        }
 }
 
-void
-__mmplayer_video_param_set_roi_area(mmplayer_t *player)
+static void __mmplayer_video_param_set_roi_area(mmplayer_t *player)
 {
        MMHandleType attrs = 0;
        void *handle = NULL;
@@ -1957,10 +1936,8 @@ __mmplayer_video_param_set_roi_area(mmplayer_t *player)
        MMPLAYER_FENTER();
 
        /* check video sinkbin is created */
-       if (__mmplayer_video_param_check_video_sink_bin(player) != MM_ERROR_NONE) {
-               LOGW("There is no video sink");
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
-       }
 
        attrs = MMPLAYER_GET_ATTRS(player);
        MMPLAYER_RETURN_IF_FAIL(attrs);
@@ -1983,14 +1960,13 @@ __mmplayer_video_param_set_roi_area(mmplayer_t *player)
        }
 }
 
-void
-__mmplayer_video_param_set_display_overlay(mmplayer_t *player)
+static void __mmplayer_video_param_set_display_overlay(mmplayer_t *player)
 {
        MMHandleType attrs = 0;
        void *handle = NULL;
 
        /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY))
                return;
 
        attrs = MMPLAYER_GET_ATTRS(player);
@@ -2014,17 +1990,19 @@ __mmplayer_video_param_set_display_overlay(mmplayer_t *player)
 }
 
 int
-__mmplayer_update_wayland_videosink_video_param(mmplayer_t *player, char *param_name)
+_mmplayer_update_video_overlay_param(mmplayer_t *player, const char *param_name)
 {
        gboolean update_all_param = FALSE;
+
        MMPLAYER_FENTER();
 
-       /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_OVERLAY)) {
+               LOGW("videosink is not ready yet");
                return MM_ERROR_PLAYER_NOT_INITIALIZED;
+       }
 
        if (strcmp(player->ini.videosink_element_overlay, "tizenwlsink")) {
-               LOGE("can not find tizenwlsink");
+               LOGE("invalid videosink [%s]", player->ini.videosink_element_overlay);
                return MM_ERROR_PLAYER_INTERNAL;
        }
 
@@ -2045,46 +2023,8 @@ __mmplayer_update_wayland_videosink_video_param(mmplayer_t *player, char *param_
        if (update_all_param)
                __mmplayer_video_param_set_video_roi_area(player);
 
-       return MM_ERROR_NONE;
-}
-
-int
-_mmplayer_update_video_param(mmplayer_t *player, char *param_name)
-{
-       MMHandleType attrs = 0;
-       int surface_type = 0;
-       int ret = MM_ERROR_NONE;
-
-       MMPLAYER_FENTER();
-
-       /* check video sinkbin is created */
-       if (MM_ERROR_NONE != __mmplayer_video_param_check_video_sink_bin(player))
-               return MM_ERROR_PLAYER_NOT_INITIALIZED;
-
-       attrs = MMPLAYER_GET_ATTRS(player);
-       if (!attrs) {
-               LOGE("cannot get content attribute");
-               return MM_ERROR_PLAYER_INTERNAL;
-       }
-       LOGD("param_name : %s", param_name);
-
-       /* update display surface */
-       mm_attrs_get_int_by_name(attrs, "display_surface_type", &surface_type);
-       LOGD("check display surface type attribute: %d", surface_type);
-
-       /* configuring display */
-       switch (surface_type) {
-       case MM_DISPLAY_SURFACE_OVERLAY:
-               {
-                       ret = __mmplayer_update_wayland_videosink_video_param(player, param_name);
-                       if (ret != MM_ERROR_NONE)
-                               return ret;
-               }
-               break;
-       }
 
        MMPLAYER_FLEAVE();
-
        return MM_ERROR_NONE;
 }
 
@@ -3520,6 +3460,9 @@ __mmplayer_gst_set_videosink_property(mmplayer_t *player, MMDisplaySurfaceType s
                                        "use-tbm", use_tbm, NULL);
                        }
                }
+
+               if (_mmplayer_update_video_overlay_param(player, "update_all_param") != MM_ERROR_NONE)
+                       return MM_ERROR_PLAYER_INTERNAL;
        } else {
                g_object_set(G_OBJECT(player->pipeline->videobin[MMPLAYER_V_SINK].gst),
                                                                                "sync", TRUE, "max-lateness", FAKE_SINK_MAX_LATENESS, NULL);
@@ -3552,9 +3495,6 @@ __mmplayer_gst_set_videosink_property(mmplayer_t *player, MMDisplaySurfaceType s
                                                                (gpointer)player);
        }
 
-       if (_mmplayer_update_video_param(player, "update_all_param") != MM_ERROR_NONE)
-               return MM_ERROR_PLAYER_INTERNAL;
-
        if (videobin[MMPLAYER_V_SINK].gst) {
                GstPad *sink_pad = NULL;
                sink_pad = gst_element_get_static_pad(videobin[MMPLAYER_V_SINK].gst, "sink");
@@ -5599,7 +5539,7 @@ _mmplayer_pause(MMHandleType hplayer)
                LOGE("failed to pause player. ret : 0x%x", ret);
 
        if (MMPLAYER_PREV_STATE(player) == MM_PLAYER_STATE_READY && MMPLAYER_CURRENT_STATE(player) == MM_PLAYER_STATE_PAUSED) {
-               if (MM_ERROR_NONE != _mmplayer_update_video_param(player, "display_rotation"))
+               if (_mmplayer_update_video_overlay_param(player, "display_rotation") != MM_ERROR_NONE)
                        LOGE("failed to update display_rotation");
        }
 
@@ -7725,8 +7665,8 @@ _mmplayer_change_videosink(MMHandleType handle, MMDisplaySurfaceType surface_typ
        player = MM_PLAYER_CAST(handle);
 
        /* check video sinkbin is created */
-       if (__mmplayer_video_param_check_video_sink_bin(player) == MM_ERROR_NONE) {
-               LOGE("Videosink is already created");
+       if (_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_NUM)) {
+               LOGW("Videosink is already created");
                return MM_ERROR_NONE;
        }
 
@@ -8719,7 +8659,7 @@ _mmplayer_set_video_roi_area(MMHandleType hplayer, double scale_x, double scale_
        player->video_roi.scale_height = scale_height;
 
        /* check video sinkbin is created */
-       if (__mmplayer_video_param_check_video_sink_bin(player) != MM_ERROR_NONE)
+       if (!_mmplayer_is_videosink_ready(player, MM_DISPLAY_SURFACE_NUM))
                return MM_ERROR_NONE;
 
        if (!gst_video_overlay_set_video_roi_area(
index 20cdf4d..c412f24 100644 (file)
@@ -162,6 +162,34 @@ _mmplayer_has_suffix(mmplayer_t *player, const gchar *suffix)
 }
 
 gboolean
+_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);