From 27029337d30055d4853cf1ac6791810297a87fb1 Mon Sep 17 00:00:00 2001 From: Jan Wollner Date: Thu, 17 Aug 2023 08:57:33 +0200 Subject: [PATCH] Expose ScreamTx transmit rate as screamtx.transmit-bitrate --- code/ScreamTx.cpp | 7 ++++- code/ScreamTx.h | 2 ++ code/wrapper_lib/screamtx_plugin_wrapper.cpp | 29 ++++++++++++++++---- gstscream/src/screamtx/imp.rs | 19 +++++++++++-- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/code/ScreamTx.cpp b/code/ScreamTx.cpp index 6d02e47..9359abb 100644 --- a/code/ScreamTx.cpp +++ b/code/ScreamTx.cpp @@ -1138,9 +1138,14 @@ void ScreamTx::detectLoss(uint32_t time_ntp, struct Transmitted *txPackets, uint float ScreamTx::getTargetBitrate(uint32_t ssrc) { int id; - return getStream(ssrc, id)->getTargetBitrate(); + return getStream(ssrc, id)->getTargetBitrate(); } +float ScreamTx::getTransmitBitrate(uint32_t ssrc) { + return statistics->getAvgRateTx() / 1000.0f; +} + + void ScreamTx::setTargetPriority(uint32_t ssrc, float priority) { int id; Stream *stream = getStream(ssrc, id); diff --git a/code/ScreamTx.h b/code/ScreamTx.h index 0a52897..fcbcfc1 100644 --- a/code/ScreamTx.h +++ b/code/ScreamTx.h @@ -248,6 +248,7 @@ extern "C" { * request a new key frame from a video encoder */ float getTargetBitrate(uint32_t ssrc); + float getTransmitBitrate(uint32_t ssrc); /* * Set target priority for a given stream, priority value should be in range ]0.0..1.0] @@ -416,6 +417,7 @@ extern "C" { Statistics(); void getSummary(float time, char s[]); void add(float rateTx, float rateLost, float rtt, float queueDelay); + float getAvgRateTx() const { return avgRateTx; } private: float lossRateHist[kLossRateHistSize]; float rateLostAcc; diff --git a/code/wrapper_lib/screamtx_plugin_wrapper.cpp b/code/wrapper_lib/screamtx_plugin_wrapper.cpp index e2d3cf1..a87f707 100644 --- a/code/wrapper_lib/screamtx_plugin_wrapper.cpp +++ b/code/wrapper_lib/screamtx_plugin_wrapper.cpp @@ -5,6 +5,7 @@ #include #include #include +#include extern const char *log_tag; @@ -35,9 +36,13 @@ stream_t *getStream(uint32_t ssrc) { } } } - printf("%s %u no stream ssrc %u \n", __FUNCTION__, __LINE__, ssrc); - return NULL; + else { + printf("%s %u stream ssrc 0 is invalid. It must be > 0\n", __FUNCTION__, __LINE__); + } + printf("%s %u no stream ssrc %u \n", __FUNCTION__, __LINE__, ssrc); + return NULL; } + static uint32_t cur_n_streams = 0; stream_t *addStream(uint32_t ssrc) { for (int n = 0; n < kMaxStreams; n++) { @@ -49,7 +54,7 @@ stream_t *addStream(uint32_t ssrc) { return &streams[n]; } } - printf("%s %u can't add ssrc %u \n", __FUNCTION__, __LINE__, ssrc); + printf("%s %u can't add ssrc %u \n", __FUNCTION__, __LINE__, ssrc); return NULL; } @@ -313,6 +318,12 @@ int tx_plugin_main(int argc, char* argv[], uint32_t ssrc) t0 = tp.tv_sec + tp.tv_usec*1e-6 - 1e-3; lastT_ntp = getTimeInNtp(); + if (stream == nullptr) + { + cerr << "ERROR: no stream with ssrc " << ssrc << " found!\n"; + exit(0); + } + /* * Parse command line */ @@ -548,6 +559,7 @@ int tx_plugin_main(int argc, char* argv[], uint32_t ssrc) ect==1, false, enableClockDriftCompensation); + screamTx->setCwndMinLow(5000); if (logFile) { if (append) @@ -565,7 +577,7 @@ int tx_plugin_main(int argc, char* argv[], uint32_t ssrc) pthread_mutex_init(&lock_scream, NULL); pthread_mutex_init(&stream->lock_rtp_queue, NULL); } - stream->rtpQueue = new RtpQueue(); + stream->rtpQueue = new RtpQueue(); screamTx->registerNewStream(stream->rtpQueue, ssrc, @@ -712,11 +724,18 @@ uint8_t ScreamSenderRtcpPush(uint8_t*buf_rtcp, uint32_t recvlen) { return (1); } -void ScreamSenderGetTargetRate (uint32_t ssrc, uint32_t *rate_p, uint32_t *force_idr_p) { +void ScreamSenderGetTargetRate (uint32_t ssrc, uint32_t *rate_p, uint32_t *force_idr_p, uint32_t *transmit_rate_p) { int n = 0; *rate_p = 0; *force_idr_p = 0; stream_t *stream = NULL; + + if (transmit_rate_p) + { + float transmitRate = screamTx->getTransmitBitrate(ssrc); + *transmit_rate_p = transmitRate; + } + /* * Poll rate change for all media sources */ diff --git a/gstscream/src/screamtx/imp.rs b/gstscream/src/screamtx/imp.rs index c276c06..bb823b4 100644 --- a/gstscream/src/screamtx/imp.rs +++ b/gstscream/src/screamtx/imp.rs @@ -30,6 +30,7 @@ struct Settings { params: Option, ssrc: u32, current_max_bitrate: u32, + transmit_rate: u32, } impl Default for Settings { @@ -38,6 +39,7 @@ impl Default for Settings { params: None, ssrc: 0, current_max_bitrate: DEFAULT_CURRENT_MAX_BITRATE, + transmit_rate: 0, } } } @@ -123,7 +125,7 @@ impl Screamtx { marker, ); // println!("imp.rs push rtp size {} ssrc {}", size, ssrc); - ScreamSenderGetTargetRate(ssrc, &mut rate, &mut force_idr); + ScreamSenderGetTargetRate(ssrc, &mut rate, &mut force_idr, &mut settings.transmit_rate); // println!("ScreamSenderGetTargetRate ssrc {}, rate {}, force_idr {} ", ssrc, rate, force_idr); // println!("imp.rs push rtp rate {} {}", rate, force_idr); } @@ -391,7 +393,7 @@ extern "C" { cb: extern "C" fn(stx: *const Screamtx, buf: gst::Buffer, is_push: u8), ); - fn ScreamSenderGetTargetRate(ssrc: u32, rate_p: *mut u32, force_idr_p: *mut u32); + fn ScreamSenderGetTargetRate(ssrc: u32, rate_p: *mut u32, force_idr_p: *mut u32, transmit_rate_p: *mut u32); } // This trait registers our type with the GObject object system and @@ -561,6 +563,14 @@ impl ObjectImpl for Screamtx { .maximum(u32::MAX) .default_value(DEFAULT_CURRENT_MAX_BITRATE) .build(), + glib::ParamSpecUInt::builder("transmit-bitrate") + .nick("Current Transmit Bitrate") + .blurb("Current Transmit bitrate in kbit/sec from scream") + .minimum(0) + .maximum(u32::MAX) + .default_value(0) + .build(), + ] }); PROPERTIES.as_ref() @@ -648,6 +658,11 @@ impl ObjectImpl for Screamtx { let settings = self.settings.lock().unwrap(); settings.current_max_bitrate.to_value() } + "transmit-bitrate" => { + let settings = self.settings.lock().unwrap(); + settings.transmit_rate.to_value() + } + _ => unimplemented!(), } }