FS-7513 drop bw if there are frequent dropouts

This commit is contained in:
Anthony Minessale 2015-05-15 12:41:50 -05:00 committed by Michael Jerris
parent 495619f248
commit e8f2366bdf

View File

@ -684,6 +684,8 @@ struct conference_member {
switch_image_t *video_mute_img; switch_image_t *video_mute_img;
int blanks; int blanks;
int managed_kps; int managed_kps;
int blackouts;
int good_img;
}; };
typedef enum { typedef enum {
@ -1480,6 +1482,7 @@ static switch_status_t attach_video_layer(conference_member_t *member, int idx)
&member->conference->canvas->letterbox_bgcolor); &member->conference->canvas->letterbox_bgcolor);
member->managed_kps = 0; member->managed_kps = 0;
member->blackouts = 0;
end: end:
@ -2011,25 +2014,38 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
} }
size = switch_queue_size(imember->video_queue); size = switch_queue_size(imember->video_queue);
} while(size > 0); } while(size > 0);
if (!img && switch_test_flag(imember, MFLAG_CAN_BE_SEEN)) {
if (switch_test_flag(imember, MFLAG_CAN_BE_SEEN)) {
if (img) {
imember->good_img++;
if ((imember->good_img % (int)(conference->video_fps.fps * 10)) == 0) {
imember->blackouts = 0;
}
} else {
imember->blanks++; imember->blanks++;
imember->good_img = 0;
if (imember->blanks == conference->video_fps.fps || (imember->blanks % (int)(conference->video_fps.fps * 10)) == 0) { if (imember->blanks == conference->video_fps.fps || (imember->blanks % (int)(conference->video_fps.fps * 10)) == 0) {
imember->blackouts++;
imember->managed_kps = 0;
switch_core_session_request_video_refresh(imember->session); switch_core_session_request_video_refresh(imember->session);
} }
if (imember->blanks == conference->video_fps.fps * 2) { if (imember->blanks == conference->video_fps.fps * 2) {
imember->blackouts++;
check_avatar(imember, SWITCH_TRUE); check_avatar(imember, SWITCH_TRUE);
if (layer && imember->avatar_png_img) { if (layer && imember->avatar_png_img) {
layer->is_avatar = 1; layer->is_avatar = 1;
} }
} }
} }
}
} else { } else {
int flushed = flush_video_queue(imember->video_queue); int flushed = flush_video_queue(imember->video_queue);
if (flushed && imember->blanks) { if (flushed && imember->blanks) {
switch_img_free(&imember->avatar_png_img); switch_img_free(&imember->avatar_png_img);
imember->managed_kps = 0;
if (layer) { if (layer) {
layer->is_avatar = 0; layer->is_avatar = 0;
@ -2113,9 +2129,16 @@ static void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread
} else { } else {
kps = switch_calc_bitrate(layer->screen_w, layer->screen_h, 2, imember->conference->video_fps.fps); kps = switch_calc_bitrate(layer->screen_w, layer->screen_h, 2, imember->conference->video_fps.fps);
if (imember->blackouts > 2) {
kps /= 2;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1,
"%s auto-setting half-bitrate based on loss to %dkps to accomodate %dx%d resolution\n",
switch_channel_get_name(imember->channel), kps, layer->screen_w, layer->screen_h);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "%s auto-setting bitrate to %dkps to accomodate %dx%d resolution\n",
switch_channel_get_name(imember->channel), kps, layer->screen_w, layer->screen_h); switch_channel_get_name(imember->channel), kps, layer->screen_w, layer->screen_h);
} }
}
msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ; msg.message_id = SWITCH_MESSAGE_INDICATE_BITRATE_REQ;
msg.numeric_arg = kps * 1024; msg.numeric_arg = kps * 1024;
@ -8362,6 +8385,7 @@ static switch_status_t conf_api_sub_vmute(conference_member_t *member, switch_st
switch_clear_flag_locked(member, MFLAG_CAN_BE_SEEN); switch_clear_flag_locked(member, MFLAG_CAN_BE_SEEN);
member->managed_kps = 0; member->managed_kps = 0;
member->blackouts = 0;
//if (member->channel) { //if (member->channel) {
//switch_channel_set_flag(member->channel, CF_VIDEO_PAUSE_READ); //switch_channel_set_flag(member->channel, CF_VIDEO_PAUSE_READ);
@ -8421,6 +8445,7 @@ static switch_status_t conf_api_sub_unvmute(conference_member_t *member, switch_
switch_set_flag_locked(member, MFLAG_CAN_BE_SEEN); switch_set_flag_locked(member, MFLAG_CAN_BE_SEEN);
member->managed_kps = 0; member->managed_kps = 0;
member->blackouts = 0;
if (member->channel) { if (member->channel) {
//switch_channel_clear_flag(member->channel, CF_VIDEO_PAUSE_READ); //switch_channel_clear_flag(member->channel, CF_VIDEO_PAUSE_READ);