MediaProcessors
muxers_settings.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Rafael Antoniello
3  *
4  * This file is part of MediaProcessors.
5  *
6  * MediaProcessors is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * MediaProcessors is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with MediaProcessors. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
25 #include "muxers_settings.h"
26 
27 #include <stdlib.h>
28 #include <unistd.h>
29 #include <string.h>
30 
31 #include <libcjson/cJSON.h>
32 #include <libmediaprocsutils/uri_parser.h>
33 #include <libmediaprocsutils/log.h>
34 #include <libmediaprocsutils/stat_codes.h>
35 #include <libmediaprocsutils/check_utils.h>
36 #include <libmediaprocs/proc_if.h>
37 
39 {
40  return (muxers_settings_mux_ctx_t*)calloc(1, sizeof(
42 }
43 
45  muxers_settings_mux_ctx_t **ref_muxers_settings_mux_ctx)
46 {
47  muxers_settings_mux_ctx_t *muxers_settings_mux_ctx= NULL;
48 
49  if(ref_muxers_settings_mux_ctx== NULL)
50  return;
51 
52  if((muxers_settings_mux_ctx= *ref_muxers_settings_mux_ctx)!= NULL) {
53 
54  free(muxers_settings_mux_ctx);
55  *ref_muxers_settings_mux_ctx= NULL;
56  }
57 }
58 
60  volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx)
61 {
62  LOG_CTX_INIT(NULL);
63 
64  /* Check arguments */
65  CHECK_DO(muxers_settings_mux_ctx!= NULL, return STAT_ERROR);
66 
67  muxers_settings_mux_ctx->rtsp_port= 8554;
68  muxers_settings_mux_ctx->time_stamp_freq= 9000; // [Hz]
69  muxers_settings_mux_ctx->rtsp_streaming_session_name= strdup("session");
70  CHECK_DO(muxers_settings_mux_ctx->rtsp_streaming_session_name!= NULL,
71  return STAT_ERROR);
72 
73  return STAT_SUCCESS;
74 }
75 
77  volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx)
78 {
79  if(muxers_settings_mux_ctx== NULL)
80  return;
81 
82  if(muxers_settings_mux_ctx->rtsp_streaming_session_name!= NULL) {
83  free(muxers_settings_mux_ctx->rtsp_streaming_session_name);
84  muxers_settings_mux_ctx->rtsp_streaming_session_name= NULL;
85  }
86 
87  // Reserved for future use
88  // Release here heap-allocated members of the structure.
89 }
90 
92  const muxers_settings_mux_ctx_t *muxers_settings_mux_ctx_src,
93  muxers_settings_mux_ctx_t *muxers_settings_mux_ctx_dst)
94 {
95  LOG_CTX_INIT(NULL);
96 
97  /* Check arguments */
98  CHECK_DO(muxers_settings_mux_ctx_src!= NULL, return STAT_ERROR);
99  CHECK_DO(muxers_settings_mux_ctx_dst!= NULL, return STAT_ERROR);
100 
101  /* Copy simple variable values */
102  memcpy(muxers_settings_mux_ctx_dst, muxers_settings_mux_ctx_src,
103  sizeof(muxers_settings_mux_ctx_t));
104 
105  // Future use: duplicate heap-allocated variables...
106  muxers_settings_mux_ctx_dst->rtsp_streaming_session_name= strdup(
107  muxers_settings_mux_ctx_src->rtsp_streaming_session_name);
108  CHECK_DO(muxers_settings_mux_ctx_dst->rtsp_streaming_session_name!= NULL,
109  return STAT_ERROR);
110 
111  return STAT_SUCCESS;
112 }
113 
115  volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx,
116  const char *str, log_ctx_t *log_ctx)
117 {
118  int end_code= STAT_ERROR;
119  int flag_is_query= 0; // 0-> JSON / 1->query string
120  cJSON *cjson_rest= NULL, *cjson_aux= NULL;
121  char *rtsp_port_str= NULL, *bit_rate_estimated_str= NULL,
122  *time_stamp_freq_str= NULL, *rtsp_streaming_session_name_str= NULL;
123  LOG_CTX_INIT(log_ctx);
124 
125  /* Check arguments */
126  CHECK_DO(muxers_settings_mux_ctx!= NULL, return STAT_ERROR);
127  CHECK_DO(str!= NULL, return STAT_EINVAL);
128 
129  /* Guess string representation format (JSON-REST or Query) */
130  //LOGV("'%s'\n", str); //comment-me
131  flag_is_query= (str[0]=='{' && str[strlen(str)-1]=='}')? 0: 1;
132 
133  /* **** Parse RESTful string to get settings parameters **** */
134 
135  if(flag_is_query== 1) {
136 
137  /* 'rtsp_port' */
138  rtsp_port_str= uri_parser_query_str_get_value("rtsp_port", str);
139  if(rtsp_port_str!= NULL)
140  muxers_settings_mux_ctx->rtsp_port= atoll(rtsp_port_str);
141 
142  /* 'time_stamp_freq' */
143  time_stamp_freq_str= uri_parser_query_str_get_value("time_stamp_freq",
144  str);
145  if(time_stamp_freq_str!= NULL)
146  muxers_settings_mux_ctx->time_stamp_freq= atoll(
147  time_stamp_freq_str);
148 
149  /* 'rtsp_streaming_session_name' */
150  rtsp_streaming_session_name_str= uri_parser_query_str_get_value(
151  "rtsp_streaming_session_name", str);
152  if(rtsp_streaming_session_name_str!= NULL) {
153  char *rtsp_streaming_session_name;
154  CHECK_DO(strlen(rtsp_streaming_session_name_str)> 0,
155  end_code= STAT_EINVAL; goto end);
156 
157  /* Allocate new session name */
158  rtsp_streaming_session_name= strdup(
159  rtsp_streaming_session_name_str);
160  CHECK_DO(rtsp_streaming_session_name!= NULL, goto end);
161 
162  /* Release old session name and set new one */
163  if(muxers_settings_mux_ctx->rtsp_streaming_session_name!= NULL)
164  free(muxers_settings_mux_ctx->rtsp_streaming_session_name);
165  muxers_settings_mux_ctx->rtsp_streaming_session_name=
166  rtsp_streaming_session_name;
167  }
168 
169  } else {
170 
171  /* In the case string format is JSON-REST, parse to cJSON structure */
172  cjson_rest= cJSON_Parse(str);
173  CHECK_DO(cjson_rest!= NULL, goto end);
174 
175  /* 'rtsp_port' */
176  cjson_aux= cJSON_GetObjectItem(cjson_rest, "rtsp_port");
177  if(cjson_aux!= NULL)
178  muxers_settings_mux_ctx->rtsp_port= cjson_aux->valuedouble;
179 
180  /* 'time_stamp_freq' */
181  cjson_aux= cJSON_GetObjectItem(cjson_rest, "time_stamp_freq");
182  if(cjson_aux!= NULL)
183  muxers_settings_mux_ctx->time_stamp_freq= cjson_aux->valuedouble;
184 
185  /* 'rtsp_streaming_session_name' */
186  cjson_aux= cJSON_GetObjectItem(cjson_rest,
187  "rtsp_streaming_session_name");
188  if(cjson_aux!= NULL) {
189  char *rtsp_streaming_session_name;
190  CHECK_DO(strlen(cjson_aux->valuestring)> 0,
191  end_code= STAT_EINVAL; goto end);
192 
193  /* Allocate new session name */
194  rtsp_streaming_session_name= strdup(cjson_aux->valuestring);
195  CHECK_DO(rtsp_streaming_session_name!= NULL, goto end);
196 
197  /* Release old session name and set new one */
198  if(muxers_settings_mux_ctx->rtsp_streaming_session_name!= NULL)
199  free(muxers_settings_mux_ctx->rtsp_streaming_session_name);
200  muxers_settings_mux_ctx->rtsp_streaming_session_name=
201  rtsp_streaming_session_name;
202  }
203 
204  }
205 
206  end_code= STAT_SUCCESS;
207 end:
208  if(cjson_rest!= NULL)
209  cJSON_Delete(cjson_rest);
210  if(rtsp_port_str!= NULL)
211  free(rtsp_port_str);
212  if(bit_rate_estimated_str!= NULL)
213  free(bit_rate_estimated_str);
214  if(time_stamp_freq_str!= NULL)
215  free(time_stamp_freq_str);
216  if(rtsp_streaming_session_name_str!= NULL)
217  free(rtsp_streaming_session_name_str);
218  return end_code;
219 }
220 
222  volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx,
223  cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
224 {
225  int end_code= STAT_ERROR;
226  cJSON *cjson_rest= NULL, *cjson_aux= NULL;
227  LOG_CTX_INIT(log_ctx);
228 
229  /* Check arguments */
230  CHECK_DO(muxers_settings_mux_ctx!= NULL, goto end);
231  CHECK_DO(ref_cjson_rest!= NULL, goto end);
232 
233  *ref_cjson_rest= NULL;
234 
235  /* Create cJSON tree-root object */
236  cjson_rest= cJSON_CreateObject();
237  CHECK_DO(cjson_rest!= NULL, goto end);
238 
239  /* JSON string to be returned:
240  * {
241  * "rtsp_port":number,
242  * "time_stamp_freq":number,
243  * "rtsp_streaming_session_name":string
244  * }
245  */
246 
247  /* 'rtsp_port' */
248  cjson_aux= cJSON_CreateNumber((double)muxers_settings_mux_ctx->rtsp_port);
249  CHECK_DO(cjson_aux!= NULL, goto end);
250  cJSON_AddItemToObject(cjson_rest, "rtsp_port", cjson_aux);
251 
252  /* 'time_stamp_freq' */
253  cjson_aux= cJSON_CreateNumber((double)
254  muxers_settings_mux_ctx->time_stamp_freq);
255  CHECK_DO(cjson_aux!= NULL, goto end);
256  cJSON_AddItemToObject(cjson_rest, "time_stamp_freq", cjson_aux);
257 
258  /* 'rtsp_streaming_session_name' */
259  cjson_aux= cJSON_CreateString(
260  muxers_settings_mux_ctx->rtsp_streaming_session_name);
261  CHECK_DO(cjson_aux!= NULL, goto end);
262  cJSON_AddItemToObject(cjson_rest, "rtsp_streaming_session_name", cjson_aux);
263 
264  *ref_cjson_rest= cjson_rest;
265  cjson_rest= NULL;
266  end_code= STAT_SUCCESS;
267 end:
268  if(cjson_rest!= NULL)
269  cJSON_Delete(cjson_rest);
270  return end_code;
271 }
272 
274 {
275  return (muxers_settings_dmux_ctx_t*)calloc(1, sizeof(
277 }
278 
280  muxers_settings_dmux_ctx_t **ref_muxers_settings_dmux_ctx)
281 {
282  muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx= NULL;
283 
284  if(ref_muxers_settings_dmux_ctx== NULL)
285  return;
286 
287  if((muxers_settings_dmux_ctx= *ref_muxers_settings_dmux_ctx)!= NULL) {
288 
289  if(muxers_settings_dmux_ctx->rtsp_url!= NULL) {
290  free(muxers_settings_dmux_ctx->rtsp_url);
291  muxers_settings_dmux_ctx->rtsp_url= NULL;
292  }
293 
294  free(muxers_settings_dmux_ctx);
295  *ref_muxers_settings_dmux_ctx= NULL;
296  }
297 }
298 
300  volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx)
301 {
302  LOG_CTX_INIT(NULL);
303 
304  /* Check arguments */
305  CHECK_DO(muxers_settings_dmux_ctx!= NULL, return STAT_ERROR);
306 
307  muxers_settings_dmux_ctx->rtsp_url= NULL;
308 
309  return STAT_SUCCESS;
310 }
311 
313  volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx)
314 {
315  if(muxers_settings_dmux_ctx== NULL)
316  return;
317 
318  if(muxers_settings_dmux_ctx->rtsp_url!= NULL) {
319  free(muxers_settings_dmux_ctx->rtsp_url);
320  muxers_settings_dmux_ctx->rtsp_url= NULL;
321  }
322 
323  // Reserved for future use
324  // Release here heap-allocated members of the structure.
325 }
326 
328  const muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx_src,
329  muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx_dst)
330 {
331  LOG_CTX_INIT(NULL);
332 
333  /* Check arguments */
334  CHECK_DO(muxers_settings_dmux_ctx_src!= NULL, return STAT_ERROR);
335  CHECK_DO(muxers_settings_dmux_ctx_dst!= NULL, return STAT_ERROR);
336 
337  /* Copy simple variable values */
338  memcpy(muxers_settings_dmux_ctx_dst, muxers_settings_dmux_ctx_src,
340 
341  // Future use: duplicate heap-allocated variables...
342  muxers_settings_dmux_ctx_dst->rtsp_url= strdup(
343  muxers_settings_dmux_ctx_src->rtsp_url);
344  CHECK_DO(muxers_settings_dmux_ctx_dst->rtsp_url!= NULL, return STAT_ERROR);
345 
346  return STAT_SUCCESS;
347 }
348 
350  volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx,
351  const char *str, log_ctx_t *log_ctx)
352 {
353  int end_code= STAT_ERROR;
354  int flag_is_query= 0; // 0-> JSON / 1->query string
355  cJSON *cjson_rest= NULL;
356  cJSON *cjson_aux= NULL;
357  char *rtsp_url_str= NULL;
358  LOG_CTX_INIT(log_ctx);
359 
360  /* Check arguments */
361  CHECK_DO(muxers_settings_dmux_ctx!= NULL, return STAT_ERROR);
362  CHECK_DO(str!= NULL, return STAT_EINVAL);
363 
364  /* Guess string representation format (JSON-REST or Query) */
365  //LOGV("'%s'\n", str); //comment-me
366  flag_is_query= (str[0]=='{' && str[strlen(str)-1]=='}')? 0: 1;
367 
368  /* **** Parse RESTful string to get settings parameters **** */
369 
370  if(flag_is_query== 1) {
371 
372  /* 'rtsp_url' */
373  rtsp_url_str= uri_parser_query_str_get_value("rtsp_url", str);
374  if(rtsp_url_str!= NULL) {
375  char *rtsp_url;
376  CHECK_DO(strlen(rtsp_url_str)> 0, end_code= STAT_EINVAL; goto end);
377 
378  /* Allocate new session name */
379  rtsp_url= strdup(rtsp_url_str);
380  CHECK_DO(rtsp_url!= NULL, goto end);
381 
382  /* Release old session name and set new one */
383  if(muxers_settings_dmux_ctx->rtsp_url!= NULL)
384  free(muxers_settings_dmux_ctx->rtsp_url);
385  muxers_settings_dmux_ctx->rtsp_url= rtsp_url;
386  }
387 
388  } else {
389 
390  /* In the case string format is JSON-REST, parse to cJSON structure */
391  cjson_rest= cJSON_Parse(str);
392  CHECK_DO(cjson_rest!= NULL, goto end);
393 
394  /* 'rtsp_url' */
395  cjson_aux= cJSON_GetObjectItem(cjson_rest, "rtsp_url");
396  if(cjson_aux!= NULL) {
397  char *rtsp_url;
398  CHECK_DO(strlen(cjson_aux->valuestring)> 0,
399  end_code= STAT_EINVAL; goto end);
400 
401  /* Allocate new session name */
402  rtsp_url= strdup(cjson_aux->valuestring);
403  CHECK_DO(rtsp_url!= NULL, goto end);
404 
405  /* Release old session name and set new one */
406  if(muxers_settings_dmux_ctx->rtsp_url!= NULL)
407  free(muxers_settings_dmux_ctx->rtsp_url);
408  muxers_settings_dmux_ctx->rtsp_url= rtsp_url;
409  }
410  }
411 
412  end_code= STAT_SUCCESS;
413 end:
414  if(cjson_rest!= NULL)
415  cJSON_Delete(cjson_rest);
416  if(rtsp_url_str!= NULL)
417  free(rtsp_url_str);
418  return end_code;
419 }
420 
422  volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx,
423  cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
424 {
425  int end_code= STAT_ERROR;
426  cJSON *cjson_rest= NULL;
427  cJSON *cjson_aux= NULL;
428  LOG_CTX_INIT(log_ctx);
429 
430  CHECK_DO(muxers_settings_dmux_ctx!= NULL, goto end);
431  CHECK_DO(ref_cjson_rest!= NULL, goto end);
432 
433  *ref_cjson_rest= NULL;
434 
435  /* Create cJSON tree-root object */
436  cjson_rest= cJSON_CreateObject();
437  CHECK_DO(cjson_rest!= NULL, goto end);
438 
439  /* JSON string to be returned:
440  * {
441  * "rtsp_url":string
442  * }
443  */
444 
445  /* 'rtsp_url' */
446  cjson_aux= cJSON_CreateString(muxers_settings_dmux_ctx->rtsp_url);
447  CHECK_DO(cjson_aux!= NULL, goto end);
448  cJSON_AddItemToObject(cjson_rest, "rtsp_url", cjson_aux);
449 
450  *ref_cjson_rest= cjson_rest;
451  cjson_rest= NULL;
452  end_code= STAT_SUCCESS;
453 end:
454  if(cjson_rest!= NULL)
455  cJSON_Delete(cjson_rest);
456  return end_code;
457 }
int muxers_settings_mux_ctx_init(volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx)
int muxers_settings_dmux_ctx_restful_put(volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx, const char *str, log_ctx_t *log_ctx)
int muxers_settings_dmux_ctx_restful_get(volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
Multiplexers and de-multiplexers generic settings.
int muxers_settings_dmux_ctx_cpy(const muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx_src, muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx_dst)
muxers_settings_mux_ctx_t * muxers_settings_mux_ctx_allocate()
int muxers_settings_mux_ctx_cpy(const muxers_settings_mux_ctx_t *muxers_settings_mux_ctx_src, muxers_settings_mux_ctx_t *muxers_settings_mux_ctx_dst)
#define CHECK_DO(COND, ACTION)
Definition: check_utils.h:57
void muxers_settings_mux_ctx_release(muxers_settings_mux_ctx_t **ref_muxers_settings_mux_ctx)
int muxers_settings_dmux_ctx_init(volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx)
int muxers_settings_mux_ctx_restful_get(volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx, cJSON **ref_cjson_rest, log_ctx_t *log_ctx)
muxers_settings_dmux_ctx_t * muxers_settings_dmux_ctx_allocate()
void muxers_settings_dmux_ctx_release(muxers_settings_dmux_ctx_t **ref_muxers_settings_dmux_ctx)
Definition: log.c:102
void muxers_settings_mux_ctx_deinit(volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx)
void muxers_settings_dmux_ctx_deinit(volatile muxers_settings_dmux_ctx_t *muxers_settings_dmux_ctx)
int muxers_settings_mux_ctx_restful_put(volatile muxers_settings_mux_ctx_t *muxers_settings_mux_ctx, const char *str, log_ctx_t *log_ctx)