webrtc_s *webrtc;
int type_mask;
webrtc_callbacks_s stats_cb;
- gboolean exit;
} promise_userdata_s;
typedef struct _stats_userdata_s {
RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
RET_VAL_IF(stats->p_userdata == NULL, FALSE, "p_userdata is NULL");
RET_VAL_IF(stats->p_userdata->webrtc == NULL, FALSE, "webrtc is NULL");
- RET_VAL_IF(stats->fields_list == NULL, FALSE, "fields_list is NULL");
+
+ if (!stats->fields_list) {
+ LOG_WARNING("fields_list is NULL");
+ return TRUE;
+ }
/* Note that it only allow fields pre-defined in list */
for (i = 0; stats->export && stats->fields_list[i]; i++)
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_BOOL, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_BOOL, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_INT: {
gint result = g_value_get_int(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_INT, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_INT, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_INT64: {
gint64 result = g_value_get_int64(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_INT64, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_INT64, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_UINT: {
guint result = g_value_get_uint(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_UINT, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_UINT, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_UINT64: {
guint64 result = g_value_get_uint64(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_UINT64, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_UINT64, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_FLOAT: {
gfloat result = g_value_get_float(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_FLOAT, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_FLOAT, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_DOUBLE: {
gdouble result = g_value_get_double(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_DOUBLE, &result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_DOUBLE, &result, &stats->p_userdata->stats_cb);
}
case G_TYPE_STRING: {
const gchar *result = g_value_get_string(val);
if (prop == WEBRTC_STATS_PROP_NOT_EXPORTED)
goto skip_callback;
- return !(stats->p_userdata->exit =
- !__invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_STRING, (void *)result, &stats->p_userdata->stats_cb));
+ return __invoke_stats_cb(stats->type, field_name, prop, WEBRTC_STATS_PROP_TYPE_STRING, (void *)result, &stats->p_userdata->stats_cb);
}
default:
if (!g_strcmp0(g_type_name(G_VALUE_TYPE(val)), "GstWebRTCStatsType")) {
return TRUE;
}
-static void __stats_codec_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_codec_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list, .export = true };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
}
-static void __stats_inbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_inbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list, .export = true };
g_autoptr(GstStructure) rtpjitterbuffer_stats = NULL;
g_autoptr(GstStructure) rtpsource_stats = NULL;
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
- if (user_data->exit)
- return;
+ if (!gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata))
+ return FALSE;
gst_structure_get(s,
"gst-rtpjitterbuffer-stats", GST_TYPE_STRUCTURE, &rtpjitterbuffer_stats,
stats_userdata.export = false; /* to skip invoking callback stats below */
if (rtpjitterbuffer_stats) {
LOG_DEBUG("gst-rtpjitterbuffer-stats ---> ");
- gst_structure_foreach(rtpjitterbuffer_stats, __stats_field_foreach_cb, &stats_userdata);
+ if (!gst_structure_foreach(rtpjitterbuffer_stats, __stats_field_foreach_cb, &stats_userdata))
+ return FALSE;
}
- if (user_data->exit)
- return;
+
if (rtpsource_stats) {
LOG_DEBUG("gst-rtpsource-stats ---> ");
- gst_structure_foreach(rtpsource_stats, __stats_field_foreach_cb, &stats_userdata);
+ if (!gst_structure_foreach(rtpsource_stats, __stats_field_foreach_cb, &stats_userdata))
+ return FALSE;
}
+
+ return TRUE;
}
-static void __stats_outbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_outbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list, .export = true };
g_autoptr(GstStructure) rtpsource_stats = NULL;
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
- if (user_data->exit)
- return;
+ if (!gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata))
+ return FALSE;
stats_userdata.export = false; /* to skip invoking callback stats below */
+
gst_structure_get(s, "gst-rtpsource-stats", GST_TYPE_STRUCTURE, &rtpsource_stats, NULL);
if (rtpsource_stats) {
LOG_DEBUG("gst-rtpsource-stats ---> ");
- gst_structure_foreach(rtpsource_stats, __stats_field_foreach_cb, &stats_userdata);
+ if (!gst_structure_foreach(rtpsource_stats, __stats_field_foreach_cb, &stats_userdata))
+ return FALSE;
}
+
+ return TRUE;
}
-static void __stats_remote_inbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_remote_inbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list, .export = true };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
}
-static void __stats_remote_outbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_remote_outbound_rtp_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list, .export = true };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
}
-static void __stats_csrc_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_csrc_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_peer_connection_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_peer_connection_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
}
-static void __stats_data_channel_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_data_channel_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_stream_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_stream_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_transport_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_transport_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
}
-static void __stats_candidate_pair_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_candidate_pair_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_local_candidate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_local_candidate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_remote_candidate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_remote_candidate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-static void __stats_certificate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
+static gboolean __stats_certificate_invoke_callback(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data)
{
stats_userdata_s stats_userdata = { .p_userdata = user_data, .type = type, .fields_list = fields_list };
- RET_IF(user_data == NULL, "user_data is NULL");
+ RET_VAL_IF(user_data == NULL, FALSE, "user_data is NULL");
LOG_DEBUG_ENTER();
- gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
+ return gst_structure_foreach(s, __stats_field_foreach_cb, &stats_userdata);
/* not implemented */
}
-typedef void (*stats_func)(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data);
+typedef gboolean (*stats_func)(const GstStructure *s, webrtc_stats_type_e type, stats_field_s **fields_list, promise_userdata_s *user_data);
typedef struct {
stats_func func;
return TRUE;
}
- parse_stats[type].func(s, parse_stats[type].type_mask, parse_stats[type].fields_list, userdata);
- if (userdata->exit) {
+ if (!parse_stats[type].func(s, parse_stats[type].type_mask, parse_stats[type].fields_list, userdata)) {
LOG_INFO("stop stats callback");
return FALSE;
}