diff options
author | Eunhye Choi <eunhae1.choi@samsung.com> | 2022-10-20 20:08:35 +0900 |
---|---|---|
committer | Eunhye Choi <eunhae1.choi@samsung.com> | 2022-10-31 15:15:53 +0900 |
commit | 51967171a3fce78918a8ff3a1c599daf600c2f6a (patch) | |
tree | b2a2c6586fe179be07b74c9abe991195b6548381 | |
parent | 7b6ea7f6cc2678e3006c182b2fbaf464a9ca7209 (diff) | |
download | mediatransporter-51967171a3fce78918a8ff3a1c599daf600c2f6a.tar.gz mediatransporter-51967171a3fce78918a8ff3a1c599daf600c2f6a.tar.bz2 mediatransporter-51967171a3fce78918a8ff3a1c599daf600c2f6a.zip |
[1.0.7][srt] monitor the stats
Change-Id: I7f3a65c5f6214efdec45fc82249e3cfead3a9b33
-rw-r--r-- | include/MediaTransporterSenderSrt.h | 18 | ||||
-rw-r--r-- | packaging/capi-media-transporter.spec | 2 | ||||
-rw-r--r-- | src/MediaTransporterSenderSrt.cpp | 71 | ||||
-rw-r--r-- | unittest/ut_srt_receiver.cpp | 3 |
4 files changed, 92 insertions, 2 deletions
diff --git a/include/MediaTransporterSenderSrt.h b/include/MediaTransporterSenderSrt.h index 69d4473..88b79b8 100644 --- a/include/MediaTransporterSenderSrt.h +++ b/include/MediaTransporterSenderSrt.h @@ -20,6 +20,7 @@ #ifdef __cplusplus #include <string> +#include <thread> #include "MediaTransporter.h" #include "MediaTransporterSender.h" @@ -47,9 +48,24 @@ public: mtprConnectionType type() override { return MTPR_CONNECTION_TYPE_SRT_SENDER; } private: + void startStatsMonitoring(); + void stopStatsMonitoring(); + static gpointer _statsMonitorThread(gpointer userData); + static gpointer _updateStats(gpointer userData); + + struct stats { + gint64 packetsSent { 0 }; + gint packetsSentLost { 0 }; + gdouble bandwidthMbps { 0. }; + gdouble sendRateMbps { 0. }; + gdouble rttMs { 0. }; + }; + stats _stats; + GThread* _statsMonitor { nullptr }; + param::srt::connectionParam _connectionParam; std::string _senderAddress; - + bool _threadExit { false }; GstElement* _srtSink { nullptr }; }; diff --git a/packaging/capi-media-transporter.spec b/packaging/capi-media-transporter.spec index a3b2a34..29ce78f 100644 --- a/packaging/capi-media-transporter.spec +++ b/packaging/capi-media-transporter.spec @@ -1,6 +1,6 @@ Name: capi-media-transporter Summary: A Media Transporter library in Tizen Native API -Version: 1.0.6 +Version: 1.0.7 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/MediaTransporterSenderSrt.cpp b/src/MediaTransporterSenderSrt.cpp index 193a45b..c476093 100644 --- a/src/MediaTransporterSenderSrt.cpp +++ b/src/MediaTransporterSenderSrt.cpp @@ -26,6 +26,8 @@ using namespace tizen_media_transporter; using namespace tizen_media_transporter::param::srt; +constexpr unsigned int STATS_UPDATE_INTERVAL = 1000; + static void __callerAddedCb(GstElement* element, gint socket, GSocketAddress* address, gpointer userData) { g_autofree gchar* ip_addr = g_inet_address_to_string(g_inet_socket_address_get_address((GInetSocketAddress*)address)); @@ -54,6 +56,72 @@ static void __callerConnectingCb(GstElement* element, GSocketAddress* peerAddres LOG_INFO("stream_id %s, peer_address %s", stream_id, ip_addr); } +void MediaTransporterSenderSrt::startStatsMonitoring() { + GError* error = NULL; + _statsMonitor = g_thread_try_new("stats_monitor", (GThreadFunc)_statsMonitorThread, (gpointer)this, &error); + + if (error) + LOG_ERROR("failed to create stats_monitor thread %s", error->message); +} + +void MediaTransporterSenderSrt::stopStatsMonitoring() { + _threadExit = true; + if (_statsMonitor) + g_thread_join(_statsMonitor); + _statsMonitor = NULL; +} + +gpointer MediaTransporterSenderSrt::_statsMonitorThread(gpointer userData) +{ + MediaTransporterSenderSrt* srt = static_cast<MediaTransporterSenderSrt*>(userData); + + while (!srt->_threadExit) { + _updateStats(userData); + std::this_thread::sleep_for(std::chrono::milliseconds(STATS_UPDATE_INTERVAL)); + } + + return NULL; +} + +gpointer MediaTransporterSenderSrt::_updateStats(gpointer userData) +{ + GstStructure *structure = NULL; + gchar *str = NULL; + gint latency = 0; + MediaTransporterSenderSrt* srt = static_cast<MediaTransporterSenderSrt*>(userData); + + g_object_get(srt->_srtSink, "stats", &structure, NULL); + g_object_get(srt->_srtSink, "latency", &latency, NULL); + + str = gst_structure_to_string(structure); + SECURE_LOG_DEBUG("SENDER >>> latency %d, stats : %s", latency, str); + g_free(str); + + if (gst_structure_has_field(structure, "callers")) { + GValueArray *array; + + array = (GValueArray *)g_value_get_boxed(gst_structure_get_value(structure, "callers")); + + LOG_DEBUG("SENDER >>> size of callers array : %d", array->n_values); + structure = (GstStructure *)g_value_get_boxed(&array->values[array->n_values - 1]); + } + + gst_structure_get_int64(structure, "packets-sent", &srt->_stats.packetsSent); + gst_structure_get_int(structure, "packets-sent-lost", &srt->_stats.packetsSentLost); + gst_structure_get_double(structure, "send-rate-mbps", &srt->_stats.sendRateMbps); + gst_structure_get_double(structure, "bandwidth-mbps", &srt->_stats.bandwidthMbps); + gst_structure_get_double(structure, "rtt-ms", &srt->_stats.rttMs); + + LOG_DEBUG("SENDER >>> packets_sent %" G_GINT64_FORMAT + ", packets-sent-lost %d, send-rate-mbps %lf, bandwidth-mbps %lf, rtt-ms %lf", + srt->_stats.packetsSent, srt->_stats.packetsSentLost, + srt->_stats.sendRateMbps, srt->_stats.bandwidthMbps, + srt->_stats.rttMs); + + return NULL; +} + + MediaTransporterSenderSrt::MediaTransporterSenderSrt() { LOG_DEBUG("ctor: %p", this); @@ -129,10 +197,13 @@ void MediaTransporterSenderSrt::startPipeline() { gst::_setPipelineState(_gst.pipeline, GST_STATE_PLAYING, MediaTransporterIni::get().general().timeout); + startStatsMonitoring(); } void MediaTransporterSenderSrt::stopPipeline() { + stopStatsMonitoring(); + _srtSink = NULL; gst::_setPipelineState(_gst.pipeline, GST_STATE_NULL, MediaTransporterIni::get().general().timeout); diff --git a/unittest/ut_srt_receiver.cpp b/unittest/ut_srt_receiver.cpp index 358466a..612b66f 100644 --- a/unittest/ut_srt_receiver.cpp +++ b/unittest/ut_srt_receiver.cpp @@ -588,4 +588,7 @@ TEST_F(MediaTransporterTestSrtReceiverWithSender, start_p) ASSERT_EQ(ret, MTPR_ERROR_NONE); ASSERT_TRUE(waitDataPacket(f)); + + ret = mtpr_unset_video_packet_cb(_mtpr); + ASSERT_EQ(ret, MTPR_ERROR_NONE); } |