Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose ScreamTx transmit rate as screamtx.transmit-bitrate #53

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion code/ScreamTx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions code/ScreamTx.h
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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;
Expand Down
32 changes: 25 additions & 7 deletions code/wrapper_lib/screamtx_plugin_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <sys/time.h>
#include <pthread.h>
#include <unistd.h>
#include <cassert>

extern const char *log_tag;

Expand Down Expand Up @@ -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++) {
Expand All @@ -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;
}

Expand Down Expand Up @@ -314,6 +319,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
*/
Expand Down Expand Up @@ -554,8 +565,8 @@ int tx_plugin_main(int argc, char* argv[], uint32_t ssrc)
ect==1,
false,
enableClockDriftCompensation,
1.0,
newCc);
1.0,
newCc);
screamTx->setCwndMinLow(5000);
if (logFile) {
if (append)
Expand All @@ -573,7 +584,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,
Expand Down Expand Up @@ -720,11 +731,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
*/
Expand Down
19 changes: 17 additions & 2 deletions gstscream/src/screamtx/imp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct Settings {
params: Option<String>,
ssrc: u32,
current_max_bitrate: u32,
transmit_rate: u32,
}

impl Default for Settings {
Expand All @@ -38,6 +39,7 @@ impl Default for Settings {
params: None,
ssrc: 0,
current_max_bitrate: DEFAULT_CURRENT_MAX_BITRATE,
transmit_rate: 0,
}
}
}
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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!(),
}
}
Expand Down