diff options
author | Joshua Colp <jcolp@digium.com> | 2018-04-02 10:53:17 -0300 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2018-04-03 08:13:11 -0600 |
commit | 0f6431e8e4f9678c13f10bc1b45ada932e5f1424 (patch) | |
tree | 9e8f37d2f9667327de96fc1da21f91d3a24bcca3 | |
parent | edba638a729e8363a07f373006c250e66f353d82 (diff) |
app_confbridge / bridge_softmix: Add ability to configure REMB interval.
This change adds a configuration option to app_confbridge which can be
used to set the interval at which we will send a combined REMB (remote
estimated maximum bitrate) frame to sources of video. The bridging API
has also been extended slightly to allow setting this so bridge_softmix
can use it.
ASTERISK-27786
Change-Id: I0e49eae60f369c86434414f3cb8278709c793c82
-rw-r--r-- | apps/app_confbridge.c | 1 | ||||
-rw-r--r-- | apps/confbridge/conf_config_parser.c | 14 | ||||
-rw-r--r-- | apps/confbridge/include/confbridge.h | 1 | ||||
-rw-r--r-- | configs/samples/confbridge.conf.sample | 4 | ||||
-rw-r--r-- | include/asterisk/bridge.h | 9 | ||||
-rw-r--r-- | main/bridge.c | 7 |
6 files changed, 36 insertions, 0 deletions
diff --git a/apps/app_confbridge.c b/apps/app_confbridge.c index 4f1108e6b..d8407d857 100644 --- a/apps/app_confbridge.c +++ b/apps/app_confbridge.c @@ -1543,6 +1543,7 @@ static struct confbridge_conference *join_conference_bridge(const char *conferen } else if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_VIDEO_SRC_SFU)) { ast_bridge_set_sfu_video_mode(conference->bridge); ast_bridge_set_video_update_discard(conference->bridge, conference->b_profile.video_update_discard); + ast_bridge_set_remb_send_interval(conference->bridge, conference->b_profile.remb_send_interval); } /* Link it into the conference bridges container */ diff --git a/apps/confbridge/conf_config_parser.c b/apps/confbridge/conf_config_parser.c index 71da80206..f9d74831c 100644 --- a/apps/confbridge/conf_config_parser.c +++ b/apps/confbridge/conf_config_parser.c @@ -458,6 +458,18 @@ video update requests from clients. </para></description> </configOption> + <configOption name="remb_send_interval" default="0"> + <synopsis>Sets the interval in milliseconds that a combined REMB frame will be sent to video sources</synopsis> + <description><para> + Sets the interval in milliseconds that a combined REMB frame will be sent + to video sources. This is done by taking all REMB frames that have been + received since the last REMB frame was sent, making a combined value, + and sending it to the source. A REMB frame contains receiver estimated + maximum bitrate information. By creating a combined REMB frame the + sender of video can be influenced on the bitrate they choose, allowing + better quality for all receivers. + </para></description> + </configOption> <configOption name="template"> <synopsis>When using the CONFBRIDGE dialplan function, use a bridge profile as a template for creating a new temporary profile</synopsis> </configOption> @@ -1661,6 +1673,7 @@ static char *handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e, } ast_cli(a->fd,"Video Update Discard: %u\n", b_profile.video_update_discard); + ast_cli(a->fd,"REMB Send Interval: %u\n", b_profile.remb_send_interval); ast_cli(a->fd,"sound_only_person: %s\n", conf_get_sound(CONF_SOUND_ONLY_PERSON, b_profile.sounds)); ast_cli(a->fd,"sound_only_one: %s\n", conf_get_sound(CONF_SOUND_ONLY_ONE, b_profile.sounds)); @@ -2231,6 +2244,7 @@ int conf_load_config(void) aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language)); aco_option_register_custom(&cfg_info, "sound_", ACO_PREFIX, bridge_types, NULL, sound_option_handler, 0); aco_option_register(&cfg_info, "video_update_discard", ACO_EXACT, bridge_types, "2000", OPT_UINT_T, 0, FLDSET(struct bridge_profile, video_update_discard)); + aco_option_register(&cfg_info, "remb_send_interval", ACO_EXACT, bridge_types, "0", OPT_UINT_T, 0, FLDSET(struct bridge_profile, remb_send_interval)); /* This option should only be used with the CONFBRIDGE dialplan function */ aco_option_register_custom(&cfg_info, "template", ACO_EXACT, bridge_types, NULL, bridge_template_handler, 0); diff --git a/apps/confbridge/include/confbridge.h b/apps/confbridge/include/confbridge.h index 044ab4003..c2f8f9a58 100644 --- a/apps/confbridge/include/confbridge.h +++ b/apps/confbridge/include/confbridge.h @@ -222,6 +222,7 @@ struct bridge_profile { struct bridge_profile_sounds *sounds; char regcontext[AST_MAX_CONTEXT]; unsigned int video_update_discard; /*!< Amount of time after sending a video update request that subsequent requests should be discarded */ + unsigned int remb_send_interval; /*!< Interval at which a combined REMB frame is sent to video sources */ }; /*! \brief The structure that represents a conference bridge */ diff --git a/configs/samples/confbridge.conf.sample b/configs/samples/confbridge.conf.sample index e2d8a620d..4028593d2 100644 --- a/configs/samples/confbridge.conf.sample +++ b/configs/samples/confbridge.conf.sample @@ -235,6 +235,10 @@ type=bridge ; the video stream. Since a full frame can be large limiting how often they occur can ; reduce bandwidth usage at the cost of increasing how long it may take a newly joined ; channel to receive the video stream. +;remb_send_interval=1000 ; Interval (in milliseconds) at which a combined REMB frame will be sent to sources of video. + ; A REMB frame contains receiver estimated maximum bitrate information. By creating a combined + ; frame and sending it to the sources of video the sender can be influenced on what bitrate + ; they choose allowing a better experience for the receivers. This defaults to 0, or disabled. ; All sounds in the conference are customizable using the bridge profile options below. ; Simply state the option followed by the filename or full path of the filename after diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h index 8d5c50211..b23255844 100644 --- a/include/asterisk/bridge.h +++ b/include/asterisk/bridge.h @@ -135,6 +135,7 @@ struct ast_bridge_video_mode { struct ast_bridge_video_talker_src_data talker_src_data; } mode_data; unsigned int video_update_discard; + unsigned int remb_send_interval; }; /*! @@ -912,6 +913,14 @@ void ast_bridge_set_sfu_video_mode(struct ast_bridge *bridge); void ast_bridge_set_video_update_discard(struct ast_bridge *bridge, unsigned int video_update_discard); /*! + * \brief Set the interval at which a combined REMB frame will be sent to video sources + * + * \param bridge Bridge to set the REMB send interval on + * \param remb_send_interval The REMB send interval + */ +void ast_bridge_set_remb_send_interval(struct ast_bridge *bridge, unsigned int remb_send_interval); + +/*! * \brief Update information about talker energy for talker src video mode. */ void ast_bridge_update_talker_src_video_mode(struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyfame); diff --git a/main/bridge.c b/main/bridge.c index 1109c4b76..93c53dd15 100644 --- a/main/bridge.c +++ b/main/bridge.c @@ -3850,6 +3850,13 @@ void ast_bridge_set_video_update_discard(struct ast_bridge *bridge, unsigned int ast_bridge_unlock(bridge); } +void ast_bridge_set_remb_send_interval(struct ast_bridge *bridge, unsigned int remb_send_interval) +{ + ast_bridge_lock(bridge); + bridge->softmix.video_mode.remb_send_interval = remb_send_interval; + ast_bridge_unlock(bridge); +} + void ast_bridge_update_talker_src_video_mode(struct ast_bridge *bridge, struct ast_channel *chan, int talker_energy, int is_keyframe) { struct ast_bridge_video_talker_src_data *data; |