]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
app_confbridge: Always set minimum video update interval.
authorNaveen Albert <asterisk@phreaknet.org>
Sat, 18 Jun 2022 12:17:50 +0000 (12:17 +0000)
committerFriendly Automation <jenkins2@gerrit.asterisk.org>
Wed, 13 Jul 2022 22:58:27 +0000 (17:58 -0500)
Currently, if multiple video-enabled ConfBridges are
conferenced together, we immediately get into a scenario
where an infinite sequence of video updates fills up
the taskprocessor queue and causes memory consumption
to climb unabated until Asterisk is killed. This is due
to the core bridging mechanism that provides video updates
(softmix_bridge_write_control in bridge_softmix.c)
continously updating all the channels in the bridge with
video updates.

The logic to do so in the core is that the video updates
should be provided if the video_update_discard property
for the bridge is 0, or if enough time has elapsed since
the last video update. Thus, we already have a safeguard
built in to ensure the scenario described above does not
happen. Currently, however, this safeguard is not being
adequately ensured.

In app_confbridge, the video_update_discard property
defaults to 2000, which is a healthy value that should
completely prevent this issue. However, this value is
only set onto the bridge in the SFU video mode. This
leaves video modes such as follow_talker completely
vulnerable, since video_update_discard will actually
be 0, since the default or set value was never applied.
As a result, the core bridging mechanism will always
try to provide video updates regardless of when the last
one was sent.

To prevent this issue from happening, we now always
set the video_update_discard property on the bridge
with the value from the bridge profile. The app_confbridge
defaults will thus ensure that infinite video updates
no longer happen in any video mode.

ASTERISK-29907 #close

Change-Id: I4accb2536ac62797950468e9930f12ef7dd486b2

apps/app_confbridge.c

index 24dc63e1341fc895709d6ecee70cec616e564e2e..afb8c91b577fe7dba8de301ee8c77ab695514dc5 100644 (file)
@@ -1804,7 +1804,6 @@ static struct confbridge_conference *join_conference_bridge(const char *conferen
                        ast_bridge_set_talker_src_video_mode(conference->bridge);
                } 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);
                        if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_REMB_BEHAVIOR_AVERAGE)) {
                                ast_brige_set_remb_behavior(conference->bridge, AST_BRIDGE_VIDEO_SFU_REMB_AVERAGE);
@@ -1824,6 +1823,9 @@ static struct confbridge_conference *join_conference_bridge(const char *conferen
                        }
                }
 
+               /* Always set the minimum interval between video updates, to avoid infinite video updates. */
+               ast_bridge_set_video_update_discard(conference->bridge, conference->b_profile.video_update_discard);
+
                if (ast_test_flag(&conference->b_profile, BRIDGE_OPT_ENABLE_EVENTS)) {
                        ast_bridge_set_send_sdp_label(conference->bridge, 1);
                }