Add new param for setting remote session description and ICE candidiate for WebRTC...
[platform/core/api/mediastreamer.git] / include / media_streamer_util.h
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 #ifndef __TIZEN_MEDIA_STREAMER_UTIL_H__
18 #define __TIZEN_MEDIA_STREAMER_UTIL_H__
19
20 #include <media_format.h>
21
22 #include <stdlib.h>
23 #include <glib.h>
24 #include <gst/gst.h>
25 #include <dlog.h>
26 #include <iniparser.h>
27 #include <Evas.h>
28 #include <json-glib/json-glib.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 /* DLog Utils*/
35 #ifdef LOG_TAG
36 #undef LOG_TAG
37 #endif
38
39 #define LOG_TAG "CAPI_MEDIASTREAMER"
40
41 #define FONT_COLOR_RESET    "\033[0m"
42 #define FONT_COLOR_RED      "\033[31m"
43 #define FONT_COLOR_GREEN    "\033[32m"
44 #define FONT_COLOR_YELLOW   "\033[33m"
45 #define FONT_COLOR_BLUE     "\033[34m"
46 #define FONT_COLOR_PURPLE   "\033[35m"
47 #define FONT_COLOR_CYAN     "\033[36m"
48 #define FONT_COLOR_GRAY     "\033[37m"
49
50 #define ms_debug(fmt, arg...)                         \
51         do {                                              \
52                 LOGD(FONT_COLOR_RESET""fmt""FONT_COLOR_RESET, ##arg);         \
53         } while (0)
54
55 #define ms_info(fmt, arg...)                          \
56         do {                                              \
57                 LOGI(FONT_COLOR_GREEN""fmt""FONT_COLOR_RESET, ##arg);         \
58         } while (0)
59
60 #define ms_warning(fmt, arg...)                         \
61         do {                                              \
62                 LOGW(FONT_COLOR_YELLOW""fmt""FONT_COLOR_RESET, ##arg);           \
63         } while (0)
64
65 #define ms_error(fmt, arg...)                         \
66         do {                                              \
67                 LOGE(FONT_COLOR_RED""fmt""FONT_COLOR_RESET, ##arg);           \
68         } while (0)
69
70 #define ms_debug_fenter()                             \
71         do {                                              \
72                 LOGD(FONT_COLOR_PURPLE"<Enter>"FONT_COLOR_RESET);             \
73         } while (0)
74
75 #define ms_debug_fleave()                             \
76         do {                                              \
77                 LOGD(FONT_COLOR_PURPLE"<Leave>"FONT_COLOR_RESET);             \
78         } while (0)
79
80 #define ms_retm_if(expr, fmt, arg...)                 \
81         do {                                              \
82                 if (expr) {                                   \
83                         LOGE(FONT_COLOR_RED""fmt""FONT_COLOR_RESET, ##arg);       \
84                         return;                                   \
85                 }                                             \
86         } while (0)
87
88 #define ms_retvm_if(expr, val, fmt, arg...)           \
89         do {                                              \
90                 if (expr) {                                   \
91                         LOGE(FONT_COLOR_RED""fmt""FONT_COLOR_RESET, ##arg);       \
92                         return(val);                              \
93                 }                                             \
94         } while (0)
95
96 #define MS_SAFE_FREE(src)           {if (src) { free(src); src = NULL; } }
97 #define MS_SAFE_GFREE(src)          {if (src) { g_free(src); src = NULL; } }
98 #define MS_SAFE_UNREF(src)          {if (src) { gst_object_unref(GST_OBJECT(src)); src = NULL; } }
99 #define MS_TABLE_SAFE_UNREF(src)    {if (src) { g_hash_table_unref(src); src = NULL; } }
100
101 #define MS_TIME_NONE ((int)-1)
102
103 /* Ini Utils */
104 /* SYSCONFDIR is defined at spec file */
105 #define MEDIA_STREAMER_INI_PATH SYSCONFDIR"/multimedia/mmfw_media_streamer.ini"
106
107 #define INI_MAX_STRLEN (100)
108 #define RTP_STREAM_DISABLED (0)
109
110 /**
111  * @brief Media Streamer ini settings structure.
112  */
113 typedef struct __media_streamer_ini {
114         /* general */
115         gboolean generate_dot;
116         gboolean use_decodebin;
117         gchar **exclude_elem_names;
118         gchar **resource_required_elem_names;
119         gchar **gst_args;
120 } media_streamer_ini_t;
121
122 /**
123  * @brief Media Streamer format type handle.
124  */
125 typedef struct {
126         media_format_mimetype_e format;
127         char *format_name;
128 } format_s;
129
130 /**
131  * @brief Media Streamer signal structure.
132  */
133 typedef struct {
134         GObject *obj;
135         gulong signal_id;
136 } media_streamer_signal_s;
137
138 typedef struct _media_streamer_wl_info_s {
139         gint parent_id;
140 } media_streamer_wl_info_s;
141
142 /*Test elements*/
143 #define DEFAULT_VIDEO_TEST_SOURCE           "videotestsrc"
144 #define DEFAULT_AUDIO_TEST_SOURCE           "audiotestsrc"
145 #define DEFAULT_FAKE_SINK                   "fakesink"
146
147 /* setting default values if each value is not specified in .ini file */
148 /* general */
149 #define DEFAULT_GENERATE_DOT                FALSE
150 #define DEFAULT_USE_DECODEBIN               FALSE
151 #define DEFAULT_QUEUE                       "queue"
152 #define DEFAULT_FILTER                      "capsfilter"
153 #define DEFAULT_TYPEFIND                    "typefind"
154 #define DEFAULT_DECODEBIN                   "decodebin"
155 #define DEFAULT_AUDIO_SOURCE                "pulsesrc"
156 #define DEFAULT_CAMERA_SOURCE               "v4l2src"
157 #define DEFAULT_VIDEO_SOURCE                "videotestsrc"
158 #define DEFAULT_APP_SOURCE                  "appsrc"
159 #define DEFAULT_AUDIO_SINK                  "pulsesink"
160 #define DEFAULT_VIDEO_SINK                  "tizenwlsink"
161 #define DEFAULT_VIDEO_SCALE                 "videoscale"
162 #define DEFAULT_VIDEO_CONVERT               "videoconvert"
163 #define DEFAULT_VIDEO_RATE                  "videorate"
164 #define DEFAULT_TEXT_OVERLAY                "textoverlay"
165 #define DEFAULT_AUDIO_CONVERT               "audioconvert"
166 #define DEFAULT_AUDIO_RESAMPLE              "audioresample"
167 #define DEFAULT_APP_SINK                    "appsink"
168
169 /* udp streaming */
170 #define DEFAULT_UDP_SOURCE                  "udpsrc"
171 #define DEFAULT_FILE_SOURCE                 "filesrc"
172 #define DEFAULT_HTTP_SOURCE                 "souphttpsrc"
173 #define DEFAULT_FILE_SINK                   "filesink"
174 #define DEFAULT_UDP_SINK                    "udpsink"
175 #define DEFAULT_RTP_BIN                     "rtpbin"
176
177 /* video format defaults */
178 #define DEFAULT_VIDEO_ENCODER               "avenc_h263"
179 #define DEFAULT_VIDEO_DECODER               "avdec_h263"
180 #define DEFAULT_VIDEO_PARSER                "h263parse"
181 #define DEFAULT_VIDEO_RTPPAY                "rtph263pay"
182 #define DEFAULT_VIDEO_RTPDEPAY              "rtph263depay"
183
184 /* audio format defaults */
185 #define DEFAULT_AUDIO_ENCODER               "amrnbenc"
186 #define DEFAULT_AUDIO_DECODER               "amrnbdec"
187 #define DEFAULT_AUDIO_PARSER                "amrparse"
188 #define DEFAULT_AUDIO_RTPPAY                "rtpamrpay"
189 #define DEFAULT_AUDIO_RTPDEPAY              "rtpamrdepay"
190
191 /* adaptive streaming default */
192 #define DEFAULT_ADAPTIVE_SOURCE             "hlsdemux"
193 #define DEFAULT_ADAPTIVE_SINK               "hlssink"
194
195 /* WebRTC */
196 #define WEBRTC_PEER_ANSWER                  "answer"
197 #define WEBRTC_PEER_OFFER                   "offer"
198 #define DEFAULT_WEBRTC_PEER                 WEBRTC_PEER_ANSWER
199
200 #define MEDIA_STREAMER_DEFAULT_CAMERA_FORMAT "video/x-raw,format=I420,width=352,height=288"
201 #define MEDIA_STREAMER_DEFAULT_AUDIO_RAW_FORMAT "audio/x-raw,channels=1,rate=8000,format=S16LE"
202 #define MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT "video/x-h263,width=352,height=288,framerate = 3/1"
203 #define MEDIA_STREAMER_DEFAULT_AUDIO_FORMAT "audio/AMR ,rate = 8000,channels = 1"
204 #define MEDIA_STREAMER_DEFAULT_VIDEO_RTP_FORMAT "application/x-rtp,media=video"
205 #define MEDIA_STREAMER_DEFAULT_AUDIO_RTP_FORMAT "application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1"
206
207 #define MS_ELEMENT_IS_OUTPUT(el) g_strrstr(el, "out")
208 #define MS_ELEMENT_IS_INPUT(el) g_strrstr(el, "in")
209 #define MS_ELEMENT_IS_AUDIO(el) g_strrstr(el, "audio")
210 #define MS_ELEMENT_IS_VIDEO(el) g_strrstr(el, "video")
211 #define MS_ELEMENT_IS_IMAGE(el) g_strrstr(el, "image")
212 #define MS_ELEMENT_IS_TEXT(el) g_strrstr(el, "text")
213
214 #define MS_RTP_PAD_VIDEO_IN "video_in"
215 #define MS_RTP_PAD_AUDIO_IN "audio_in"
216 #define MS_RTP_PAD_VIDEO_OUT "video_out"
217 #define MS_RTP_PAD_AUDIO_OUT "audio_out"
218 #define MEDIA_STREAMER_PARAM_VIDEO_IN_FORMAT MS_RTP_PAD_VIDEO_IN"_format"
219 #define MEDIA_STREAMER_PARAM_AUDIO_IN_FORMAT MS_RTP_PAD_AUDIO_IN"_format"
220
221 #define MS_ELEMENT_IS_RTP(el) g_strrstr(el, "rtp_container")
222 #define MS_ELEMENT_IS_ENCODER(el) g_strrstr(el, "encoder")
223 #define MS_ELEMENT_IS_DECODER(el) g_strrstr(el, "decoder")
224
225 #define MEDIA_STREAMER_DEFAULT_DOT_DIR "/tmp"
226
227 #define MS_SET_INT_PARAM(obj, key, value) \
228         do { \
229                 GValue *val = g_malloc0(sizeof(GValue)); \
230                 g_value_init(val, G_TYPE_INT); \
231                 g_value_set_int(val, value); \
232                 g_object_set_data_full(G_OBJECT(obj), key, (gpointer)val, ms_param_value_destroy); \
233         } while (0)
234
235 #define MS_SET_INT_STATIC_STRING_PARAM(obj, key, value) \
236         do { \
237                 GValue *val = g_malloc0(sizeof(GValue)); \
238                 g_value_init(val, G_TYPE_STRING); \
239                 g_value_set_static_string(val, value); \
240                 g_object_set_data_full(G_OBJECT(obj), key, (gpointer)val, ms_param_value_destroy); \
241         } while (0)
242
243 #define MS_SET_INT_CAPS_PARAM(obj, key, value) \
244         do { \
245                 GValue *val = g_malloc0(sizeof(GValue)); \
246                 g_value_init(val, GST_TYPE_CAPS); \
247                 gst_value_set_caps(val, value); \
248                 g_object_set_data_full(G_OBJECT(obj), key, (gpointer)val, ms_param_value_destroy); \
249         } while (0)
250
251 #define MS_GET_CAPS_TYPE(caps, type) \
252         do { \
253                 if (caps && gst_caps_get_size(caps) > 0) \
254                         type = gst_structure_get_name(gst_caps_get_structure(caps, 0)); \
255                 else \
256                         type = NULL; \
257         } while (0)
258
259 /**
260  * @brief Loads media streamer settings from ini file.
261  *        The default values will be used if error has occurred.
262  */
263 void ms_load_ini_settings(media_streamer_ini_t *ini);
264
265 /**
266  * @brief Read and copy string reading from ini file.
267  */
268 gchar *ms_ini_get_string(const char *ini_path, const char *default_str);
269
270 /**
271  * @brief Reads comma-separated string list from ini file.
272  */
273 void ms_ini_read_list(const char *key, gchar ***list);
274
275 /**
276  * @brief Converts Media Format mime type into Caps media format string.
277  */
278 const gchar *ms_convert_mime_to_string_format(media_format_mimetype_e mime);
279
280 /**
281  * @brief Converts Media Format mime type into rtp media type.
282  */
283 const gchar *ms_convert_mime_to_rtp_format(media_format_mimetype_e mime);
284
285 /**
286  * @brief Converts Caps stream format into Media Format mime type.
287  */
288 media_format_mimetype_e ms_convert_string_format_to_media_format(const char *format_type);
289
290 /**
291  * @brief Creates Media streamer signal structure,
292  *        connects it to object and appends it to signal list.
293  */
294 void ms_signal_create(GList **sig_list, GstElement *obj, const char *sig_name, GCallback cb, gpointer user_data);
295
296 /**
297  * @brief Disconnects signal from object and
298  * destroys Media streamer signal object.
299  */
300 void ms_signal_destroy(void *data);
301
302 /**
303  * @brief Destroys the which set as rtp node parameter.
304  */
305 void ms_param_value_destroy(gpointer data);
306
307 /**
308  * @brief Check URI is valid file
309  */
310 int ms_util_uri_path_check(const char *file_uri);
311
312 /* Use g_free() to free the return value. */
313 gchar* ms_get_string_from_json_object(JsonObject *object);
314
315 /* Use g_free() to free the sdp and type parameter. */
316 int ms_webrtc_get_sdp_from_message(const char *sdp_msg, gchar **sdp, gchar **type);
317
318 /* Use g_free() to free the candidate parameter. */
319 int ms_webrtc_get_ice_candidate_from_message(const char *ice_msg, gchar **candidate, gint *mlineindex);
320
321 /**
322  * @brief Iterates func over all elements contained within a bin.
323  */
324 int ms_bin_foreach_elements(GstBin *bin, GstIteratorFoldFunction func, void *user_data);
325
326 int ms_get_wl_info(Evas_Object *obj, media_streamer_wl_info_s *wl_info);
327
328 #ifdef __cplusplus
329 }
330 #endif
331
332 #endif /* __TIZEN_MEDIA_STREAMER_UTIL_H__ */