Fork me on GitHub
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
utils.h
Go to the documentation of this file.
1 
12 #ifndef JANUS_UTILS_H
13 #define JANUS_UTILS_H
14 
15 #include <stdint.h>
16 #include <glib.h>
17 #include <jansson.h>
18 
19 #define JANUS_JSON_STRING JSON_STRING
20 #define JANUS_JSON_INTEGER JSON_INTEGER
21 #define JANUS_JSON_OBJECT JSON_OBJECT
22 #define JANUS_JSON_ARRAY JSON_ARRAY
23 /* Use JANUS_JSON_BOOL instead of the non-existing JSON_BOOLEAN */
24 #define JANUS_JSON_BOOL JSON_TRUE
25 #define JANUS_JSON_PARAM_REQUIRED 1
26 #define JANUS_JSON_PARAM_POSITIVE 2
27 #define JANUS_JSON_PARAM_NONEMPTY 4
28 
30  const gchar *name;
31  json_type jtype;
32  unsigned int flags;
33 };
34 
38 gint64 janus_get_monotonic_time(void);
39 
43 gint64 janus_get_real_time(void);
44 
51 char *janus_string_replace(char *message, const char *old_string, const char *new_string) G_GNUC_WARN_UNUSED_RESULT;
52 
56 gboolean janus_is_true(const char *value);
57 
62 gboolean janus_strcmp_const_time(const void *str1, const void *str2);
63 
67 guint32 janus_random_uint32(void);
68 
71 guint64 janus_random_uint64(void);
72 
80 guint64 *janus_uint64_dup(guint64 num);
81 
84 
86 typedef gsize janus_flags;
87 
90 void janus_flags_reset(janus_flags *flags);
91 
95 void janus_flags_set(janus_flags *flags, gsize flag);
96 
100 void janus_flags_clear(janus_flags *flags, gsize flag);
101 
106 gboolean janus_flags_is_set(janus_flags *flags, gsize flag);
108 
114 int janus_mkdir(const char *dir, mode_t mode);
115 
120 int janus_get_codec_pt(const char *sdp, const char *codec);
121 
126 const char *janus_get_codec_from_pt(const char *sdp, int pt);
127 
131 int janus_pidfile_create(const char *file);
132 
135 int janus_pidfile_remove(void);
136 
142 void janus_get_json_type_name(int jtype, unsigned int flags, char *type_name);
143 
149 gboolean janus_json_is_valid(json_t *val, json_type jtype, unsigned int flags);
150 
161 #define JANUS_VALIDATE_JSON_OBJECT_FORMAT(missing_format, invalid_format, obj, params, error_code, error_cause, log_error, missing_code, invalid_code) \
162  do { \
163  error_code = 0; \
164  unsigned int i; \
165  for(i = 0; i < sizeof(params) / sizeof(struct janus_json_parameter); i++) { \
166  json_t *val = json_object_get(obj, params[i].name); \
167  if(!val) { \
168  if((params[i].flags & JANUS_JSON_PARAM_REQUIRED) != 0) { \
169  error_code = (missing_code); \
170  if(log_error) \
171  JANUS_LOG(LOG_ERR, missing_format "\n", params[i].name); \
172  if(error_cause != NULL) \
173  g_snprintf(error_cause, sizeof(error_cause), missing_format, params[i].name); \
174  break; \
175  } \
176  continue; \
177  } \
178  if(!janus_json_is_valid(val, params[i].jtype, params[i].flags)) { \
179  error_code = (invalid_code); \
180  char type_name[20]; \
181  janus_get_json_type_name(params[i].jtype, params[i].flags, type_name); \
182  if(log_error) \
183  JANUS_LOG(LOG_ERR, invalid_format "\n", params[i].name, type_name); \
184  if(error_cause != NULL) \
185  g_snprintf(error_cause, sizeof(error_cause), invalid_format, params[i].name, type_name); \
186  break; \
187  } \
188  } \
189  } while(0)
190 
199 #define JANUS_VALIDATE_JSON_OBJECT(obj, params, error_code, error_cause, log_error, missing_code, invalid_code) \
200  JANUS_VALIDATE_JSON_OBJECT_FORMAT("Missing mandatory element (%s)", "Invalid element type (%s should be %s)", obj, params, error_code, error_cause, log_error, missing_code, invalid_code)
201 
211 #define JANUS_CHECK_SECRET(secret, obj, member, error_code, error_cause, missing_code, invalid_code, unauthorized_code) \
212  do { \
213  if (secret) { \
214  static struct janus_json_parameter secret_parameters[] = { \
215  {member, JANUS_JSON_STRING, JANUS_JSON_PARAM_REQUIRED} \
216  }; \
217  JANUS_VALIDATE_JSON_OBJECT(obj, secret_parameters, error_code, error_cause, TRUE, missing_code, invalid_code); \
218  if(error_code == 0 && !janus_strcmp_const_time((secret), json_string_value(json_object_get(obj, member)))) { \
219  error_code = (unauthorized_code); \
220  JANUS_LOG(LOG_ERR, "Unauthorized (wrong %s)\n", member); \
221  if(error_cause != NULL) \
222  g_snprintf(error_cause, sizeof(error_cause), "Unauthorized (wrong %s)", member); \
223  } \
224  } \
225  } while(0)
226 
231 gboolean janus_vp8_is_keyframe(const char *buffer, int len);
232 
237 gboolean janus_vp9_is_keyframe(const char *buffer, int len);
238 
243 gboolean janus_h264_is_keyframe(const char *buffer, int len);
244 
250 
254 
264 int janus_vp8_parse_descriptor(char *buffer, int len,
265  uint16_t *picid, uint8_t *tl0picidx, uint8_t *tid, uint8_t *y, uint8_t *keyidx);
266 
272 void janus_vp8_simulcast_descriptor_update(char *buffer, int len, janus_vp8_simulcast_context *context, gboolean switched);
273 
286 int janus_vp9_parse_svc(char *buffer, int len, int *found,
287  int *spatial_layer, int *temporal_layer,
288  uint8_t *p, uint8_t *d, uint8_t *u, uint8_t *b, uint8_t *e);
289 
295 guint32 janus_push_bits(guint32 word, size_t num, guint32 val);
296 
302 void janus_set1(guint8 *data, size_t i, guint8 val);
303 
309 void janus_set2(guint8 *data, size_t i, guint32 val);
310 
316 void janus_set3(guint8 *data, size_t i, guint32 val);
317 
323 void janus_set4(guint8 *data, size_t i, guint32 val);
324 
325 #endif
uint8_t base_tlzi_prev
Definition: utils.h:248
unsigned int flags
Definition: utils.h:32
void janus_set2(guint8 *data, size_t i, guint32 val)
Helper method to set two bytes at a memory position.
Definition: utils.c:985
gsize janus_flags
Janus flags container.
Definition: utils.h:86
struct json_t json_t
Definition: plugin.h:225
int janus_get_codec_pt(const char *sdp, const char *codec)
Ugly and dirty helper to quickly get the payload type associated with a codec in an SDP...
Definition: utils.c:220
guint64 janus_random_uint64(void)
Helper to generate random 64-bit unsigned integers (useful for Janus IDs)
Definition: utils.c:74
const char * janus_get_codec_from_pt(const char *sdp, int pt)
Ugly and dirty helper to quickly get the codec associated with a payload type in an SDP...
Definition: utils.c:309
int janus_pidfile_create(const char *file)
Create and lock a PID file.
Definition: utils.c:364
void janus_get_json_type_name(int jtype, unsigned int flags, char *type_name)
Creates a string describing the JSON type and constraint.
Definition: utils.c:419
void janus_vp8_simulcast_context_reset(janus_vp8_simulcast_context *context)
Set (or reset) the context fields to their default values.
Definition: utils.c:793
int janus_mkdir(const char *dir, mode_t mode)
Helper to create a new directory, and recursively create parent directories if needed.
Definition: utils.c:193
gboolean janus_vp9_is_keyframe(const char *buffer, int len)
Helper method to check if a VP9 frame is a keyframe or not.
Definition: utils.c:575
gboolean janus_vp8_is_keyframe(const char *buffer, int len)
Helper method to check if a VP8 frame is a keyframe or not.
Definition: utils.c:499
uint16_t base_picid_prev
Definition: utils.h:247
void janus_flags_reset(janus_flags *flags)
Janus flags reset method.
Definition: utils.c:96
void janus_set4(guint8 *data, size_t i, guint32 val)
Helper method to set four bytes at a memory position.
Definition: utils.c:996
VP8 simulcasting context, in order to make sure SSRC changes result in coherent picid/temporal level ...
Definition: utils.h:246
const gchar * name
Definition: utils.h:30
gint64 janus_get_monotonic_time(void)
Helper to retrieve the system monotonic time, as Glib's g_get_monotonic_time may not be available (on...
Definition: utils.c:30
json_type jtype
Definition: utils.h:31
gint64 janus_get_real_time(void)
Helper to retrieve the system real time, as Glib's g_get_real_time may not be available (only since 2...
Definition: utils.c:36
uint8_t last_tlzi
Definition: utils.h:248
struct janus_vp8_simulcast_context janus_vp8_simulcast_context
VP8 simulcasting context, in order to make sure SSRC changes result in coherent picid/temporal level ...
Definition: utils.h:29
void janus_set3(guint8 *data, size_t i, guint32 val)
Helper method to set three bytes at a memory position.
Definition: utils.c:990
guint32 janus_random_uint32(void)
Helper to generate random 32-bit unsigned integers (useful for SSRCs, etc.)
Definition: utils.c:70
uint16_t base_picid
Definition: utils.h:247
gboolean janus_flags_is_set(janus_flags *flags, gsize flag)
Janus flags check method.
Definition: utils.c:113
guint32 janus_push_bits(guint32 word, size_t num, guint32 val)
Helper method to push individual bits at the end of a word.
Definition: utils.c:977
gboolean janus_h264_is_keyframe(const char *buffer, int len)
Helper method to check if an H.264 frame is a keyframe or not.
Definition: utils.c:659
char * janus_string_replace(char *message, const char *old_string, const char *new_string) G_GNUC_WARN_UNUSED_RESULT
Helper to replace strings.
Definition: utils.c:122
int janus_pidfile_remove(void)
Unlock and remove a previously created PID file.
Definition: utils.c:403
void janus_flags_set(janus_flags *flags, gsize flag)
Janus flags set method.
Definition: utils.c:101
int janus_vp9_parse_svc(char *buffer, int len, int *found, int *spatial_layer, int *temporal_layer, uint8_t *p, uint8_t *d, uint8_t *u, uint8_t *b, uint8_t *e)
Helper method to parse a VP9 payload descriptor for SVC-related info (e.g., when SVC is enabled) ...
Definition: utils.c:830
guint64 * janus_uint64_dup(guint64 num)
Helper to generate an allocated copy of a guint64 number.
Definition: utils.c:90
gboolean janus_is_true(const char *value)
Helper to parse yes/no|true/false configuration values.
Definition: utils.c:42
uint16_t last_picid
Definition: utils.h:247
void janus_flags_clear(janus_flags *flags, gsize flag)
Janus flags clear method.
Definition: utils.c:107
uint8_t base_tlzi
Definition: utils.h:248
gboolean janus_strcmp_const_time(const void *str1, const void *str2)
Helper to compare strings in constant time.
Definition: utils.c:46
void janus_vp8_simulcast_descriptor_update(char *buffer, int len, janus_vp8_simulcast_context *context, gboolean switched)
Use the context info to update the RTP header of a packet, if needed.
Definition: utils.c:805
int janus_vp8_parse_descriptor(char *buffer, int len, uint16_t *picid, uint8_t *tl0picidx, uint8_t *tid, uint8_t *y, uint8_t *keyidx)
Helper method to parse a VP8 payload descriptor for useful info (e.g., when simulcasting) ...
Definition: utils.c:692
void janus_set1(guint8 *data, size_t i, guint8 val)
Helper method to set one byte at a memory position.
Definition: utils.c:981
gboolean janus_json_is_valid(json_t *val, json_type jtype, unsigned int flags)
Checks whether the JSON value matches the type and constraint.
Definition: utils.c:459