Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
BC
public
mediastreamer2
Commits
4b156f31
Commit
4b156f31
authored
Jun 06, 2014
by
Simon Morlat
Browse files
make use of new OrtpLossRateEstimator
parent
c3529c41
Changes
8
Hide whitespace changes
Inline
Side-by-side
include/mediastreamer2/bitratecontrol.h
View file @
4b156f31
...
...
@@ -100,10 +100,10 @@ struct _MSQosAnalyzerDesc{
**/
struct
_MSQosAnalyzer
{
MSQosAnalyzerDesc
*
desc
;
char
*
label
;
void
(
*
on_action_suggested
)(
void
*
,
const
char
*
,
const
char
*
);
void
*
on_action_suggested_user_pointer
;
int
refcnt
;
enum
{
Simple
,
Stateful
,
...
...
@@ -112,6 +112,7 @@ struct _MSQosAnalyzer{
MSQosAnalyzer
*
ms_qos_analyzer_ref
(
MSQosAnalyzer
*
obj
);
void
ms_qos_analyzer_unref
(
MSQosAnalyzer
*
obj
);
void
ms_qos_analyser_set_label
(
MSQosAnalyzer
*
obj
,
const
char
*
label
);
void
ms_qos_analyzer_suggest_action
(
MSQosAnalyzer
*
obj
,
MSRateControlAction
*
action
);
bool_t
ms_qos_analyzer_has_improved
(
MSQosAnalyzer
*
obj
);
bool_t
ms_qos_analyzer_process_rtcp
(
MSQosAnalyzer
*
obj
,
mblk_t
*
rtcp
);
...
...
include/mediastreamer2/qualityindicator.h
View file @
4b156f31
...
...
@@ -36,6 +36,11 @@ extern "C"{
**/
MS2_PUBLIC
MSQualityIndicator
*
ms_quality_indicator_new
(
RtpSession
*
session
);
/**
* Set a label, just used for logging.
**/
MS2_PUBLIC
void
ms_quality_indicator_set_label
(
MSQualityIndicator
*
obj
,
const
char
*
label
);
/**
* Updates quality indicator based on a received RTCP packet.
**/
...
...
src/voip/audiostream.c
View file @
4b156f31
...
...
@@ -766,6 +766,7 @@ AudioStream *audio_stream_new_with_sessions(const MSMediaStreamSessions *session
stream
->
ms
.
rtpsend
=
ms_filter_new
(
MS_RTP_SEND_ID
);
stream
->
ms
.
ice_check_list
=
NULL
;
stream
->
ms
.
qi
=
ms_quality_indicator_new
(
stream
->
ms
.
sessions
.
rtp_session
);
ms_quality_indicator_set_label
(
stream
->
ms
.
qi
,
"audio"
);
stream
->
ms
.
process_rtcp
=
audio_stream_process_rtcp
;
if
(
ec_desc
!=
NULL
){
stream
->
ec
=
ms_filter_new_from_desc
(
ec_desc
);
...
...
src/voip/mediastream.c
View file @
4b156f31
...
...
@@ -469,23 +469,8 @@ static void media_stream_process_rtcp(MediaStream *stream, mblk_t *m, time_t cur
stream
->
last_packet_time
=
curtime
;
ms_message
(
"%s stream [%p]: receiving RTCP %s%s"
,
media_stream_type_str
(
stream
),
stream
,(
rtcp_is_SR
(
m
)
?
"SR"
:
""
),(
rtcp_is_RR
(
m
)
?
"RR"
:
""
));
do
{
const
report_block_t
*
rb
=
NULL
;
if
(
rtcp_is_SR
(
m
)){
rb
=
rtcp_SR_get_report_block
(
m
,
0
);
}
else
if
(
rtcp_is_RR
(
m
)){
rb
=
rtcp_RR_get_report_block
(
m
,
0
);
}
if
(
rb
){
unsigned
int
ij
;
float
rt
=
rtp_session_get_round_trip_propagation
(
stream
->
sessions
.
rtp_session
);
float
flost
;
ij
=
report_block_get_interarrival_jitter
(
rb
);
flost
=
(
float
)(
100
.
0
*
report_block_get_fraction_lost
(
rb
)
/
256
.
0
);
ms_message
(
"media_stream_process_rtcp[stream=%p]: remote statistics available for [%s] stream
\n\t
remote's interarrival jitter=%u
\n
"
"
\t
remote's lost packets percentage since last report=%f
\n\t
round trip time=%f seconds"
,
stream
,
media_stream_type_str
(
stream
),
ij
,
flost
,
rt
);
if
(
stream
->
use_rc
&&
stream
->
rc
)
ms_bitrate_controller_process_rtcp
(
stream
->
rc
,
m
);
if
(
stream
->
qi
)
ms_quality_indicator_update_from_feedback
(
stream
->
qi
,
m
);
}
if
(
stream
->
use_rc
&&
stream
->
rc
)
ms_bitrate_controller_process_rtcp
(
stream
->
rc
,
m
);
if
(
stream
->
qi
)
ms_quality_indicator_update_from_feedback
(
stream
->
qi
,
m
);
stream
->
process_rtcp
(
stream
,
m
);
}
while
(
rtcp_next_packet
(
m
));
...
...
src/voip/qosanalyzer.c
View file @
4b156f31
...
...
@@ -25,6 +25,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <math.h>
#define LOSS_RATE_MIN_INTERVAL 120
/**
* Analyses a received RTCP packet.
* Returns TRUE is relevant information has been found in the rtcp message, FALSE otherwise.
...
...
@@ -63,6 +65,14 @@ void ms_qos_analyzer_set_on_action_suggested(MSQosAnalyzer *obj,
obj
->
on_action_suggested_user_pointer
=
u
;
}
void
ms_qos_analyser_set_label
(
MSQosAnalyzer
*
obj
,
const
char
*
label
){
if
(
obj
->
label
){
ms_free
(
obj
->
label
);
obj
->
label
=
NULL
;
}
if
(
label
)
obj
->
label
=
ms_strdup
(
label
);
}
MSQosAnalyzer
*
ms_qos_analyzer_ref
(
MSQosAnalyzer
*
obj
){
obj
->
refcnt
++
;
return
obj
;
...
...
@@ -73,6 +83,7 @@ void ms_qos_analyzer_unref(MSQosAnalyzer *obj){
if
(
obj
->
refcnt
<=
0
){
if
(
obj
->
desc
->
uninit
)
obj
->
desc
->
uninit
(
obj
);
if
(
obj
->
label
)
ms_free
(
obj
->
label
);
ms_free
(
obj
);
}
}
...
...
@@ -135,13 +146,15 @@ static bool_t simple_analyzer_process_rtcp(MSQosAnalyzer *objbase, mblk_t *rtcp)
if
(
pt
!=
NULL
)
obj
->
clockrate
=
pt
->
clock_rate
;
else
return
FALSE
;
}
cur
->
lost_percentage
=
100
.
0
*
(
float
)
report_block_get_fraction_lost
(
rb
)
/
256
.
0
;
cur
->
int_jitter
=
1000
.
0
*
(
float
)
report_block_get_interarrival_jitter
(
rb
)
/
(
float
)
obj
->
clockrate
;
cur
->
rt_prop
=
rtp_session_get_round_trip_propagation
(
obj
->
session
);
ms_message
(
"MSQosAnalyzer: lost_percentage=%f, int_jitter=%f ms, rt_prop=%fsec"
,
cur
->
lost_percentage
,
cur
->
int_jitter
,
cur
->
rt_prop
);
if
(
ortp_loss_rate_estimator_process_report_block
(
obj
->
lre
,
rb
)){
cur
->
lost_percentage
=
ortp_loss_rate_estimator_get_value
(
obj
->
lre
);
cur
->
int_jitter
=
1000
.
0
*
(
float
)
report_block_get_interarrival_jitter
(
rb
)
/
(
float
)
obj
->
clockrate
;
cur
->
rt_prop
=
rtp_session_get_round_trip_propagation
(
obj
->
session
);
/*
ms_message("MSQosAnalyzer[%s]: lost_percentage=%f, int_jitter=%f ms, rt_prop=%f sec",
objbase->label ? objbase->label : "", cur->lost_percentage,cur->int_jitter,cur->rt_prop);
*/
}
}
return
rb
!=
NULL
;
}
...
...
@@ -207,10 +220,17 @@ static bool_t simple_analyzer_has_improved(MSQosAnalyzer *objbase){
return
FALSE
;
}
static
void
simple_analyzer_uninit
(
MSQosAnalyzer
*
objbase
){
MSSimpleQosAnalyzer
*
obj
=
(
MSSimpleQosAnalyzer
*
)
objbase
;
ortp_loss_rate_estimator_destroy
(
obj
->
lre
);
}
static
MSQosAnalyzerDesc
simple_analyzer_desc
=
{
simple_analyzer_process_rtcp
,
simple_analyzer_suggest_action
,
simple_analyzer_has_improved
simple_analyzer_has_improved
,
NULL
,
simple_analyzer_uninit
};
MSQosAnalyzer
*
ms_simple_qos_analyzer_new
(
RtpSession
*
session
){
...
...
@@ -218,6 +238,7 @@ MSQosAnalyzer * ms_simple_qos_analyzer_new(RtpSession *session){
obj
->
session
=
session
;
obj
->
parent
.
desc
=&
simple_analyzer_desc
;
obj
->
parent
.
type
=
Simple
;
obj
->
lre
=
ortp_loss_rate_estimator_new
(
LOSS_RATE_MIN_INTERVAL
,
rtp_session_get_seq_number
(
session
));
return
(
MSQosAnalyzer
*
)
obj
;
}
...
...
src/voip/qosanalyzer.h
View file @
4b156f31
...
...
@@ -44,6 +44,7 @@ extern "C" {
typedef
struct
_MSSimpleQosAnalyzer
{
MSQosAnalyzer
parent
;
RtpSession
*
session
;
OrtpLossRateEstimator
*
lre
;
int
clockrate
;
rtpstats_t
stats
[
STATS_HISTORY
];
int
curindex
;
...
...
src/voip/qualityindicator.c
View file @
4b156f31
...
...
@@ -25,11 +25,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define RATING_SCALE 5.0
#define WORSE_JITTER 0.2
#define WORSE_RT_PROP 5.0
#define SEQ_INTERVAL 120
struct
_MSQualityIndicator
{
RtpSession
*
session
;
char
*
label
;
OrtpLossRateEstimator
*
lr_estimator
;
int
clockrate
;
double
sum_ratings
;
double
sum_lq_ratings
;
...
...
@@ -50,6 +52,7 @@ struct _MSQualityIndicator{
MSQualityIndicator
*
ms_quality_indicator_new
(
RtpSession
*
session
){
MSQualityIndicator
*
qi
=
ms_new0
(
MSQualityIndicator
,
1
);
qi
->
session
=
session
;
qi
->
lr_estimator
=
ortp_loss_rate_estimator_new
(
SEQ_INTERVAL
,
rtp_session_get_seq_number
(
qi
->
session
));
qi
->
rating
=
5
.
0
;
qi
->
lq_rating
=
5
.
0
;
qi
->
local_rating
=
1
.
0
;
...
...
@@ -59,6 +62,14 @@ MSQualityIndicator *ms_quality_indicator_new(RtpSession *session){
return
qi
;
}
void
ms_quality_indicator_set_label
(
MSQualityIndicator
*
obj
,
const
char
*
label
){
if
(
obj
->
label
){
ms_free
(
obj
->
label
);
obj
->
label
=
NULL
;
}
if
(
label
)
obj
->
label
=
ms_strdup
(
label
);
}
float
ms_quality_indicator_get_rating
(
const
MSQualityIndicator
*
qi
){
return
qi
->
rating
;
}
...
...
@@ -114,7 +125,7 @@ void ms_quality_indicator_update_from_feedback(MSQualityIndicator *qi, mblk_t *r
}
else
if
(
rtcp_is_RR
(
rtcp
)){
rb
=
rtcp_RR_get_report_block
(
rtcp
,
0
);
}
else
{
ms_warning
(
"ms_quality_indicator_update_from_feedback(): not a RTCP report"
)
;
return
;
}
if
(
qi
->
clockrate
==
0
){
PayloadType
*
pt
=
rtp_profile_get_payload
(
rtp_session_get_send_profile
(
qi
->
session
),
rtp_session_get_send_payload_type
(
qi
->
session
));
...
...
@@ -122,12 +133,22 @@ void ms_quality_indicator_update_from_feedback(MSQualityIndicator *qi, mblk_t *r
else
return
;
}
if
(
rb
){
float
loss_rate
=
(
float
)
report_block_get_fraction_lost
(
rb
)
/
256
.
0
;
float
loss_rate
;
float
inter_jitter
=
(
float
)
report_block_get_interarrival_jitter
(
rb
)
/
(
float
)
qi
->
clockrate
;
float
rt_prop
=
rtp_session_get_round_trip_propagation
(
qi
->
session
);
qi
->
remote_rating
=
compute_rating
(
loss_rate
,
inter_jitter
,
0
,
rt_prop
);
qi
->
remote_lq_rating
=
compute_lq_rating
(
loss_rate
,
inter_jitter
,
0
);
bool_t
new_value
;
new_value
=
ortp_loss_rate_estimator_process_report_block
(
qi
->
lr_estimator
,
rb
);
loss_rate
=
ortp_loss_rate_estimator_get_value
(
qi
->
lr_estimator
);
qi
->
remote_rating
=
compute_rating
(
loss_rate
/
100
.
0
,
inter_jitter
,
0
,
rt_prop
);
qi
->
remote_lq_rating
=
compute_lq_rating
(
loss_rate
/
100
.
0
,
inter_jitter
,
0
);
update_global_rating
(
qi
);
if
(
new_value
){
ms_message
(
"MSQualityIndicator[%p][%s], remote statistics available:"
,
qi
,
qi
->
label
?
qi
->
label
:
"no label"
);
ms_message
(
"Loss-rate:
\t\t
%f"
,
loss_rate
);
ms_message
(
"Interarrival-Jitter:
\t
%f s"
,
inter_jitter
);
ms_message
(
"RT-propagation:
\t
%f s"
,
rt_prop
);
}
}
}
...
...
@@ -191,6 +212,7 @@ float ms_quality_indicator_get_local_late_rate(const MSQualityIndicator *qi){
}
void
ms_quality_indicator_destroy
(
MSQualityIndicator
*
qi
){
ortp_loss_rate_estimator_destroy
(
qi
->
lr_estimator
);
ms_free
(
qi
);
}
...
...
src/voip/videostream.c
View file @
4b156f31
...
...
@@ -196,6 +196,7 @@ VideoStream *video_stream_new_with_sessions(const MSMediaStreamSessions *session
stream
->
ms
.
type
=
VideoStreamType
;
stream
->
ms
.
sessions
=*
sessions
;
stream
->
ms
.
qi
=
ms_quality_indicator_new
(
stream
->
ms
.
sessions
.
rtp_session
);
ms_quality_indicator_set_label
(
stream
->
ms
.
qi
,
"audio"
);
stream
->
ms
.
evq
=
ortp_ev_queue_new
();
stream
->
ms
.
rtpsend
=
ms_filter_new
(
MS_RTP_SEND_ID
);
stream
->
ms
.
ice_check_list
=
NULL
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment