webrtc_stats: propagate the user cb return using the return of gst_structure_foreach() 64/287664/9
authorSeungbae Shin <seungbae.shin@samsung.com>
Thu, 2 Feb 2023 05:14:18 +0000 (14:14 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Tue, 7 Feb 2023 08:54:29 +0000 (17:54 +0900)
[Version] 0.3.285
[Issue type] Refactoring

Change-Id: If7e8dabfc8fb87f4a93259b81a37f47f3b01608b

packaging/capi-media-webrtc.spec
src/webrtc_stats.c

index e9889e5de1b8a25e6237545ac48bb4796dca99c0..26ec27fc6dd46c1043a9552fbd2f6c6570ed5834 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-webrtc
 Summary:    A WebRTC library in Tizen Native API
-Version:    0.3.284
+Version:    0.3.285
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 6f256e497d6223c290ecf1f11d7f6ce013538c7c..4aba7ae3b20e72fc4a47b9bbd999bf6571305b0f 100644 (file)
@@ -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;
                }