Fixed for correct framerate setting
[platform/core/api/mediademuxer.git] / src / mediademuxer_ini.c
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file mediademuxer_ini.c
19  * @brief INI laoding and parsing procedures
20  */
21
22 #ifndef __MEDIADEMUXER_INI_C__
23 #define __MEDIADEMUXER_INI_C__
24
25 /* includes here */
26 #include <glib.h>
27 #include <stdlib.h>
28 #include <glib/gstdio.h>
29 #include <mediademuxer_error.h>
30 #include <mm_debug.h>
31 #include <mm_error.h>
32 #include "iniparser.h"
33 #include <mediademuxer_ini.h>
34 #include <mediademuxer_private.h>
35
36 /* internal functions, macros here */
37 #ifdef MEDIADEMUXER_DEFAULT_INI
38 static gboolean _generate_default_ini(void);
39 #endif
40
41 static void _md_ini_check_ini_status(void);
42
43 /* macro */
44 #define MEDIADEMUXER_INI_GET_STRING(x_dict, x_item, x_ini, x_default) \
45         do { \
46                 gchar* str = iniparser_getstring(x_dict, x_ini, x_default); \
47                 \
48                 if (str &&  \
49                      (strlen(str) > 0) && \
50                      (strlen(str) < MEDIADEMUXER_INI_MAX_STRLEN)) { \
51                         strncpy(x_item, str, MEDIADEMUXER_INI_MAX_STRLEN - 1); \
52                 } else { \
53                         strncpy(x_item, x_default, MEDIADEMUXER_INI_MAX_STRLEN - 1); \
54                 } \
55         } while (0)
56
57 #define MEDIADEMUXER_INI_GET_COLOR(x_dict, x_item, x_ini, x_default) \
58         do { \
59                 gchar* str = iniparser_getstring(x_dict, x_ini, x_default); \
60                 \
61                 if (str &&  \
62                      (strlen(str) > 0) && \
63                      (strlen(str) < MEDIADEMUXER_INI_MAX_STRLEN)) { \
64                         x_item = (guint) strtoul(str, NULL, 16); \
65                 } else { \
66                         x_item = (guint) strtoul(x_default, NULL, 16); \
67                 } \
68         } while (0)
69
70 /* x_ini is the list of index to set TRUE at x_list[index] */
71 #define MEDIADEMUXER_INI_GET_BOOLEAN_FROM_LIST(x_dict, x_list, x_list_max, x_ini, x_default) \
72         do { \
73                 int index = 0; \
74                 const char *delimiters = " ,"; \
75                 char *usr_ptr = NULL; \
76                 char *token = NULL; \
77                 gchar temp_arr[MEDIADEMUXER_INI_MAX_STRLEN] = {0}; \
78                 MMMEDIADEMUXER_INI_GET_STRING(x_dict, temp_arr, x_ini, x_default); \
79                 token = strtok_r(temp_arr, delimiters, &usr_ptr); \
80                 while (token) { \
81                         index = atoi(token); \
82                         if (index < 0 || index > x_list_max -1) { \
83                                 MD_W("%d is not valid index\n", index); \
84                         } else { \
85                                 x_list[index] = TRUE; \
86                         } \
87                         token = strtok_r(NULL, delimiters, &usr_ptr); \
88                 } \
89         } while (0)
90
91 /* x_ini is the list of value to be set at x_list[index] */
92 #define MEDIADEMUXER_INI_GET_INT_FROM_LIST(x_dict, x_list, x_list_max, x_ini, x_default) \
93         do { \
94                 int index = 0; \
95                 int value = 0; \
96                 const char *delimiters = " ,"; \
97                 char *usr_ptr = NULL; \
98                 char *token = NULL; \
99                 gchar temp_arr[MEDIADEMUXER_INI_MAX_STRLEN] = {0}; \
100                 MMMEDIADEMUXER_INI_GET_STRING(x_dict, temp_arr, x_ini, x_default); \
101                 token = strtok_r(temp_arr, delimiters, &usr_ptr); \
102                 while (token) { \
103                         if (index > x_list_max -1) { \
104                                 MD_E("%d is not valid index\n", index); \
105                                 break; \
106                         } else { \
107                                 value = atoi(token); \
108                                 x_list[index] = value; \
109                                 index++; \
110                         } \
111                         token = strtok_r(NULL, delimiters, &usr_ptr); \
112                 } \
113         } while (0)
114
115 int md_ini_load(md_ini_t *ini)
116 {
117         dictionary *dict = NULL;
118         _md_ini_check_ini_status();
119
120         /* first, try to load existing ini file */
121         dict = iniparser_load(MEDIADEMUXER_INI_DEFAULT_PATH);
122
123         /* if no file exists. create one with set of default values */
124         if (!dict) {
125 #ifdef MEDIADEMUXER_DEFAULT_INI
126                 MD_L("No inifile found. demuxer will create default inifile.\n");
127                 if (FALSE == _generate_default_ini()) {
128                         MD_W("Creating default inifile failed. MediaDemuxer will use default values.\n");
129                 } else {
130                         /* load default ini */
131                         dict = iniparser_load(MEDIADEMUXER_INI_DEFAULT_PATH);
132                 }
133 #else
134                 MD_L("No ini file found. \n");
135                 return MD_ERROR_FILE_NOT_FOUND;
136 #endif
137         }
138
139         /* get ini values */
140         memset(ini, 0, sizeof(md_ini_t));
141
142         if (dict) {             /* if dict is available */
143                 /* general */
144                 MEDIADEMUXER_INI_GET_STRING(dict, ini->port_name, "port_in_use:mediademuxer_port", DEFAULT_PORT);
145         } else {                /* if dict is not available just fill the structure with default value */
146
147                 MD_W("failed to load ini. using hardcoded default\n");
148                 strncpy(ini->port_name, DEFAULT_PORT, MEDIADEMUXER_INI_MAX_STRLEN - 1);
149         }
150
151         if (0 == strcmp(ini->port_name, "GST_PORT"))
152                 ini->port_type = GST_PORT;
153         else if (0 == strcmp(ini->port_name, "FFMPEG_PORT"))
154                 ini->port_type = FFMPEG_PORT;
155         else if (0 == strcmp(ini->port_name, "CUSTOM_PORT"))
156                 ini->port_type = CUSTOM_PORT;
157         else {
158                 MD_E("Invalid port is set to [%s] [%d]\n", ini->port_name,
159                      ini->port_type);
160                 goto ERROR;
161         }
162         MD_L("The port is set to [%s] [%d]\n", ini->port_name, ini->port_type);
163
164         /* free dict as we got our own structure */
165         iniparser_freedict(dict);
166
167         /* dump structure */
168         MD_L("demuxer settings -----------------------------------\n");
169
170         /* general */
171         MD_L("port_name: %s\n", ini->port_name);
172         MD_L("port_type : %d\n", ini->port_type);
173
174         return MD_ERROR_NONE;
175 ERROR:
176         return MD_COURRPTED_INI;
177
178 }
179
180 static void _md_ini_check_ini_status(void)
181 {
182         struct stat ini_buff;
183
184         if (g_stat(MEDIADEMUXER_INI_DEFAULT_PATH, &ini_buff) < 0) {
185                 MD_W("failed to get demuxer ini status\n");
186         } else {
187                 if (ini_buff.st_size < 5) {
188                         MD_W("demuxer.ini file size=%d, Corrupted! So, Removed\n", (int)ini_buff.st_size);
189
190                         if (g_remove(MEDIADEMUXER_INI_DEFAULT_PATH) == -1)
191                                 MD_E("failed to delete corrupted ini");
192                 }
193         }
194 }
195
196 #ifdef MEDIADEMUXER_DEFAULT_INI
197 static gboolean _generate_default_ini(void)
198 {
199         FILE *fp = NULL;
200         gchar *default_ini = MEDIADEMUXER_DEFAULT_INI;
201
202         /* create new file */
203         fp = fopen(MEDIADEMUXER_INI_DEFAULT_PATH, "wt");
204
205         if (!fp)
206                 return FALSE;
207
208         /* writing default ini file */
209         if (strlen(default_ini) !=
210                 fwrite(default_ini, 1, strlen(default_ini), fp)) {
211                 fclose(fp);
212                 return FALSE;
213         }
214
215         fclose(fp);
216         return TRUE;
217 }
218 #endif
219
220 #endif  /* #ifdef _MEDIADEMUXER_INI_C_ */