4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JongHyuk Choi <jhchoi.choi@samsung.com>, YeJin Cho <cho.yejin@samsung.com>,
7 * YoungHwan An <younghwan_.an@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
23 /*===========================================================================================
27 ========================================================================================== */
29 #include <mm_attrs_private.h>
31 #include "mm_player_utils.h"
32 #include "mm_player_priv.h"
33 #include "mm_player_attrs.h"
35 /*===========================================================================================
37 | LOCAL DEFINITIONS AND DECLARATIONS FOR MODULE |
39 ========================================================================================== */
41 /*---------------------------------------------------------------------------
42 | LOCAL FUNCTION PROTOTYPES: |
43 ---------------------------------------------------------------------------*/
45 __mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name);
47 /*===========================================================================================
49 | FUNCTION DEFINITIONS |
51 ========================================================================================== */
54 _mmplayer_get_attribute(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list args_list)
56 int result = MM_ERROR_NONE;
57 MMHandleType attrs = 0;
59 /* NOTE : Don't need to check err_attr_name because it can be set NULL */
60 /* if it's not want to know it. */
61 MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
62 MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
64 attrs = MM_PLAYER_GET_ATTRS(handle);
66 result = mm_attrs_get_valist(attrs, err_attr_name, attribute_name, args_list);
68 if ( result != MM_ERROR_NONE)
69 LOGE("failed to get %s attribute\n", attribute_name);
75 _mmplayer_set_attribute(MMHandleType handle, char **err_attr_name, const char *attribute_name, va_list args_list)
77 int result = MM_ERROR_NONE;
78 MMHandleType attrs = 0;
80 /* NOTE : Don't need to check err_attr_name because it can be set NULL */
81 /* if it's not want to know it. */
82 MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
83 MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
85 attrs = MM_PLAYER_GET_ATTRS(handle);
87 /* set attributes and commit them */
88 result = mm_attrs_set_valist(attrs, err_attr_name, attribute_name, args_list);
90 if (result != MM_ERROR_NONE)
92 LOGE("failed to set %s attribute\n", attribute_name);
96 result = __mmplayer_apply_attribute(handle, attribute_name);
97 if (result != MM_ERROR_NONE)
99 LOGE("failed to apply attributes\n");
107 _mmplayer_get_attributes_info(MMHandleType handle, const char *attribute_name, MMPlayerAttrsInfo *dst_info)
109 int result = MM_ERROR_NONE;
110 MMHandleType attrs = 0;
111 MMAttrsInfo src_info = {0, };
113 MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
114 MMPLAYER_RETURN_VAL_IF_FAIL(dst_info, MM_ERROR_COMMON_INVALID_ARGUMENT);
115 MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
117 attrs = MM_PLAYER_GET_ATTRS(handle);
119 result = mm_attrs_get_info_by_name(attrs, attribute_name, &src_info);
121 if ( result != MM_ERROR_NONE)
123 LOGE("failed to get attribute info\n");
127 memset(dst_info, 0x00, sizeof(MMPlayerAttrsInfo));
129 dst_info->type = src_info.type;
130 dst_info->flag = src_info.flag;
131 dst_info->validity_type= src_info.validity_type;
133 switch(src_info.validity_type)
135 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
136 dst_info->int_array.array = src_info.int_array.array;
137 dst_info->int_array.count = src_info.int_array.count;
138 dst_info->int_array.d_val = src_info.int_array.dval;
141 case MM_ATTRS_VALID_TYPE_INT_RANGE:
142 dst_info->int_range.min = src_info.int_range.min;
143 dst_info->int_range.max = src_info.int_range.max;
144 dst_info->int_range.d_val = src_info.int_range.dval;
147 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
148 dst_info->double_array.array = src_info.double_array.array;
149 dst_info->double_array.count = src_info.double_array.count;
150 dst_info->double_array.d_val = src_info.double_array.dval;
153 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
154 dst_info->double_range.min = src_info.double_range.min;
155 dst_info->double_range.max = src_info.double_range.max;
156 dst_info->double_range.d_val = src_info.double_range.dval;
167 __mmplayer_apply_attribute(MMHandleType handle, const char *attribute_name)
169 mm_player_t* player = 0;
171 MMPLAYER_RETURN_VAL_IF_FAIL(handle, MM_ERROR_COMMON_INVALID_ARGUMENT);
172 MMPLAYER_RETURN_VAL_IF_FAIL(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
174 player = MM_PLAYER_CAST(handle);
176 if ( g_strrstr(attribute_name, "display") || g_strrstr(attribute_name, "wl_window_render_x"))
178 int pipeline_type = 0;
179 MMPlayerGstPipelineInfo *pipeline = player->pipeline;
181 /* check videosink element is created */
183 return MM_ERROR_NONE;
184 mm_attrs_get_int_by_name(player->attrs, "pipeline_type", &pipeline_type);
185 if (pipeline_type == MM_PLAYER_PIPELINE_CLIENT) {
186 if(!pipeline->mainbin || !pipeline->mainbin[MMPLAYER_M_V_SINK].gst)
187 return MM_ERROR_NONE;
189 if(!pipeline->videobin || !pipeline->videobin[MMPLAYER_V_SINK].gst)
190 return MM_ERROR_NONE;
193 char *param_name = NULL;
194 int str_len = strlen(attribute_name);
195 param_name = g_malloc0(str_len);
197 LOGE("failed to alloc param_name");
198 return MM_ERROR_PLAYER_INTERNAL;
200 strncpy(param_name, attribute_name, str_len);
201 LOGD(" param_name: %s", param_name);
202 if ( MM_ERROR_NONE != _mmplayer_update_video_param( player, param_name))
205 LOGE("failed to update video param");
206 return MM_ERROR_PLAYER_INTERNAL;
211 return MM_ERROR_NONE;
215 _mmplayer_construct_attribute(MMHandleType handle)
217 mm_player_t *player = NULL;
219 MMHandleType attrs = 0;
220 int num_of_attrs = 0;
221 mmf_attrs_construct_info_t *base = NULL;
223 MMPLAYER_RETURN_VAL_IF_FAIL (handle, 0);
225 player = MM_PLAYER_CAST(handle);
227 MMPlayerAttrsSpec player_attrs[] =
230 "profile_uri", // name
231 MM_ATTRS_TYPE_STRING, // type
232 MM_ATTRS_FLAG_RW, // flag
233 (void *) NULL, // default value
234 MM_ATTRS_VALID_TYPE_NONE, // validity type
235 0, // validity min value
236 0 // validity max value
239 "profile_user_param",
243 MM_ATTRS_VALID_TYPE_NONE,
248 "profile_play_count",
251 (void *) 1, // -1 : repeat continually
252 MM_ATTRS_VALID_TYPE_INT_RANGE,
257 "profile_prepare_async",
261 MM_ATTRS_VALID_TYPE_INT_RANGE,
265 { /* update registry for downloadable codec */
266 "profile_update_registry",
270 MM_ATTRS_VALID_TYPE_INT_RANGE,
278 (void *) STREAMING_SERVICE_NONE,
279 MM_ATTRS_VALID_TYPE_INT_RANGE,
280 STREAMING_SERVICE_VOD,
281 STREAMING_SERVICE_NUM
284 "streaming_udp_timeout",
288 MM_ATTRS_VALID_TYPE_INT_RANGE,
293 "streaming_user_agent",
294 MM_ATTRS_TYPE_STRING,
297 MM_ATTRS_VALID_TYPE_NONE,
302 "streaming_wap_profile",
303 MM_ATTRS_TYPE_STRING,
306 MM_ATTRS_VALID_TYPE_NONE,
311 "streaming_network_bandwidth",
315 MM_ATTRS_VALID_TYPE_INT_RANGE,
321 MM_ATTRS_TYPE_STRING,
324 MM_ATTRS_VALID_TYPE_NONE,
330 MM_ATTRS_TYPE_STRING,
333 MM_ATTRS_VALID_TYPE_NONE,
341 (void *) -1, // DEFAULT_HTTP_TIMEOUT
342 MM_ATTRS_VALID_TYPE_INT_RANGE,
348 MM_ATTRS_TYPE_STRING,
351 MM_ATTRS_VALID_TYPE_NONE,
360 MM_ATTRS_VALID_TYPE_INT_RANGE,
369 MM_ATTRS_VALID_TYPE_INT_RANGE,
374 "content_max_bitrate",
378 MM_ATTRS_VALID_TYPE_INT_RANGE,
383 "content_video_found",
387 MM_ATTRS_VALID_TYPE_INT_RANGE,
392 "content_video_codec",
393 MM_ATTRS_TYPE_STRING,
396 MM_ATTRS_VALID_TYPE_NONE,
401 "content_video_bitrate",
405 MM_ATTRS_VALID_TYPE_INT_RANGE,
414 MM_ATTRS_VALID_TYPE_INT_RANGE,
419 "content_video_width",
423 MM_ATTRS_VALID_TYPE_INT_RANGE,
428 "content_video_height",
432 MM_ATTRS_VALID_TYPE_INT_RANGE,
437 "content_video_track_num",
441 MM_ATTRS_VALID_TYPE_INT_RANGE,
446 "content_audio_found",
450 MM_ATTRS_VALID_TYPE_INT_RANGE,
455 "content_audio_codec",
456 MM_ATTRS_TYPE_STRING,
459 MM_ATTRS_VALID_TYPE_NONE,
464 "content_audio_bitrate",
468 MM_ATTRS_VALID_TYPE_INT_RANGE,
473 "content_audio_channels",
477 MM_ATTRS_VALID_TYPE_INT_RANGE,
482 "content_audio_samplerate",
486 MM_ATTRS_VALID_TYPE_INT_RANGE,
491 "content_audio_track_num",
495 MM_ATTRS_VALID_TYPE_INT_RANGE,
500 "content_audio_format",
504 MM_ATTRS_VALID_TYPE_INT_RANGE,
509 "content_text_track_num",
513 MM_ATTRS_VALID_TYPE_INT_RANGE,
519 MM_ATTRS_TYPE_STRING,
522 MM_ATTRS_VALID_TYPE_NONE,
528 MM_ATTRS_TYPE_STRING,
531 MM_ATTRS_VALID_TYPE_NONE,
537 MM_ATTRS_TYPE_STRING,
543 MM_ATTRS_TYPE_STRING,
546 MM_ATTRS_VALID_TYPE_NONE,
552 MM_ATTRS_TYPE_STRING,
555 MM_ATTRS_VALID_TYPE_NONE,
561 MM_ATTRS_TYPE_STRING,
564 MM_ATTRS_VALID_TYPE_NONE,
570 MM_ATTRS_TYPE_STRING,
573 MM_ATTRS_VALID_TYPE_NONE,
579 MM_ATTRS_TYPE_STRING,
582 MM_ATTRS_VALID_TYPE_NONE,
591 MM_ATTRS_VALID_TYPE_INT_RANGE,
600 MM_ATTRS_VALID_TYPE_NONE,
605 "display_src_crop_x",
609 MM_ATTRS_VALID_TYPE_INT_RANGE,
614 "display_src_crop_y",
618 MM_ATTRS_VALID_TYPE_INT_RANGE,
623 "display_src_crop_width",
627 MM_ATTRS_VALID_TYPE_INT_RANGE,
632 "display_src_crop_height",
636 MM_ATTRS_VALID_TYPE_INT_RANGE,
645 MM_ATTRS_VALID_TYPE_INT_RANGE,
654 MM_ATTRS_VALID_TYPE_INT_RANGE,
663 MM_ATTRS_VALID_TYPE_INT_RANGE,
668 "display_roi_height",
672 MM_ATTRS_VALID_TYPE_INT_RANGE,
680 (void *) MM_DISPLAY_METHOD_CUSTOM_ROI_FULL_SCREEN,
681 MM_ATTRS_VALID_TYPE_INT_RANGE,
682 MM_DISPLAY_METHOD_CUSTOM_ROI_FULL_SCREEN,
683 MM_DISPLAY_METHOD_CUSTOM_ROI_LETER_BOX
689 (void *) MM_DISPLAY_ROTATION_NONE,
690 MM_ATTRS_VALID_TYPE_INT_RANGE,
691 MM_DISPLAY_ROTATION_NONE,
692 MM_DISPLAY_ROTATION_270
699 MM_ATTRS_VALID_TYPE_INT_RANGE,
707 (void *) MM_DISPLAY_METHOD_LETTER_BOX,
708 MM_ATTRS_VALID_TYPE_INT_RANGE,
709 MM_DISPLAY_METHOD_LETTER_BOX,
710 MM_DISPLAY_METHOD_CUSTOM_ROI
717 MM_ATTRS_VALID_TYPE_NONE,
726 MM_ATTRS_VALID_TYPE_NONE,
731 "wl_window_render_x",
735 MM_ATTRS_VALID_TYPE_INT_RANGE,
740 "wl_window_render_y",
744 MM_ATTRS_VALID_TYPE_INT_RANGE,
749 "wl_window_render_width",
753 MM_ATTRS_VALID_TYPE_INT_RANGE,
758 "wl_window_render_height",
762 MM_ATTRS_VALID_TYPE_INT_RANGE,
771 MM_ATTRS_VALID_TYPE_INT_RANGE,
776 "display_overlay_user_data",
780 MM_ATTRS_VALID_TYPE_NONE,
785 "display_surface_type",
788 (void *) MM_DISPLAY_SURFACE_NULL,
789 MM_ATTRS_VALID_TYPE_INT_RANGE,
790 MM_DISPLAY_SURFACE_OVERLAY,
791 MM_DISPLAY_SURFACE_NUM - 1
794 "display_evas_surface_sink",
795 MM_ATTRS_TYPE_STRING,
796 MM_ATTRS_FLAG_READABLE,
797 (void *) player->ini.videosink_element_evas,
798 MM_ATTRS_VALID_TYPE_NONE,
803 "display_force_aspect_ration",
807 MM_ATTRS_VALID_TYPE_INT_RANGE,
812 "display_width", // dest width of fimcconvert ouput
816 MM_ATTRS_VALID_TYPE_INT_RANGE,
821 "display_height", // dest height of fimcconvert ouput
825 MM_ATTRS_VALID_TYPE_INT_RANGE,
830 "display_evas_do_scaling",
834 MM_ATTRS_VALID_TYPE_INT_RANGE,
843 MM_ATTRS_VALID_TYPE_INT_RANGE,
852 MM_ATTRS_VALID_TYPE_INT_RANGE,
860 (void *) MM_SOUND_VOLUME_TYPE_MEDIA,
861 MM_ATTRS_VALID_TYPE_INT_RANGE,
867 MM_ATTRS_TYPE_STRING,
870 MM_ATTRS_VALID_TYPE_NONE,
875 "sound_stream_index",
879 MM_ATTRS_VALID_TYPE_INT_RANGE,
887 (void *) MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
888 MM_ATTRS_VALID_TYPE_INT_RANGE,
889 MM_AUDIOROUTE_USE_EXTERNAL_SETTING,
890 MM_AUDIOROUTE_CAPTURE_STEREOMIC_ONLY
893 "sound_stop_when_unplugged",
897 MM_ATTRS_VALID_TYPE_INT_RANGE,
902 "sound_application_pid",
906 MM_ATTRS_VALID_TYPE_INT_RANGE,
911 "sound_spk_out_only",
915 MM_ATTRS_VALID_TYPE_INT_RANGE,
923 (void *) 0, // 0: normal, 1: high 2: high with sound transition 3: mix with others regardless of priority
924 MM_ATTRS_VALID_TYPE_INT_RANGE,
929 "sound_close_resource",
933 MM_ATTRS_VALID_TYPE_INT_RANGE,
938 "sound_latency_mode",
941 (void *) 1, // 0: low latency, 1: middle latency 2: high latency
942 MM_ATTRS_VALID_TYPE_INT_RANGE,
947 "pcm_extraction", // enable pcm extraction
951 MM_ATTRS_VALID_TYPE_INT_RANGE,
956 "pcm_extraction_samplerate", // set samplerate for pcm extraction
959 (void *) 44100, // hz
960 MM_ATTRS_VALID_TYPE_INT_RANGE,
965 "pcm_extraction_depth", // set depth for pcm extraction
969 MM_ATTRS_VALID_TYPE_INT_RANGE,
974 "pcm_extraction_channels", // set channels for pcm extraction
978 MM_ATTRS_VALID_TYPE_INT_RANGE,
983 "pcm_extraction_start_msec", // set start position to extract pcm
987 MM_ATTRS_VALID_TYPE_INT_RANGE,
992 "pcm_extraction_end_msec", // set end position to extract pcm
996 MM_ATTRS_VALID_TYPE_INT_RANGE,
1001 "profile_smooth_repeat",
1005 MM_ATTRS_VALID_TYPE_INT_RANGE,
1010 "profile_progress_interval", // will be deprecated
1014 MM_ATTRS_VALID_TYPE_INT_RANGE,
1023 MM_ATTRS_VALID_TYPE_INT_RANGE,
1032 MM_ATTRS_VALID_TYPE_INT_RANGE,
1040 (void *) MM_PLAYER_PD_MODE_NONE,
1041 MM_ATTRS_VALID_TYPE_INT_RANGE,
1042 MM_PLAYER_PD_MODE_NONE,
1043 MM_PLAYER_PD_MODE_URI // not tested yet, because of no fixed scenario
1046 "pd_location", // location of the file to write
1047 MM_ATTRS_TYPE_STRING,
1050 MM_ATTRS_VALID_TYPE_NONE,
1059 MM_ATTRS_VALID_TYPE_INT_RANGE,
1064 "content_video_orientation", // orientation of video content
1065 MM_ATTRS_TYPE_STRING,
1068 MM_ATTRS_VALID_TYPE_NONE,
1074 MM_ATTRS_TYPE_STRING,
1077 MM_ATTRS_VALID_TYPE_NONE,
1082 "display_surface_client_type",
1085 (void *) MM_DISPLAY_SURFACE_NULL,
1086 MM_ATTRS_VALID_TYPE_INT_RANGE,
1087 MM_DISPLAY_SURFACE_OVERLAY,
1088 MM_DISPLAY_SURFACE_NUM - 1
1094 (void *) MM_PLAYER_PIPELINE_LEGACY,
1095 MM_ATTRS_VALID_TYPE_INT_RANGE,
1096 MM_PLAYER_PIPELINE_LEGACY,
1097 MM_PLAYER_PIPELINE_MAX - 1
1104 MM_ATTRS_VALID_TYPE_INT_RANGE,
1113 MM_ATTRS_VALID_TYPE_INT_RANGE,
1119 num_of_attrs = ARRAY_SIZE(player_attrs);
1121 base = (mmf_attrs_construct_info_t* )malloc(num_of_attrs * sizeof(mmf_attrs_construct_info_t));
1125 LOGE("failed to alloc attrs constructor");
1129 /* initialize values of attributes */
1130 for ( idx = 0; idx < num_of_attrs; idx++ )
1132 base[idx].name = player_attrs[idx].name;
1133 base[idx].value_type = player_attrs[idx].value_type;
1134 base[idx].flags = player_attrs[idx].flags;
1135 base[idx].default_value = player_attrs[idx].default_value;
1138 attrs = mmf_attrs_new_from_data(
1146 MMPLAYER_FREEIF(base);
1150 LOGE("failed to create player attrs");
1154 /* set validity type and range */
1155 for ( idx = 0; idx < num_of_attrs; idx++ )
1157 switch ( player_attrs[idx].valid_type)
1159 case MM_ATTRS_VALID_TYPE_INT_RANGE:
1161 mmf_attrs_set_valid_type (attrs, idx, MM_ATTRS_VALID_TYPE_INT_RANGE);
1162 mmf_attrs_set_valid_range (attrs, idx,
1163 player_attrs[idx].value_min,
1164 player_attrs[idx].value_max,
1165 (int)(intptr_t)(player_attrs[idx].default_value));
1169 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
1170 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
1171 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
1178 mmf_attrs_commit(attrs);
1184 _mmplayer_deconstruct_attribute(MMHandleType handle) // @
1186 mm_player_t *player = MM_PLAYER_CAST(handle);
1188 MMPLAYER_RETURN_VAL_IF_FAIL ( player, FALSE );
1192 mmf_attrs_free (player->attrs);