FS-10286: [mod_conference] Sync member joins up with keyframes in shared encoder mode

This commit is contained in:
Anthony Minessale 2017-05-03 14:30:07 -05:00
parent 72f5906bd1
commit fe4e2fd536
4 changed files with 27 additions and 7 deletions

View File

@ -923,16 +923,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
av_opt_set_int(context->encoder_ctx->priv_data, "mb_info", SLICE_SIZE - 8, 0); av_opt_set_int(context->encoder_ctx->priv_data, "mb_info", SLICE_SIZE - 8, 0);
} else if (context->av_codec_id == AV_CODEC_ID_H264) { } else if (context->av_codec_id == AV_CODEC_ID_H264) {
context->encoder_ctx->profile = FF_PROFILE_H264_BASELINE; context->encoder_ctx->profile = FF_PROFILE_H264_BASELINE;
context->encoder_ctx->level = 41; context->encoder_ctx->level = 31;
if (context->hw_encoder) { if (context->hw_encoder) {
av_opt_set(context->encoder_ctx->priv_data, "preset", "llhp", 0); av_opt_set(context->encoder_ctx->priv_data, "preset", "llhp", 0);
av_opt_set_int(context->encoder_ctx->priv_data, "2pass", 1, 0); av_opt_set_int(context->encoder_ctx->priv_data, "2pass", 1, 0);
} else { } else {
av_opt_set(context->encoder_ctx->priv_data, "preset", "veryfast", 0); av_opt_set_int(context->encoder_ctx->priv_data, "intra-refresh", 1, 0);
av_opt_set(context->encoder_ctx->priv_data, "tune", "zerolatency", 0); av_opt_set(context->encoder_ctx->priv_data, "preset", "fast", 0);
av_opt_set(context->encoder_ctx->priv_data, "tune", "animation+zerolatency", 0);
av_opt_set(context->encoder_ctx->priv_data, "profile", "baseline", 0); av_opt_set(context->encoder_ctx->priv_data, "profile", "baseline", 0);
av_opt_set_int(context->encoder_ctx->priv_data, "slice-max-size", SLICE_SIZE, 0); av_opt_set_int(context->encoder_ctx->priv_data, "slice-max-size", SLICE_SIZE, 0);
/*
av_opt_set_int(context->encoder_ctx->priv_data, "sc_threshold", 40, 0); av_opt_set_int(context->encoder_ctx->priv_data, "sc_threshold", 40, 0);
av_opt_set_int(context->encoder_ctx->priv_data, "b_strategy", 1, 0); av_opt_set_int(context->encoder_ctx->priv_data, "b_strategy", 1, 0);
av_opt_set_int(context->encoder_ctx->priv_data, "crf", 18, 0); av_opt_set_int(context->encoder_ctx->priv_data, "crf", 18, 0);
@ -948,10 +951,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
context->encoder_ctx->keyint_min = 25; // keyint_min=25 context->encoder_ctx->keyint_min = 25; // keyint_min=25
context->encoder_ctx->i_quant_factor = 0.71; // i_qfactor=0.71 context->encoder_ctx->i_quant_factor = 0.71; // i_qfactor=0.71
context->encoder_ctx->b_quant_factor = 0.76923078; // Qscale difference between P-frames and B-frames. context->encoder_ctx->b_quant_factor = 0.76923078; // Qscale difference between P-frames and B-frames.
context->encoder_ctx->qcompress = 0.6; // qcomp=0.6 context->encoder_ctx->qcompress = 0;//0.6; // qcomp=0.6
context->encoder_ctx->qmin = 10; // qmin=10 context->encoder_ctx->qmin = 10; // qmin=10
context->encoder_ctx->qmax = 51; // qmax=51 context->encoder_ctx->qmax = 51; // qmax=51
context->encoder_ctx->max_qdiff = 4; // qdiff=4 context->encoder_ctx->max_qdiff = 4; // qdiff=4
*/
} }
} }
@ -1148,8 +1152,8 @@ static switch_status_t switch_h264_encode(switch_codec_t *codec, switch_frame_t
if (context->need_key_frame) { if (context->need_key_frame) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG5, "Send AV KEYFRAME\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG5, "Send AV KEYFRAME\n");
av_opt_set_int(context->encoder_ctx->priv_data, "intra-refresh", 1, 0);
avframe->pict_type = AV_PICTURE_TYPE_I; avframe->pict_type = AV_PICTURE_TYPE_I;
avframe->key_frame = 1;
} }
/* encode the image */ /* encode the image */
@ -1164,6 +1168,7 @@ static switch_status_t switch_h264_encode(switch_codec_t *codec, switch_frame_t
if (context->need_key_frame) { if (context->need_key_frame) {
avframe->pict_type = 0; avframe->pict_type = 0;
avframe->key_frame = 0;
context->need_key_frame = 0; context->need_key_frame = 0;
} }

View File

@ -4130,6 +4130,7 @@ SWITCH_STANDARD_API(uuid_video_refresh_function)
if ((lsession = switch_core_session_locate(argv[0]))) { if ((lsession = switch_core_session_locate(argv[0]))) {
switch_core_session_request_video_refresh(lsession); switch_core_session_request_video_refresh(lsession);
switch_core_media_gen_key_frame(lsession);
status = SWITCH_STATUS_SUCCESS; status = SWITCH_STATUS_SUCCESS;
switch_core_session_rwunlock(lsession); switch_core_session_rwunlock(lsession);
} }

View File

@ -999,7 +999,10 @@ switch_status_t conference_video_attach_video_layer(conference_member_t *member,
member->video_layer_id = idx; member->video_layer_id = idx;
member->canvas_id = canvas->canvas_id; member->canvas_id = canvas->canvas_id;
member->layer_timeout = DEFAULT_LAYER_TIMEOUT; member->layer_timeout = DEFAULT_LAYER_TIMEOUT;
canvas->send_keyframe = 1; conference_utils_member_set_flag_locked(member, MFLAG_VIDEO_JOIN);
switch_channel_set_flag(member->channel, CF_VIDEO_REFRESH_REQ);
canvas->send_keyframe = 30;
//member->watching_canvas_id = canvas->canvas_id; //member->watching_canvas_id = canvas->canvas_id;
conference_video_check_used_layers(canvas); conference_video_check_used_layers(canvas);
@ -1325,6 +1328,12 @@ void conference_video_write_canvas_image_to_codec_group(conference_obj_t *confer
continue; continue;
} }
if (conference_utils_member_test_flag(imember, MFLAG_VIDEO_JOIN) && !send_keyframe) {
continue;
}
conference_utils_member_clear_flag(imember, MFLAG_VIDEO_JOIN);
if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO_READY) || if (!imember->session || !switch_channel_test_flag(imember->channel, CF_VIDEO_READY) ||
switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) { switch_core_session_read_lock(imember->session) != SWITCH_STATUS_SUCCESS) {
continue; continue;
@ -3016,6 +3025,10 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
continue; continue;
} }
if (conference_utils_member_test_flag(imember, MFLAG_VIDEO_JOIN)) {
send_keyframe = SWITCH_TRUE;
}
if (need_refresh && imember->session) { if (need_refresh && imember->session) {
switch_core_session_request_video_refresh(imember->session); switch_core_session_request_video_refresh(imember->session);
} }
@ -3125,7 +3138,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
if (canvas->send_keyframe > 0) { if (canvas->send_keyframe > 0) {
if (canvas->send_keyframe == 1 || (canvas->send_keyframe % 10) == 0) { if (canvas->send_keyframe == 1 || (canvas->send_keyframe % 10) == 0) {
send_keyframe = SWITCH_TRUE; send_keyframe = SWITCH_TRUE;
need_refresh = SWITCH_TRUE; //need_refresh = SWITCH_TRUE;
} }
canvas->send_keyframe--; canvas->send_keyframe--;
} }

View File

@ -212,6 +212,7 @@ typedef enum {
MFLAG_ROTATE_VIDEO, MFLAG_ROTATE_VIDEO,
MFLAG_INDICATE_DEAF, MFLAG_INDICATE_DEAF,
MFLAG_INDICATE_UNDEAF, MFLAG_INDICATE_UNDEAF,
MFLAG_VIDEO_JOIN,
/////////////////////////// ///////////////////////////
MFLAG_MAX MFLAG_MAX
} member_flag_t; } member_flag_t;