summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEunhye Choi <eunhae1.choi@samsung.com>2022-10-20 20:08:35 +0900
committerEunhye Choi <eunhae1.choi@samsung.com>2022-10-31 15:15:53 +0900
commit51967171a3fce78918a8ff3a1c599daf600c2f6a (patch)
treeb2a2c6586fe179be07b74c9abe991195b6548381
parent7b6ea7f6cc2678e3006c182b2fbaf464a9ca7209 (diff)
downloadmediatransporter-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.h18
-rw-r--r--packaging/capi-media-transporter.spec2
-rw-r--r--src/MediaTransporterSenderSrt.cpp71
-rw-r--r--unittest/ut_srt_receiver.cpp3
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);
}