Merge "bridge_softmix: Fix some REMB bugs."

16.0
Joshua Colp 8 years ago committed by Gerrit Code Review
commit aa33b706e4

@ -1318,6 +1318,12 @@ static void remb_collect_report(struct ast_bridge *bridge, struct ast_bridge_cha
break; break;
} }
} }
/* After the report is integrated we reset this to 0 in case they stop producing
* REMB reports.
*/
sc->remb.br_mantissa = 0;
sc->remb.br_exp = 0;
} }
static void remb_send_report(struct ast_bridge_channel *bridge_channel, struct softmix_channel *sc) static void remb_send_report(struct ast_bridge_channel *bridge_channel, struct softmix_channel *sc)
@ -1328,20 +1334,18 @@ static void remb_send_report(struct ast_bridge_channel *bridge_channel, struct s
return; return;
} }
/* If we have a new bitrate then use it for the REMB, if not we use the previous /* We always do this calculation as even when the bitrate is zero the browser
* one until we know otherwise. This way the bitrate doesn't drop to 0 all of a sudden. * still prefers it to be accurate instead of lying.
*/ */
if (sc->remb_collector->bitrate) { sc->remb_collector->feedback.remb.br_mantissa = sc->remb_collector->bitrate;
sc->remb_collector->feedback.remb.br_mantissa = sc->remb_collector->bitrate; sc->remb_collector->feedback.remb.br_exp = 0;
sc->remb_collector->feedback.remb.br_exp = 0;
/* The mantissa only has 18 bits available, so while it exceeds them we bump /* The mantissa only has 18 bits available, so while it exceeds them we bump
* up the exp. * up the exp.
*/ */
while (sc->remb_collector->feedback.remb.br_mantissa > 0x3ffff) { while (sc->remb_collector->feedback.remb.br_mantissa > 0x3ffff) {
sc->remb_collector->feedback.remb.br_mantissa = sc->remb_collector->feedback.remb.br_mantissa >> 1; sc->remb_collector->feedback.remb.br_mantissa = sc->remb_collector->feedback.remb.br_mantissa >> 1;
sc->remb_collector->feedback.remb.br_exp++; sc->remb_collector->feedback.remb.br_exp++;
}
} }
for (i = 0; i < AST_VECTOR_SIZE(&bridge_channel->stream_map.to_bridge); ++i) { for (i = 0; i < AST_VECTOR_SIZE(&bridge_channel->stream_map.to_bridge); ++i) {
@ -2062,6 +2066,7 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
struct ast_bridge_channel *participant; struct ast_bridge_channel *participant;
struct ast_vector_int media_types; struct ast_vector_int media_types;
int nths[AST_MEDIA_TYPE_END] = {0}; int nths[AST_MEDIA_TYPE_END] = {0};
int idx;
switch (bridge->softmix.video_mode.mode) { switch (bridge->softmix.video_mode.mode) {
case AST_BRIDGE_VIDEO_MODE_NONE: case AST_BRIDGE_VIDEO_MODE_NONE:
@ -2080,7 +2085,10 @@ static void softmix_bridge_stream_topology_changed(struct ast_bridge *bridge, st
* When channels end up getting added back in they'll reuse their existing * When channels end up getting added back in they'll reuse their existing
* collector and won't need to allocate a new one (unless they were just added). * collector and won't need to allocate a new one (unless they were just added).
*/ */
AST_VECTOR_RESET(&softmix_data->remb_collectors, ao2_cleanup); for (idx = 0; idx < AST_VECTOR_SIZE(&softmix_data->remb_collectors); ++idx) {
ao2_cleanup(AST_VECTOR_GET(&softmix_data->remb_collectors, idx));
AST_VECTOR_REPLACE(&softmix_data->remb_collectors, idx, NULL);
}
/* First traversal: re-initialize all of the participants' stream maps */ /* First traversal: re-initialize all of the participants' stream maps */
AST_LIST_TRAVERSE(&bridge->channels, participant, entry) { AST_LIST_TRAVERSE(&bridge->channels, participant, entry) {

Loading…
Cancel
Save