From: Seungbae Shin Date: Thu, 2 Feb 2023 05:14:18 +0000 (+0900) Subject: webrtc_stats: propagate the user cb return using the return of gst_structure_foreach() X-Git-Tag: accepted/tizen/7.0/unified/20230213.171744~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a2786b25b2b49671295d9c1122d7e8e3377a32e;p=platform%2Fcore%2Fapi%2Fwebrtc.git webrtc_stats: propagate the user cb return using the return of gst_structure_foreach() [Version] 0.3.286 [Issue type] Refactoring Change-Id: If7e8dabfc8fb87f4a93259b81a37f47f3b01608b --- diff --git a/packaging/capi-media-webrtc.spec b/packaging/capi-media-webrtc.spec index 26ec27fc..e53afae4 100644 --- a/packaging/capi-media-webrtc.spec +++ b/packaging/capi-media-webrtc.spec @@ -1,6 +1,6 @@ Name: capi-media-webrtc Summary: A WebRTC library in Tizen Native API -Version: 0.3.285 +Version: 0.3.286 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/webrtc_stats.c b/src/webrtc_stats.c index 6f256e49..4aba7ae3 100644 --- a/src/webrtc_stats.c +++ b/src/webrtc_stats.c @@ -270,7 +270,6 @@ typedef struct _promise_userdata_s { webrtc_s *webrtc; int type_mask; webrtc_callbacks_s stats_cb; - gboolean exit; } promise_userdata_s; typedef struct _stats_userdata_s { @@ -337,7 +336,11 @@ static gboolean __stats_field_foreach_cb(GQuark field_id, const GValue *val, gpo 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++) @@ -364,8 +367,7 @@ invoke_cb: 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); @@ -374,8 +376,7 @@ invoke_cb: 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); @@ -384,8 +385,7 @@ invoke_cb: 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); @@ -394,8 +394,7 @@ invoke_cb: 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); @@ -404,8 +403,7 @@ invoke_cb: 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); @@ -414,8 +412,7 @@ invoke_cb: 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); @@ -424,8 +421,7 @@ invoke_cb: 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); @@ -434,8 +430,7 @@ invoke_cb: 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")) { @@ -454,30 +449,29 @@ skip_callback: 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, @@ -487,155 +481,161 @@ static void __stats_inbound_rtp_invoke_callback(const GstStructure *s, webrtc_st 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; @@ -706,8 +706,7 @@ static gboolean __webrtcbin_stats_cb(GQuark field_id, const GValue *value, gpoin 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; }