4 * Copyright (c) 2000 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hyuntae Kim <ht1211.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 #include <glib/gstdio.h>
25 #include <iniparser.h>
27 #include "mm_streamrecorder_ini.h"
29 static gboolean loaded = FALSE;
31 /* global variables here */
32 static void __get_element_list(mm_streamrecorder_ini_t* ini, gchar* str, int keyword_type);
34 static void __mm_streamrecorder_ini_check_status(void);
37 #define MM_STREAMRECORDER_INI_GET_STRING(x_dict, x_item, x_ini, x_default) \
41 str = iniparser_getstring(x_dict, x_ini, x_default); \
43 length = strlen(str); \
44 if ((length > 1) && (length < STREAMRECORDER_INI_MAX_STRLEN)) \
45 strncpy(x_item, str, STREAMRECORDER_INI_MAX_STRLEN-1); \
47 strncpy(x_item, x_default, STREAMRECORDER_INI_MAX_STRLEN-1); \
49 strncpy(x_item, x_default, STREAMRECORDER_INI_MAX_STRLEN-1); \
53 /* x_ini is the list of value to be set at x_list[index] */
54 #define MMSTREAMRECORDER_INI_GET_INT_FROM_LIST(x_dict, x_list, x_list_max, x_ini, x_default) \
58 const char *delimiters = " ,"; \
59 char *usr_ptr = NULL; \
61 gchar temp_arr[STREAMRECORDER_INI_MAX_STRLEN] = {0}; \
62 MM_STREAMRECORDER_INI_GET_STRING(x_dict, temp_arr, x_ini, x_default); \
63 token = strtok_r(temp_arr, delimiters, &usr_ptr); \
65 if (index > x_list_max -1) { \
66 _mmstreamrec_dbg_err("%d is not valid index\n", index); \
69 value = atoi(token); \
70 x_list[index] = value; \
73 token = strtok_r(NULL, delimiters, &usr_ptr); \
77 int _mm_streamrecorder_ini_load(mm_streamrecorder_ini_t *ini)
79 dictionary *dict = NULL;
81 _mmstreamrec_dbg_warn("enter");
83 __mm_streamrecorder_ini_check_status();
85 /* first, try to load existing ini file */
86 dict = iniparser_load(MM_STREAMRECORDER_INI_DEFAULT_PATH);
89 memset(ini, 0, sizeof(mm_streamrecorder_ini_t));
91 if (dict) { /* if dict is available */
93 ini->encsink_src_islive = iniparser_getboolean(dict, "general:encscink source is live", DEFAULT_ENCSINK_SRC_IS_LIVE);
94 ini->retrial_count = iniparser_getint(dict, "general:retrialcount", DEFAULT_RETRIAL_COUNT);
95 ini->minimum_frame = iniparser_getint(dict, "general:minimum frame", DEFAULT_MINIMUM_FRAME);
96 ini->convert_output_buffer_num = iniparser_getint(dict, "general:convert output buffer num", DEFAULT_CONVERT_OUTPUT_BUFFER_NUM);
97 ini->reset_pause_time = iniparser_getint(dict, "general:reset pause time", DEFAULT_RESET_PAUSE_TIME);
98 ini->screen_record = iniparser_getint(dict, "general:screen record", DEFAULT_SCREEN_RECORD);
99 ini->hw_encoder_supported = iniparser_getboolean(dict, "general:hw encoder supported", DEFAULT_HW_ENCODER_SUPPORTED);
100 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->video_codec_element_hw, (const char *)"general:video codec element hw", (char *)DEFAULT_VIDEO_SOURCE);
103 ini->encsink_bin_profile = iniparser_getint(dict, "encodebin:encsink bin profile", DEFAULT_ENCSINK_BIN_PROFILE);
104 ini->encsink_bin_auto_audio_resample = iniparser_getboolean(dict, "encodebin:encsink bin auto audio resample", DEFAULT_ENCSINK_BIN_AUTO_AUDIO_RESAMPLE);
105 ini->encsink_bin_auto_colorspace = iniparser_getboolean(dict, "encodebin: encsink bin auto colorspace", DEFAULT_ENCSINK_BIN_AUTO_COLORSPACE);
106 ini->encsink_bin_use_video_toggle = iniparser_getboolean(dict, "encodebin:encsink bin use video toggle", DEFAULT_ENCSINK_BIN_USE_VIDEO_TOGGLE);
107 ini->encsink_bin_auto_audio_convert = iniparser_getboolean(dict, "encodebin:encsink bin auto audio convert", DEFAULT_ENCSINK_BIN_AUTO_CONVERT);
110 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_src, (const char *)"pipeline:encsink bin source", (char *)DEFAULT_VIDEO_SOURCE);
111 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_audio_src, (const char *)"pipeline:name of audio src", (char *)DEFAULT_AUDIO_SRC);
112 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->h264_video_encoder, (const char *)"pipeline:h264 encoder", (char *)DEFAULT_NAME_OF_H264_VIDEO_ENCODER);
113 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->h263_video_encoder, (const char *)"pipeline:h263 encoder", (char *)DEFAULT_NAME_OF_H263_VIDEO_ENCODER);
114 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->mpeg4_video_encoder, (const char *)"pipeline:mpeg4 encoder", (char *)DEFAULT_NAME_OF_MPEG4_VIDEO_ENCODER);
115 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_bin_audio_encoder, (const char *)"pipeline:name of audio encoder", (char *)DEFAULT_NAME_OF_AUDIO_ENCODER);
116 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->encsink_bin_use_parser, (const char *)"pipeline:use parser", (char *)DEFAULT_USE_PARSER);
117 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_bin_video_converter, (const char *)"pipeline:name of video converter", (char *)DEFAULT_NAME_OF_VIDEO_CONVERTER);
118 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_bin_3GPMUXER, (const char *)"pipeline:name of 3GP muxer", (char *)DEFAULT_NAME_OF_3GP_MUXER);
119 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_bin_MP4MUXER, (const char *)"pipeline:name of MP4 muxer", (char *)DEFAULT_NAME_OF_MP4_MUXER);
120 MM_STREAMRECORDER_INI_GET_STRING(dict, ini->name_of_encsink_sink, (const char *)"pipeline:name of sink", (char *)DEFAULT_NAME_OF_BIN_SINK);
122 /* audio parameter */
123 ini->audio_frame_minimum_space = iniparser_getint(dict, "audio param:audio frame minimum space", DEFAULT_AUDIO_FRAME_MINIMUM_SPACE);
124 ini->audio_frame_wait_time = iniparser_getint(dict, "audio param:audio frame wait time", DEFAULT_AUDIO_FRAME_WAIT_TIME);
126 /* video parameter */
127 ini->video_frame_wait_time = iniparser_getint(dict, "video param:video frame wait time", DEFAULT_VIDEO_FRAME_WAIT_TIME);
129 /*supported attribute*/
130 MMSTREAMRECORDER_INI_GET_INT_FROM_LIST(dict, ini->supported_video_width, STREAMRECORDER_ATTRIBUTE_NUM_MAX, "attribute:supported width", (char *)DEFAULT_SUPPORTED_WIDTH);
131 MMSTREAMRECORDER_INI_GET_INT_FROM_LIST(dict, ini->supported_video_height, STREAMRECORDER_ATTRIBUTE_NUM_MAX, "attribute:supported height", (char *)DEFAULT_SUPPORTED_HEIGHT);
132 __get_element_list(ini, iniparser_getstring(dict, "attribute:supported audio encoders", (char*)DEFAULT_SUPPORTED_AUDIO_ENCODERS), KEYWORD_AUDIO_ENCODERS);
133 __get_element_list(ini, iniparser_getstring(dict, "attribute:supported video encoders", (char*)DEFAULT_SUPPORTED_VIDEO_ENCODERS), KEYWORD_VIDEO_ENCODERS);
134 __get_element_list(ini, iniparser_getstring(dict, "attribute:supported file formats", (char*)DEFAULT_SUPPORTED_FILE_FORMATS), KEYWORD_FILE_FORMATS);
137 ini->generate_dot = iniparser_getboolean(dict, "debug:generate dot", DEFAULT_GENERATE_DOT);
139 } else { /* if dict is not available just fill the structure with default value */
140 _mmstreamrec_dbg_err("failed to load ini. using hardcoded default\n");
142 ini->encsink_src_islive = DEFAULT_ENCSINK_SRC_IS_LIVE;
143 ini->retrial_count = DEFAULT_RETRIAL_COUNT;
144 ini->minimum_frame = DEFAULT_MINIMUM_FRAME;
145 ini->convert_output_buffer_num = DEFAULT_CONVERT_OUTPUT_BUFFER_NUM;
146 ini->reset_pause_time = DEFAULT_RESET_PAUSE_TIME;
147 ini->screen_record = DEFAULT_SCREEN_RECORD;
148 ini->hw_encoder_supported = DEFAULT_HW_ENCODER_SUPPORTED;
149 strncpy(ini->video_codec_element_hw, DEFAULT_VIDEO_CODEC_ELEMENT_HW, STREAMRECORDER_INI_MAX_STRLEN - 1);
152 ini->encsink_bin_profile = DEFAULT_ENCSINK_BIN_PROFILE;
153 ini->encsink_bin_auto_audio_resample = DEFAULT_ENCSINK_BIN_AUTO_AUDIO_RESAMPLE;
154 ini->encsink_bin_auto_colorspace = DEFAULT_ENCSINK_BIN_AUTO_COLORSPACE;
155 ini->encsink_bin_use_video_toggle = DEFAULT_ENCSINK_BIN_USE_VIDEO_TOGGLE;
156 ini->encsink_bin_auto_audio_convert = DEFAULT_ENCSINK_BIN_AUTO_CONVERT;
159 strncpy(ini->name_of_encsink_src, DEFAULT_VIDEO_SOURCE, STREAMRECORDER_INI_MAX_STRLEN - 1);
160 strncpy(ini->name_of_audio_src, DEFAULT_AUDIO_SRC, STREAMRECORDER_INI_MAX_STRLEN - 1);
161 strncpy(ini->h264_video_encoder, DEFAULT_NAME_OF_H264_VIDEO_ENCODER, STREAMRECORDER_INI_MAX_STRLEN - 1);
162 strncpy(ini->h263_video_encoder, DEFAULT_NAME_OF_H263_VIDEO_ENCODER, STREAMRECORDER_INI_MAX_STRLEN - 1);
163 strncpy(ini->mpeg4_video_encoder, DEFAULT_NAME_OF_MPEG4_VIDEO_ENCODER, STREAMRECORDER_INI_MAX_STRLEN - 1);
164 strncpy(ini->name_of_encsink_bin_audio_encoder, DEFAULT_NAME_OF_AUDIO_ENCODER, STREAMRECORDER_INI_MAX_STRLEN - 1);
165 strncpy(ini->encsink_bin_use_parser, DEFAULT_USE_PARSER, STREAMRECORDER_INI_MAX_STRLEN - 1);
166 strncpy(ini->name_of_encsink_bin_video_converter, DEFAULT_NAME_OF_VIDEO_CONVERTER, STREAMRECORDER_INI_MAX_STRLEN - 1);
167 strncpy(ini->name_of_encsink_bin_3GPMUXER, DEFAULT_NAME_OF_3GP_MUXER, STREAMRECORDER_INI_MAX_STRLEN - 1);
168 strncpy(ini->name_of_encsink_bin_MP4MUXER, DEFAULT_NAME_OF_MP4_MUXER, STREAMRECORDER_INI_MAX_STRLEN - 1);
169 strncpy(ini->name_of_encsink_sink, DEFAULT_NAME_OF_BIN_SINK, STREAMRECORDER_INI_MAX_STRLEN - 1);
171 /* audio parameter */
172 ini->audio_frame_minimum_space = DEFAULT_AUDIO_FRAME_MINIMUM_SPACE;
173 ini->audio_frame_wait_time = DEFAULT_AUDIO_FRAME_WAIT_TIME;
175 /* video parameter */
176 ini->video_frame_wait_time = DEFAULT_VIDEO_FRAME_WAIT_TIME;
178 /*supported attributes*/
179 __get_element_list(ini, (char *)DEFAULT_SUPPORTED_HEIGHT, KEYWORD_VIDEO_HEIGHT);
180 __get_element_list(ini, (char *)DEFAULT_SUPPORTED_WIDTH, KEYWORD_VIDEO_WIDTH);
181 __get_element_list(ini, (char *)DEFAULT_SUPPORTED_AUDIO_ENCODERS, KEYWORD_AUDIO_ENCODERS);
182 __get_element_list(ini, (char *)DEFAULT_SUPPORTED_VIDEO_ENCODERS, KEYWORD_VIDEO_ENCODERS);
183 __get_element_list(ini, (char *)DEFAULT_SUPPORTED_FILE_FORMATS, KEYWORD_FILE_FORMATS);
186 ini->generate_dot = DEFAULT_GENERATE_DOT;
189 /* free dict as we got our own structure */
191 iniparser_freedict(dict);
194 _mmstreamrec_dbg_log("[Stream Recorder initial setting][Start]");
197 _mmstreamrec_dbg_log("encsink_src_islive : %d", ini->encsink_src_islive);
198 _mmstreamrec_dbg_log("retrial_count : %d", ini->retrial_count);
199 _mmstreamrec_dbg_log("minimum_frame : %d", ini->minimum_frame);
200 _mmstreamrec_dbg_log("convert_output_buffer_num : %d", ini->convert_output_buffer_num);
201 _mmstreamrec_dbg_log("reset_pause_time : %d", ini->reset_pause_time);
202 _mmstreamrec_dbg_log("screen_record : %d", ini->screen_record);
203 _mmstreamrec_dbg_log("hw_encoder_supported : %d", ini->hw_encoder_supported);
204 _mmstreamrec_dbg_log("video_codec_element_hw : %s", ini->video_codec_element_hw);
207 _mmstreamrec_dbg_log("encode bin profile : %d", ini->encsink_bin_profile);
208 _mmstreamrec_dbg_log("encode bin auto audio resample property : %d", ini->encsink_bin_auto_audio_resample);
209 _mmstreamrec_dbg_log("encode bin auto colorspace property : %d", ini->encsink_bin_auto_colorspace);
210 _mmstreamrec_dbg_log("encode bin use video toggle property : %d", ini->encsink_bin_use_video_toggle);
211 _mmstreamrec_dbg_log("encode bin auto audio convert property : %d", ini->encsink_bin_auto_audio_convert);
214 _mmstreamrec_dbg_log("name_of_encodebin_source : %s", ini->name_of_encsink_src);
215 _mmstreamrec_dbg_log("name_of_audio_source : %s", ini->name_of_audio_src);
216 _mmstreamrec_dbg_log("name_of_h264_video_encoder : %s", ini->h264_video_encoder);
217 _mmstreamrec_dbg_log("name_of_h263_video_encoder : %s", ini->h263_video_encoder);
218 _mmstreamrec_dbg_log("name_of_mpeg4_video_encoder : %s", ini->mpeg4_video_encoder);
219 _mmstreamrec_dbg_log("name_of_audio_encoder : %s", ini->name_of_encsink_bin_audio_encoder);
220 _mmstreamrec_dbg_log("name_of_video_converter : %s", ini->name_of_encsink_bin_video_converter);
221 _mmstreamrec_dbg_log("name_of_3GP_muxer : %s", ini->name_of_encsink_bin_3GPMUXER);
222 _mmstreamrec_dbg_log("name_of_MP4_muxer : %s", ini->name_of_encsink_bin_MP4MUXER);
223 _mmstreamrec_dbg_log("name_of_sink : %s", ini->name_of_encsink_sink);
225 /* audio parameter */
226 _mmstreamrec_dbg_log("audio_frame_minimum_space : %d", ini->audio_frame_minimum_space);
227 _mmstreamrec_dbg_log("audio_frame_wait_time : %d", ini->audio_frame_wait_time);
229 /* video parameter */
230 _mmstreamrec_dbg_log("video_frame_wait_time : %d", ini->video_frame_wait_time);
233 _mmstreamrec_dbg_log("generate_dot : %d", ini->generate_dot);
234 if (ini->generate_dot == TRUE) {
235 _mmstreamrec_dbg_log("generate_dot is TRUE, dot file will be stored into /tmp/");
236 g_setenv("GST_DEBUG_DUMP_DOT_DIR", "/tmp/", TRUE);
238 _mmstreamrec_dbg_log("[Stream Recorder initial setting][End]");
242 _mmstreamrec_dbg_warn("leave");
244 return MM_ERROR_NONE;
248 void __get_element_list(mm_streamrecorder_ini_t* ini, gchar* str, int keyword_type)
253 gchar* strtmp = NULL;
261 strtmp = g_strdup(str);
263 /* trimming. it works inplace */
268 list = g_strsplit(strtmp, ",", 10);
278 switch (keyword_type) {
279 case KEYWORD_VIDEO_HEIGHT:
281 for (walk = list; *walk; walk++) {
282 ini->supported_video_height[i] = atoi(*walk);
287 case KEYWORD_VIDEO_WIDTH:
289 for (walk = list; *walk; walk++) {
290 ini->supported_video_width[i] = atoi(*walk);
295 case KEYWORD_AUDIO_ENCODERS:
297 for (walk = list; *walk; walk++) {
298 strncpy(ini->supported_audio_encoders[i], *walk, (STREAMRECORDER_INI_MAX_STRLEN - 1));
299 g_strstrip(ini->supported_audio_encoders[i]);
300 ini->supported_audio_encoders[i][STREAMRECORDER_INI_MAX_STRLEN -1] = '\0';
303 /* mark last item to NULL*/
304 ini->supported_audio_encoders[i][0] = '\0';
307 case KEYWORD_VIDEO_ENCODERS:
309 for (walk = list; *walk; walk++) {
310 strncpy(ini->supported_video_encoders[i], *walk, (STREAMRECORDER_INI_MAX_STRLEN - 1));
311 g_strstrip(ini->supported_video_encoders[i]);
312 ini->supported_video_encoders[i][STREAMRECORDER_INI_MAX_STRLEN -1] = '\0';
315 /* mark last item to NULL */
316 ini->supported_video_encoders[i][0] = '\0';
319 case KEYWORD_FILE_FORMATS:
321 for (walk = list; *walk; walk++) {
322 strncpy(ini->supported_file_formats[i], *walk, (STREAMRECORDER_INI_MAX_STRLEN - 1));
323 g_strstrip(ini->supported_file_formats[i]);
324 ini->supported_file_formats[i][STREAMRECORDER_INI_MAX_STRLEN -1] = '\0';
327 /* mark last item to NULL*/
328 ini->supported_file_formats[i][0] = '\0';
342 void __mm_streamrecorder_ini_check_status(void)
345 char buf[255] = {0, };
347 _mmstreamrec_dbg_warn("enter");
349 if (g_stat(MM_STREAMRECORDER_INI_DEFAULT_PATH, &ini_buff) < 0) {
350 _mmstreamrec_dbg_err("failed to get mmfw_streamrecorder.ini status\n");
352 if (ini_buff.st_size < 5) {
353 _mmstreamrec_dbg_err("mmfw_streamrecorder.ini file size=%d, Corrupted! So, Removed\n", (int)ini_buff.st_size);
354 if (g_remove(MM_STREAMRECORDER_INI_DEFAULT_PATH) == -1) {
355 strerror_r(errno, buf, sizeof(buf));
356 _mmstreamrec_dbg_err("failed to delete corrupted ini [%s]", buf);
361 _mmstreamrec_dbg_warn("leave");
364 int _mm_streamrecorder_ini_unload(mm_streamrecorder_ini_t *ini)
366 _mmstreamrec_dbg_warn("enter");
370 _mmstreamrec_dbg_warn("leave");
372 return MM_ERROR_NONE;