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
3f2a9afc
Commit
3f2a9afc
authored
Jun 03, 2014
by
Gautier Pelloux-Prayer
Browse files
rename analyser to analyzer in files for consistency between files' name and content
parent
13994a64
Changes
5
Hide whitespace changes
Inline
Side-by-side
include/mediastreamer2/bitratecontrol.h
View file @
3f2a9afc
...
...
@@ -44,14 +44,14 @@ enum _MSRateControlActionType{
typedef
enum
_MSRateControlActionType
MSRateControlActionType
;
const
char
*
ms_rate_control_action_type_name
(
MSRateControlActionType
t
);
enum
_MSQosAnaly
s
erNetworkState
{
MSQosAnaly
s
erNetworkFine
,
MSQosAnaly
s
erNetworkUnstable
,
MSQosAnaly
s
erNetworkCongested
,
MSQosAnaly
s
erNetworkLossy
,
enum
_MSQosAnaly
z
erNetworkState
{
MSQosAnaly
z
erNetworkFine
,
MSQosAnaly
z
erNetworkUnstable
,
MSQosAnaly
z
erNetworkCongested
,
MSQosAnaly
z
erNetworkLossy
,
};
typedef
enum
_MSQosAnaly
s
erNetworkState
MSQosAnaly
s
erNetworkState
;
const
char
*
ms_qos_analy
s
er_network_state_name
(
MSQosAnaly
s
erNetworkState
state
);
typedef
enum
_MSQosAnaly
z
erNetworkState
MSQosAnaly
z
erNetworkState
;
const
char
*
ms_qos_analy
z
er_network_state_name
(
MSQosAnaly
z
erNetworkState
state
);
typedef
struct
_MSRateControlAction
{
MSRateControlActionType
type
;
...
...
@@ -83,23 +83,23 @@ MSBitrateDriver *ms_audio_bitrate_driver_new(RtpSession *session, MSFilter *enco
MSBitrateDriver
*
ms_av_bitrate_driver_new
(
RtpSession
*
asession
,
MSFilter
*
aenc
,
RtpSession
*
vsession
,
MSFilter
*
venc
);
MSBitrateDriver
*
ms_bandwidth_bitrate_driver_new
(
RtpSession
*
asession
,
MSFilter
*
aenc
,
RtpSession
*
vsession
,
MSFilter
*
venc
);
typedef
struct
_MSQosAnaly
s
er
MSQosAnaly
s
er
;
typedef
struct
_MSQosAnaly
s
erDesc
MSQosAnaly
s
erDesc
;
typedef
struct
_MSQosAnaly
z
er
MSQosAnaly
z
er
;
typedef
struct
_MSQosAnaly
z
erDesc
MSQosAnaly
z
erDesc
;
struct
_MSQosAnaly
s
erDesc
{
bool_t
(
*
process_rtcp
)(
MSQosAnaly
s
er
*
obj
,
mblk_t
*
rtcp
);
void
(
*
suggest_action
)(
MSQosAnaly
s
er
*
obj
,
MSRateControlAction
*
action
);
bool_t
(
*
has_improved
)(
MSQosAnaly
s
er
*
obj
);
void
(
*
update
)(
MSQosAnaly
s
er
*
);
void
(
*
uninit
)(
MSQosAnaly
s
er
*
);
struct
_MSQosAnaly
z
erDesc
{
bool_t
(
*
process_rtcp
)(
MSQosAnaly
z
er
*
obj
,
mblk_t
*
rtcp
);
void
(
*
suggest_action
)(
MSQosAnaly
z
er
*
obj
,
MSRateControlAction
*
action
);
bool_t
(
*
has_improved
)(
MSQosAnaly
z
er
*
obj
);
void
(
*
update
)(
MSQosAnaly
z
er
*
);
void
(
*
uninit
)(
MSQosAnaly
z
er
*
);
};
/**
* A MSQosAnaly
s
er is responsible to analyze RTCP feedback and suggest actions on bitrate or packet rate accordingly.
* A MSQosAnaly
z
er is responsible to analyze RTCP feedback and suggest actions on bitrate or packet rate accordingly.
* This is an abstract interface.
**/
struct
_MSQosAnaly
s
er
{
MSQosAnaly
s
erDesc
*
desc
;
struct
_MSQosAnaly
z
er
{
MSQosAnaly
z
erDesc
*
desc
;
int
refcnt
;
enum
{
...
...
@@ -109,38 +109,38 @@ struct _MSQosAnalyser{
};
MSQosAnaly
s
er
*
ms_qos_analy
s
er_ref
(
MSQosAnaly
s
er
*
obj
);
void
ms_qos_analy
s
er_unref
(
MSQosAnaly
s
er
*
obj
);
void
ms_qos_analy
s
er_suggest_action
(
MSQosAnaly
s
er
*
obj
,
MSRateControlAction
*
action
);
bool_t
ms_qos_analy
s
er_has_improved
(
MSQosAnaly
s
er
*
obj
);
bool_t
ms_qos_analy
s
er_process_rtcp
(
MSQosAnaly
s
er
*
obj
,
mblk_t
*
rtcp
);
void
ms_qos_analy
s
er_update
(
MSQosAnaly
s
er
*
obj
);
MSQosAnaly
z
er
*
ms_qos_analy
z
er_ref
(
MSQosAnaly
z
er
*
obj
);
void
ms_qos_analy
z
er_unref
(
MSQosAnaly
z
er
*
obj
);
void
ms_qos_analy
z
er_suggest_action
(
MSQosAnaly
z
er
*
obj
,
MSRateControlAction
*
action
);
bool_t
ms_qos_analy
z
er_has_improved
(
MSQosAnaly
z
er
*
obj
);
bool_t
ms_qos_analy
z
er_process_rtcp
(
MSQosAnaly
z
er
*
obj
,
mblk_t
*
rtcp
);
void
ms_qos_analy
z
er_update
(
MSQosAnaly
z
er
*
obj
);
/**
* The simple qos analy
s
er is an implementation of MSQosAnaly
s
er that performs analysis for single stream.
* The simple qos analy
z
er is an implementation of MSQosAnaly
z
er that performs analysis for single stream.
**/
MSQosAnaly
s
er
*
ms_simple_qos_analy
s
er_new
(
RtpSession
*
session
);
MSQosAnaly
z
er
*
ms_simple_qos_analy
z
er_new
(
RtpSession
*
session
);
MSQosAnaly
s
er
*
ms_stateful_qos_analy
s
er_new
(
RtpSession
*
session
);
MSQosAnaly
z
er
*
ms_stateful_qos_analy
z
er_new
(
RtpSession
*
session
);
/**
* The audio/video qos analy
s
er is an implementation of MSQosAnaly
s
er that performs analysis of two audio and video streams.
* The audio/video qos analy
z
er is an implementation of MSQosAnaly
z
er that performs analysis of two audio and video streams.
**/
/*MSQosAnaly
s
er * ms_av_qos_analy
s
er_new(RtpSession *asession, RtpSession *vsession);*/
/*MSQosAnaly
z
er * ms_av_qos_analy
z
er_new(RtpSession *asession, RtpSession *vsession);*/
/**
* The MSBitrateController the overall behavior and state machine of the adaptive rate control system.
* It requires a MSQosAnaly
s
er to obtain analyse of the quality of service, and a MSBitrateDriver
* It requires a MSQosAnaly
z
er to obtain analyse of the quality of service, and a MSBitrateDriver
* to run the actions on media streams, like decreasing or increasing bitrate.
**/
typedef
struct
_MSBitrateController
MSBitrateController
;
/**
* Instanciates MSBitrateController
* @param qosanaly
s
er a Qos analy
s
er object
* @param qosanaly
z
er a Qos analy
z
er object
* @param driver a bitrate driver object.
* The newly created bitrate controller owns references to the analy
s
er and the driver.
* The newly created bitrate controller owns references to the analy
z
er and the driver.
**/
MSBitrateController
*
ms_bitrate_controller_new
(
MSQosAnaly
s
er
*
qosanaly
s
er
,
MSBitrateDriver
*
driver
);
MSBitrateController
*
ms_bitrate_controller_new
(
MSQosAnaly
z
er
*
qosanaly
z
er
,
MSBitrateDriver
*
driver
);
/**
* Asks the bitrate controller to process a newly received RTCP packet.
...
...
@@ -155,14 +155,14 @@ void ms_bitrate_controller_process_rtcp(MSBitrateController *obj, mblk_t *rtcp);
void
ms_bitrate_controller_update
(
MSBitrateController
*
obj
);
/**
* Return the QoS analy
s
er associated to the bitrate controller
* Return the QoS analy
z
er associated to the bitrate controller
**/
const
MSQosAnaly
s
er
*
ms_bitrate_controller_get_qos_analy
s
er
(
MSBitrateController
*
obj
);
const
MSQosAnaly
z
er
*
ms_bitrate_controller_get_qos_analy
z
er
(
MSBitrateController
*
obj
);
/**
* Destroys the bitrate controller
*
* If no other entity holds references to the underlyings MSQosAnaly
s
er and MSBitrateDriver object,
* If no other entity holds references to the underlyings MSQosAnaly
z
er and MSBitrateDriver object,
* then they will be destroyed too.
**/
void
ms_bitrate_controller_destroy
(
MSBitrateController
*
obj
);
...
...
@@ -175,7 +175,7 @@ void ms_bitrate_controller_destroy(MSBitrateController *obj);
* This function actually calls internally:
* <br>
* \code
* ms_bitrate_controller_new(ms_simple_qos_analy
s
er_new(session),ms_audio_bitrate_driver_new(encoder));
* ms_bitrate_controller_new(ms_simple_qos_analy
z
er_new(session),ms_audio_bitrate_driver_new(encoder));
* \endcode
**/
MSBitrateController
*
ms_audio_bitrate_controller_new
(
RtpSession
*
session
,
MSFilter
*
encoder
,
unsigned
int
flags
);
...
...
@@ -189,7 +189,7 @@ MSBitrateController *ms_audio_bitrate_controller_new(RtpSession *session, MSFilt
* This function actually calls internally:
* <br>
* \code
* ms_bitrate_controller_new(ms_av_qos_analy
s
er_new(asession,vsession),ms_av_bitrate_driver_new(aenc,venc));
* ms_bitrate_controller_new(ms_av_qos_analy
z
er_new(asession,vsession),ms_av_bitrate_driver_new(aenc,venc));
* \endcode
**/
MSBitrateController
*
ms_av_bitrate_controller_new
(
RtpSession
*
asession
,
MSFilter
*
aenc
,
RtpSession
*
vsession
,
MSFilter
*
venc
);
...
...
src/voip/bitratecontrol.c
View file @
3f2a9afc
...
...
@@ -42,7 +42,7 @@ const char *state_name(enum state_t st){
}
struct
_MSBitrateController
{
MSQosAnaly
s
er
*
analy
s
er
;
MSQosAnaly
z
er
*
analy
z
er
;
MSBitrateDriver
*
driver
;
enum
state_t
state
;
int
stable_count
;
...
...
@@ -50,9 +50,9 @@ struct _MSBitrateController{
};
MSBitrateController
*
ms_bitrate_controller_new
(
MSQosAnaly
s
er
*
qosanaly
s
er
,
MSBitrateDriver
*
driver
){
MSBitrateController
*
ms_bitrate_controller_new
(
MSQosAnaly
z
er
*
qosanaly
z
er
,
MSBitrateDriver
*
driver
){
MSBitrateController
*
obj
=
ms_new0
(
MSBitrateController
,
1
);
obj
->
analy
s
er
=
ms_qos_analy
s
er_ref
(
qosanaly
s
er
);
obj
->
analy
z
er
=
ms_qos_analy
z
er_ref
(
qosanaly
z
er
);
obj
->
driver
=
ms_bitrate_driver_ref
(
driver
);
return
obj
;
}
...
...
@@ -67,7 +67,7 @@ static void state_machine(MSBitrateController *obj){
case
Stable
:
obj
->
stable_count
++
;
case
Init
:
ms_qos_analy
s
er_suggest_action
(
obj
->
analy
s
er
,
&
action
);
ms_qos_analy
z
er_suggest_action
(
obj
->
analy
z
er
,
&
action
);
if
(
action
.
type
!=
MSRateControlActionDoNothing
){
execute_action
(
obj
,
&
action
);
obj
->
state
=
Probing
;
...
...
@@ -81,10 +81,10 @@ static void state_machine(MSBitrateController *obj){
break
;
case
Probing
:
obj
->
stable_count
=
0
;
if
(
ms_qos_analy
s
er_has_improved
(
obj
->
analy
s
er
)){
if
(
ms_qos_analy
z
er_has_improved
(
obj
->
analy
z
er
)){
obj
->
state
=
Stable
;
}
else
{
ms_qos_analy
s
er_suggest_action
(
obj
->
analy
s
er
,
&
action
);
ms_qos_analy
z
er_suggest_action
(
obj
->
analy
z
er
,
&
action
);
if
(
action
.
type
!=
MSRateControlActionDoNothing
){
execute_action
(
obj
,
&
action
);
}
...
...
@@ -93,7 +93,7 @@ static void state_machine(MSBitrateController *obj){
case
ProbingUp
:
obj
->
stable_count
=
0
;
obj
->
probing_up_count
++
;
ms_qos_analy
s
er_suggest_action
(
obj
->
analy
s
er
,
&
action
);
ms_qos_analy
z
er_suggest_action
(
obj
->
analy
z
er
,
&
action
);
if
(
action
.
type
!=
MSRateControlActionDoNothing
){
execute_action
(
obj
,
&
action
);
obj
->
state
=
Probing
;
...
...
@@ -119,40 +119,40 @@ static void state_machine(MSBitrateController *obj){
void
ms_bitrate_controller_process_rtcp
(
MSBitrateController
*
obj
,
mblk_t
*
rtcp
){
if
(
ms_qos_analy
s
er_process_rtcp
(
obj
->
analy
s
er
,
rtcp
)){
if
(
ms_qos_analy
z
er_process_rtcp
(
obj
->
analy
z
er
,
rtcp
)){
state_machine
(
obj
);
}
}
void
ms_bitrate_controller_update
(
MSBitrateController
*
obj
){
ms_qos_analy
s
er_update
(
obj
->
analy
s
er
);
ms_qos_analy
z
er_update
(
obj
->
analy
z
er
);
}
const
MSQosAnaly
s
er
*
ms_bitrate_controller_get_qos_analy
s
er
(
MSBitrateController
*
obj
){
return
obj
->
analy
s
er
;
const
MSQosAnaly
z
er
*
ms_bitrate_controller_get_qos_analy
z
er
(
MSBitrateController
*
obj
){
return
obj
->
analy
z
er
;
}
void
ms_bitrate_controller_destroy
(
MSBitrateController
*
obj
){
ms_qos_analy
s
er_unref
(
obj
->
analy
s
er
);
ms_qos_analy
z
er_unref
(
obj
->
analy
z
er
);
ms_bitrate_driver_unref
(
obj
->
driver
);
ms_free
(
obj
);
}
MSBitrateController
*
ms_audio_bitrate_controller_new
(
RtpSession
*
session
,
MSFilter
*
encoder
,
unsigned
int
flags
){
return
ms_bitrate_controller_new
(
ms_simple_qos_analy
s
er_new
(
session
),
ms_simple_qos_analy
z
er_new
(
session
),
ms_audio_bitrate_driver_new
(
session
,
encoder
));
}
MSBitrateController
*
ms_av_bitrate_controller_new
(
RtpSession
*
asession
,
MSFilter
*
aenc
,
RtpSession
*
vsession
,
MSFilter
*
venc
){
return
ms_bitrate_controller_new
(
ms_simple_qos_analy
s
er_new
(
vsession
),
ms_simple_qos_analy
z
er_new
(
vsession
),
ms_av_bitrate_driver_new
(
asession
,
aenc
,
vsession
,
venc
));
}
MSBitrateController
*
ms_bandwidth_bitrate_controller_new
(
RtpSession
*
asession
,
MSFilter
*
aenc
,
RtpSession
*
vsession
,
MSFilter
*
venc
){
return
ms_bitrate_controller_new
(
ms_stateful_qos_analy
s
er_new
(
vsession
?
vsession
:
asession
),
ms_stateful_qos_analy
z
er_new
(
vsession
?
vsession
:
asession
),
ms_bandwidth_bitrate_driver_new
(
asession
,
aenc
,
vsession
,
venc
));
}
src/voip/qosanalyzer.c
View file @
3f2a9afc
...
...
@@ -36,7 +36,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* Analyses a received RTCP packet.
* Returns TRUE is relevant information has been found in the rtcp message, FALSE otherwise.
**/
bool_t
ms_qos_analy
s
er_process_rtcp
(
MSQosAnaly
s
er
*
obj
,
mblk_t
*
msg
){
bool_t
ms_qos_analy
z
er_process_rtcp
(
MSQosAnaly
z
er
*
obj
,
mblk_t
*
msg
){
if
(
obj
->
desc
->
process_rtcp
){
return
obj
->
desc
->
process_rtcp
(
obj
,
msg
);
}
...
...
@@ -44,19 +44,19 @@ bool_t ms_qos_analyser_process_rtcp(MSQosAnalyser *obj,mblk_t *msg){
return
FALSE
;
}
void
ms_qos_analy
s
er_suggest_action
(
MSQosAnaly
s
er
*
obj
,
MSRateControlAction
*
action
){
void
ms_qos_analy
z
er_suggest_action
(
MSQosAnaly
z
er
*
obj
,
MSRateControlAction
*
action
){
if
(
obj
->
desc
->
suggest_action
){
obj
->
desc
->
suggest_action
(
obj
,
action
);
}
}
void
ms_qos_analy
s
er_update
(
MSQosAnaly
s
er
*
obj
){
void
ms_qos_analy
z
er_update
(
MSQosAnaly
z
er
*
obj
){
if
(
obj
->
desc
->
update
){
obj
->
desc
->
update
(
obj
);
}
}
bool_t
ms_qos_analy
s
er_has_improved
(
MSQosAnaly
s
er
*
obj
){
bool_t
ms_qos_analy
z
er_has_improved
(
MSQosAnaly
z
er
*
obj
){
if
(
obj
->
desc
->
has_improved
){
return
obj
->
desc
->
has_improved
(
obj
);
}
...
...
@@ -64,12 +64,12 @@ bool_t ms_qos_analyser_has_improved(MSQosAnalyser *obj){
return
TRUE
;
}
MSQosAnaly
s
er
*
ms_qos_analy
s
er_ref
(
MSQosAnaly
s
er
*
obj
){
MSQosAnaly
z
er
*
ms_qos_analy
z
er_ref
(
MSQosAnaly
z
er
*
obj
){
obj
->
refcnt
++
;
return
obj
;
}
void
ms_qos_analy
s
er_unref
(
MSQosAnaly
s
er
*
obj
){
void
ms_qos_analy
z
er_unref
(
MSQosAnaly
z
er
*
obj
){
obj
->
refcnt
--
;
if
(
obj
->
refcnt
<=
0
){
if
(
obj
->
desc
->
uninit
)
...
...
@@ -93,7 +93,7 @@ const char *ms_rate_control_action_type_name(MSRateControlActionType t){
}
/******************************************************************************/
/***************************** Simple QoS analy
s
er ****************************/
/***************************** Simple QoS analy
z
er ****************************/
/******************************************************************************/
static
bool_t
rt_prop_doubled
(
rtpstats_t
*
cur
,
rtpstats_t
*
prev
){
/*ms_message("AudioBitrateController: cur=%f, prev=%f",cur->rt_prop,prev->rt_prop);*/
...
...
@@ -106,7 +106,7 @@ static bool_t rt_prop_doubled(rtpstats_t *cur,rtpstats_t *prev){
return
FALSE
;
}
static
bool_t
simple_rt_prop_increased
(
MSSimpleQosAnaly
s
er
*
obj
){
static
bool_t
simple_rt_prop_increased
(
MSSimpleQosAnaly
z
er
*
obj
){
rtpstats_t
*
cur
=&
obj
->
stats
[
obj
->
curindex
%
STATS_HISTORY
];
rtpstats_t
*
prev
=&
obj
->
stats
[(
STATS_HISTORY
+
obj
->
curindex
-
1
)
%
STATS_HISTORY
];
...
...
@@ -117,8 +117,8 @@ static bool_t simple_rt_prop_increased(MSSimpleQosAnalyser *obj){
return
FALSE
;
}
static
bool_t
simple_analy
s
er_process_rtcp
(
MSQosAnaly
s
er
*
objbase
,
mblk_t
*
rtcp
){
MSSimpleQosAnaly
s
er
*
obj
=
(
MSSimpleQosAnaly
s
er
*
)
objbase
;
static
bool_t
simple_analy
z
er_process_rtcp
(
MSQosAnaly
z
er
*
objbase
,
mblk_t
*
rtcp
){
MSSimpleQosAnaly
z
er
*
obj
=
(
MSSimpleQosAnaly
z
er
*
)
objbase
;
rtpstats_t
*
cur
;
const
report_block_t
*
rb
=
NULL
;
if
(
rtcp_is_SR
(
rtcp
)){
...
...
@@ -142,86 +142,86 @@ static bool_t simple_analyser_process_rtcp(MSQosAnalyser *objbase, mblk_t *rtcp)
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
(
"MSQosAnaly
s
er: lost_percentage=%f, int_jitter=%f ms, rt_prop=%fsec"
,
ms_message
(
"MSQosAnaly
z
er: lost_percentage=%f, int_jitter=%f ms, rt_prop=%fsec"
,
cur
->
lost_percentage
,
cur
->
int_jitter
,
cur
->
rt_prop
);
}
return
rb
!=
NULL
;
}
static
void
simple_analy
s
er_suggest_action
(
MSQosAnaly
s
er
*
objbase
,
MSRateControlAction
*
action
){
MSSimpleQosAnaly
s
er
*
obj
=
(
MSSimpleQosAnaly
s
er
*
)
objbase
;
static
void
simple_analy
z
er_suggest_action
(
MSQosAnaly
z
er
*
objbase
,
MSRateControlAction
*
action
){
MSSimpleQosAnaly
z
er
*
obj
=
(
MSSimpleQosAnaly
z
er
*
)
objbase
;
rtpstats_t
*
cur
=&
obj
->
stats
[
obj
->
curindex
%
STATS_HISTORY
];
/*big losses and big jitter */
if
(
cur
->
lost_percentage
>=
unacceptable_loss_rate
&&
cur
->
int_jitter
>=
big_jitter
){
action
->
type
=
MSRateControlActionDecreaseBitrate
;
action
->
value
=
MIN
(
cur
->
lost_percentage
,
50
);
ms_message
(
"MSQosAnaly
s
er: loss rate unacceptable and big jitter"
);
ms_message
(
"MSQosAnaly
z
er: loss rate unacceptable and big jitter"
);
}
else
if
(
simple_rt_prop_increased
(
obj
)){
action
->
type
=
MSRateControlActionDecreaseBitrate
;
action
->
value
=
20
;
ms_message
(
"MSQosAnaly
s
er: rt_prop doubled."
);
ms_message
(
"MSQosAnaly
z
er: rt_prop doubled."
);
}
else
if
(
cur
->
lost_percentage
>=
unacceptable_loss_rate
){
/*big loss rate but no jitter, and no big rtp_prop: pure lossy network*/
action
->
type
=
MSRateControlActionDecreasePacketRate
;
ms_message
(
"MSQosAnaly
s
er: loss rate unacceptable."
);
ms_message
(
"MSQosAnaly
z
er: loss rate unacceptable."
);
}
else
{
action
->
type
=
MSRateControlActionDoNothing
;
ms_message
(
"MSQosAnaly
s
er: everything is fine."
);
ms_message
(
"MSQosAnaly
z
er: everything is fine."
);
}
}
static
bool_t
simple_analy
s
er_has_improved
(
MSQosAnaly
s
er
*
objbase
){
MSSimpleQosAnaly
s
er
*
obj
=
(
MSSimpleQosAnaly
s
er
*
)
objbase
;
static
bool_t
simple_analy
z
er_has_improved
(
MSQosAnaly
z
er
*
objbase
){
MSSimpleQosAnaly
z
er
*
obj
=
(
MSSimpleQosAnaly
z
er
*
)
objbase
;
rtpstats_t
*
cur
=&
obj
->
stats
[
obj
->
curindex
%
STATS_HISTORY
];
rtpstats_t
*
prev
=&
obj
->
stats
[(
STATS_HISTORY
+
obj
->
curindex
-
1
)
%
STATS_HISTORY
];
if
(
prev
->
lost_percentage
>=
unacceptable_loss_rate
){
if
(
cur
->
lost_percentage
<
prev
->
lost_percentage
){
ms_message
(
"MSQosAnaly
s
er: lost percentage has improved"
);
ms_message
(
"MSQosAnaly
z
er: lost percentage has improved"
);
return
TRUE
;
}
else
goto
end
;
}
if
(
obj
->
rt_prop_doubled
&&
cur
->
rt_prop
<
prev
->
rt_prop
){
ms_message
(
"MSQosAnaly
s
er: rt prop decreased"
);
ms_message
(
"MSQosAnaly
z
er: rt prop decreased"
);
obj
->
rt_prop_doubled
=
FALSE
;
return
TRUE
;
}
end:
ms_message
(
"MSQosAnaly
s
er: no improvements."
);
ms_message
(
"MSQosAnaly
z
er: no improvements."
);
return
FALSE
;
}
static
MSQosAnaly
s
erDesc
simple_analy
s
er_desc
=
{
simple_analy
s
er_process_rtcp
,
simple_analy
s
er_suggest_action
,
simple_analy
s
er_has_improved
static
MSQosAnaly
z
erDesc
simple_analy
z
er_desc
=
{
simple_analy
z
er_process_rtcp
,
simple_analy
z
er_suggest_action
,
simple_analy
z
er_has_improved
};
MSQosAnaly
s
er
*
ms_simple_qos_analy
s
er_new
(
RtpSession
*
session
){
MSSimpleQosAnaly
s
er
*
obj
=
ms_new0
(
MSSimpleQosAnaly
s
er
,
1
);
MSQosAnaly
z
er
*
ms_simple_qos_analy
z
er_new
(
RtpSession
*
session
){
MSSimpleQosAnaly
z
er
*
obj
=
ms_new0
(
MSSimpleQosAnaly
z
er
,
1
);
obj
->
session
=
session
;
obj
->
parent
.
desc
=&
simple_analy
s
er_desc
;
obj
->
parent
.
desc
=&
simple_analy
z
er_desc
;
obj
->
parent
.
type
=
Simple
;
return
(
MSQosAnaly
s
er
*
)
obj
;
return
(
MSQosAnaly
z
er
*
)
obj
;
}
/******************************************************************************/
/***************************** Stateful QoS analy
s
er ****************************/
/***************************** Stateful QoS analy
z
er ****************************/
/******************************************************************************/
const
char
*
ms_qos_analy
s
er_network_state_name
(
MSQosAnaly
s
erNetworkState
state
){
const
char
*
ms_qos_analy
z
er_network_state_name
(
MSQosAnaly
z
erNetworkState
state
){
switch
(
state
){
case
MSQosAnaly
s
erNetworkFine
:
case
MSQosAnaly
z
erNetworkFine
:
return
"fine"
;
case
MSQosAnaly
s
erNetworkUnstable
:
case
MSQosAnaly
z
erNetworkUnstable
:
return
"unstable"
;
case
MSQosAnaly
s
erNetworkCongested
:
case
MSQosAnaly
z
erNetworkCongested
:
return
"congested"
;
case
MSQosAnaly
s
erNetworkLossy
:
case
MSQosAnaly
z
erNetworkLossy
:
return
"lossy"
;
}
return
"bad state type"
;
...
...
@@ -238,7 +238,7 @@ static int sort_points(const rtcpstatspoint_t *p1, const rtcpstatspoint_t *p2){
return
p1
->
bandwidth
>
p2
->
bandwidth
;
}
static
int
stateful_qos_analy
s
er_get_total_emitted
(
const
MSStatefulQosAnaly
s
er
*
obj
,
const
report_block_t
*
rb
){
static
int
stateful_qos_analy
z
er_get_total_emitted
(
const
MSStatefulQosAnaly
z
er
*
obj
,
const
report_block_t
*
rb
){
double
dup
=
obj
->
burst_ratio
;
int
burst_within_start
=
MAX
(
obj
->
previous_ext_high_seq_num_rec
,
obj
->
start_seq_number
);
int
burst_within_end
=
MIN
(
report_block_get_high_ext_seq
(
rb
),
obj
->
last_seq_number
);
...
...
@@ -247,7 +247,7 @@ static int stateful_qos_analyser_get_total_emitted(const MSStatefulQosAnalyser *
return
uniq_emitted
+
MAX
(
0
,
burst_within_end
-
burst_within_start
)
*
dup
;
}
static
double
stateful_qos_analy
s
er_upload_bandwidth
(
MSStatefulQosAnaly
s
er
*
obj
){
static
double
stateful_qos_analy
z
er_upload_bandwidth
(
MSStatefulQosAnaly
z
er
*
obj
){
double
up_bw
=
rtp_session_get_send_bandwidth
(
obj
->
session
)
/
1000
.
0
;
if
(
obj
->
upload_bandwidth_count
){
...
...
@@ -261,8 +261,8 @@ static double stateful_qos_analyser_upload_bandwidth(MSStatefulQosAnalyser *obj)
return
obj
->
upload_bandwidth_latest
;
}
static
bool_t
stateful_analy
s
er_process_rtcp
(
MSQosAnaly
s
er
*
objbase
,
mblk_t
*
rtcp
){
MSStatefulQosAnaly
s
er
*
obj
=
(
MSStatefulQosAnaly
s
er
*
)
objbase
;
static
bool_t
stateful_analy
z
er_process_rtcp
(
MSQosAnaly
z
er
*
objbase
,
mblk_t
*
rtcp
){
MSStatefulQosAnaly
z
er
*
obj
=
(
MSStatefulQosAnaly
z
er
*
)
objbase
;
rtpstats_t
*
cur
;
const
report_block_t
*
rb
=
NULL
;
if
(
rtcp_is_SR
(
rtcp
)){
...
...
@@ -271,8 +271,8 @@ static bool_t stateful_analyser_process_rtcp(MSQosAnalyser *objbase, mblk_t *rtc
rb
=
rtcp_RR_get_report_block
(
rtcp
,
0
);
}
if
(
rb
&&
report_block_get_ssrc
(
rb
)
==
rtp_session_get_send_ssrc
(
obj
->
session
)){
double
up_bw
=
stateful_qos_analy
s
er_upload_bandwidth
(
obj
);
int
total_emitted
=
stateful_qos_analy
s
er_get_total_emitted
(
obj
,
rb
);
double
up_bw
=
stateful_qos_analy
z
er_upload_bandwidth
(
obj
);
int
total_emitted
=
stateful_qos_analy
z
er_get_total_emitted
(
obj
,
rb
);
obj
->
curindex
++
;
cur
=&
obj
->
stats
[
obj
->
curindex
%
STATS_HISTORY
];
...
...
@@ -286,7 +286,7 @@ static bool_t stateful_analyser_process_rtcp(MSQosAnalyser *objbase, mblk_t *rtc
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
(
"MSQosAnaly
s
er: lost_percentage=%f, int_jitter=%f ms, rt_prop=%f sec"
,
cur
->
lost_percentage
,
cur
->
int_jitter
,
cur
->
rt_prop
);
ms_message
(
"MSQosAnaly
z
er: lost_percentage=%f, int_jitter=%f ms, rt_prop=%f sec"
,
cur
->
lost_percentage
,
cur
->
int_jitter
,
cur
->
rt_prop
);
if
(
obj
->
curindex
>
2
){
double
loss_rate
=
cur
->
lost_percentage
/
100
.
0
;
int
cum_loss
=
report_block_get_cum_packet_loss
(
rb
);
...
...
@@ -343,7 +343,7 @@ static MSList *find_first_with_loss(MSList *list){
return
NULL
;
}
static
void
smooth_values
(
MSStatefulQosAnaly
s
er
*
obj
){
static
void
smooth_values
(
MSStatefulQosAnaly
z
er
*
obj
){
MSList
*
first_loss
=
find_first_with_loss
(
obj
->
rtcpstatspoint
);
MSList
*
it
=
obj
->
rtcpstatspoint
;
rtcpstatspoint_t
*
curr
=
(
rtcpstatspoint_t
*
)
it
->
data
;
...
...
@@ -378,7 +378,7 @@ static void smooth_values(MSStatefulQosAnalyser *obj){
curr
->
loss_percent
=
lerp
(
prev_loss
,
curr
->
loss_percent
,
.
75
);
}
static
float
compute_available_bw
(
MSStatefulQosAnaly
s
er
*
obj
){
static
float
compute_available_bw
(
MSStatefulQosAnaly
z
er
*
obj
){
MSList
*
it
;
double
constant_network_loss
=
0
.;
double
mean_bw
=
0
.;
...
...
@@ -448,15 +448,15 @@ static float compute_available_bw(MSStatefulQosAnalyser *obj){
obj
->
network_loss_rate
=
constant_network_loss
;
obj
->
congestion_bandwidth
=
mean_bw
;
obj
->
network_state
=
(
current
==
NULL
&&
constant_network_loss
<
.
1
)
?
MSQosAnaly
s
erNetworkFine
:
(
constant_network_loss
>
.
1
)
?
MSQosAnaly
s
erNetworkLossy
:
MSQosAnaly
s
erNetworkCongested
;
(
current
==
NULL
&&
constant_network_loss
<
.
1
)
?
MSQosAnaly
z
erNetworkFine
:
(
constant_network_loss
>
.
1
)
?
MSQosAnaly
z
erNetworkLossy
:
MSQosAnaly
z
erNetworkCongested
;
return
mean_bw
;
}
static
void
stateful_analy
s
er_suggest_action
(
MSQosAnaly
s
er
*
objbase
,
MSRateControlAction
*
action
){
MSStatefulQosAnaly
s
er
*
obj
=
(
MSStatefulQosAnaly
s
er
*
)
objbase
;
static
void
stateful_analy
z
er_suggest_action
(
MSQosAnaly
z
er
*
objbase
,
MSRateControlAction
*
action
){
MSStatefulQosAnaly
z
er
*
obj
=
(
MSStatefulQosAnaly
z
er
*
)
objbase
;
float
curbw
=
obj
->
latest
?
obj
->
latest
->
bandwidth
:
0
.
f
;
float
bw
=
compute_available_bw
(
obj
);
...
...
@@ -464,7 +464,7 @@ static void stateful_analyser_suggest_action(MSQosAnalyser *objbase, MSRateContr
/*try a burst every 50 seconds (10 RTCP packets)*/
if
(
obj
->
curindex
%
10
==
0
){
P
(
YELLOW
"try burst!
\n
"
);
obj
->
burst_state
=
MSStatefulQosAnaly
s
erBurstEnable
;
obj
->
burst_state
=
MSStatefulQosAnaly
z
erBurstEnable
;
}
/*test a min burst to avoid overestimation of available bandwidth*/
else
if
(
obj
->
curindex
%
10
==
2
||
obj
->
curindex
%
10
==
3
){
...
...
@@ -487,14 +487,14 @@ static void stateful_analyser_suggest_action(MSQosAnalyser *objbase, MSRateContr
P
(
YELLOW
"%s of value %d
\n
"
,
ms_rate_control_action_type_name
(
action
->
type
),
action
->
value
);
}
static
bool_t
stateful_analy
s
er_has_improved
(
MSQosAnaly
s
er
*
objbase
){
static
bool_t
stateful_analy
z
er_has_improved
(
MSQosAnaly
z
er
*
objbase
){
/*never tell the controller that situation has improved to avoid 'Stable' state
which is not necessary for this analy
s
er*/
which is not necessary for this analy
z
er*/
return
FALSE
;
}
static
void
stateful_analy
s
er_update
(
MSQosAnaly
s
er
*
objbase
){
MSStatefulQosAnaly
s
er
*
obj
=
(
MSStatefulQosAnaly
s
er
*
)
objbase
;
static
void
stateful_analy
z
er_update
(
MSQosAnaly
z
er
*
objbase
){
MSStatefulQosAnaly
z
er
*
obj
=
(
MSStatefulQosAnaly
z
er
*
)
objbase
;
static
time_t
last_measure
;
if
(
last_measure
!=
ms_time
(
0
)){
...
...
@@ -505,12 +505,12 @@ static void stateful_analyser_update(MSQosAnalyser *objbase){
if
(
obj
->
burst_duration_ms
>
0
){
switch
(
obj
->
burst_state
){
case
MSStatefulQosAnaly
s
erBurstEnable
:{
obj
->
burst_state
=
MSStatefulQosAnaly
s
erBurstInProgress
;
case
MSStatefulQosAnaly
z
erBurstEnable
:{
obj
->
burst_state
=
MSStatefulQosAnaly
z
erBurstInProgress
;
ortp_gettimeofday
(
&
obj
->
start_time
,
NULL
);
rtp_session_set_duplication_ratio
(
obj
->
session
,
obj
->
burst_ratio
);
obj
->
start_seq_number
=
obj
->
last_seq_number
=
obj
->
session
->
rtp
.
snd_seq
;
}
case
MSStatefulQosAnaly
s
erBurstInProgress
:
{
}
case
MSStatefulQosAnaly
z
erBurstInProgress
:
{
struct
timeval
now
;
double
elapsed
;
...
...
@@ -520,37 +520,37 @@ static void stateful_analyser_update(MSQosAnalyser *objbase){
obj
->
last_seq_number
=
obj
->
session
->
rtp
.
snd_seq
;
if
(
elapsed
>
obj
->
burst_duration_ms
){
obj
->
burst_state
=
MSStatefulQosAnaly
s
erBurstDisable
;
obj
->
burst_state
=
MSStatefulQosAnaly
z
erBurstDisable
;
rtp_session_set_duplication_ratio
(
obj
->
session
,
0
);
}
}
case
MSStatefulQosAnaly
s
erBurstDisable
:
{
}
case
MSStatefulQosAnaly
z
erBurstDisable
:
{
}
}
}
}
static
void
stateful_analy
s
er_uninit
(
MSQosAnaly
s
er
*
objbase
){
MSStatefulQosAnaly
s
er
*
obj
=
(
MSStatefulQosAnaly
s
er
*
)
objbase
;
static
void
stateful_analy
z
er_uninit
(
MSQosAnaly
z
er
*
objbase
){
MSStatefulQosAnaly
z
er
*
obj
=
(
MSStatefulQosAnaly
z
er
*
)
objbase
;
ms_list_for_each
(
obj
->
rtcpstatspoint
,
ms_free
);
}
static
MSQosAnaly
s
erDesc
stateful_analy
s
er_desc
=
{
stateful_analy
s
er_process_rtcp
,
stateful_analy
s
er_suggest_action
,
stateful_analy
s
er_has_improved
,
stateful_analy
s
er_update
,
stateful_analy
s
er_uninit
,
static
MSQosAnaly
z
erDesc
stateful_analy
z
er_desc
=
{
stateful_analy
z
er_process_rtcp
,
stateful_analy
z
er_suggest_action
,
stateful_analy
z
er_has_improved
,
stateful_analy
z
er_update
,
stateful_analy
z
er_uninit
,
};
MSQosAnaly
s
er
*
ms_stateful_qos_analy
s
er_new
(
RtpSession
*
session
){
MSStatefulQosAnaly
s
er
*
obj
=
ms_new0
(
MSStatefulQosAnaly
s
er
,
1
);
MSQosAnaly
z
er
*
ms_stateful_qos_analy
z
er_new
(
RtpSession
*
session
){
MSStatefulQosAnaly
z
er
*
obj
=
ms_new0
(
MSStatefulQosAnaly
z
er
,
1
);
obj
->
session
=
session
;
obj
->
parent
.
desc
=&
stateful_analy
s
er_desc
;
obj
->
parent
.
desc
=&
stateful_analy
z
er_desc
;
obj
->
parent
.
type
=
Stateful
;
/*double the upload bandwidth based on a 5 sec RTCP reports interval*/
obj
->
burst_duration_ms
=
1000
;
obj
->
burst_ratio
=
9
;
return
(
MSQosAnaly
s
er
*
)
obj
;
return
(
MSQosAnaly
z
er
*
)
obj
;
}