1
0
mirror of https://github.com/signalwire/freeswitch.git synced 2025-03-05 10:08:08 +00:00

tweak av and ensure first image write at pts = 0 to avoid a black screen

This commit is contained in:
Seven Du 2017-12-10 10:56:48 +08:00 committed by Mike Jerris
parent 42d26c4d1a
commit e65f63ae25
3 changed files with 27 additions and 22 deletions
src
include
mod/applications/mod_av

@ -621,6 +621,7 @@ struct switch_video_codec_settings {
int32_t width; int32_t width;
int32_t height; int32_t height;
uint8_t try_hardware_encoder; uint8_t try_hardware_encoder;
uint8_t fps;
}; };
union switch_codec_settings { union switch_codec_settings {

@ -890,7 +890,9 @@ static switch_status_t open_encoder(h264_codec_context_t *context, uint32_t widt
if (context->codec_settings.video.bandwidth) { if (context->codec_settings.video.bandwidth) {
context->bandwidth = context->codec_settings.video.bandwidth; context->bandwidth = context->codec_settings.video.bandwidth;
} else { } else {
context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 1, 15); double fps = context->codec_settings.video.fps > 0 ? context->codec_settings.video.fps : 15.0;
context->bandwidth = switch_calc_bitrate(context->codec_settings.video.width, context->codec_settings.video.height, 1, fps);
} }
sane = switch_calc_bitrate(1920, 1080, 3, 60); sane = switch_calc_bitrate(1920, 1080, 3, 60);

@ -470,7 +470,7 @@ GCC_DIAG_ON(deprecated-declarations)
mst->st->time_base.num = 1; mst->st->time_base.num = 1;
c->time_base.den = 90000; c->time_base.den = 90000;
c->time_base.num = 1; c->time_base.num = 1;
c->gop_size = 25; /* emit one intra frame every x frames at mmst */ c->gop_size = fps * 10; /* emit one intra frame every 10 frames at most */
c->pix_fmt = AV_PIX_FMT_YUV420P; c->pix_fmt = AV_PIX_FMT_YUV420P;
//c->thread_count = threads; //c->thread_count = threads;
c->rc_initial_buffer_occupancy = buffer_bytes * 8; c->rc_initial_buffer_occupancy = buffer_bytes * 8;
@ -523,25 +523,19 @@ GCC_DIAG_ON(deprecated-declarations)
} }
} }
if (mm) {
if (mm->vb) { switch_assert(mm);
c->bit_rate = mm->vb * 1024;
}
if (mm->keyint) {
c->gop_size = mm->keyint;
}
}
if (mm->cbr) { if (mm->cbr) {
c->rc_min_rate = c->bit_rate; c->rc_min_rate = c->bit_rate;
c->rc_max_rate = c->bit_rate; c->rc_max_rate = c->bit_rate;
c->rc_buffer_size = c->bit_rate; c->rc_buffer_size = c->bit_rate;
c->qcompress = 0; c->qcompress = 0;
c->gop_size = mm->fps * 2; c->gop_size = fps * 2;
c->keyint_min = mm->fps * 2; c->keyint_min = fps * 2;
} else { } else {
c->gop_size = 250; // g=250 c->gop_size = fps * 10;
c->keyint_min = 25; // keyint_min=25 c->keyint_min = fps;
c->i_quant_factor = 0.71; // i_qfactor=0.71 c->i_quant_factor = 0.71; // i_qfactor=0.71
c->qcompress = 0.6; // qcomp=0.6 c->qcompress = 0.6; // qcomp=0.6
c->qmin = 10; // qmin=10 c->qmin = 10; // qmin=10
@ -550,17 +544,23 @@ GCC_DIAG_ON(deprecated-declarations)
av_opt_set_int(c->priv_data, "crf", 18, 0); av_opt_set_int(c->priv_data, "crf", 18, 0);
} }
if (mm->vb) {
c->bit_rate = mm->vb * 1024;
}
if (mm->keyint) {
c->gop_size = mm->keyint;
}
if (codec_id == AV_CODEC_ID_VP8) { if (codec_id == AV_CODEC_ID_VP8) {
av_set_options_string(c, "quality=realtime", "=", ":"); av_set_options_string(c, "quality=realtime", "=", ":");
} }
av_opt_set_int(c->priv_data, "slice-max-size", SWITCH_DEFAULT_VIDEO_SIZE, 0); // av_opt_set_int(c->priv_data, "slice-max-size", SWITCH_DEFAULT_VIDEO_SIZE, 0);
c->colorspace = AVCOL_SPC_RGB; c->colorspace = AVCOL_SPC_RGB;
c->color_range = AVCOL_RANGE_JPEG; c->color_range = AVCOL_RANGE_JPEG;
break; break;
default: default:
break; break;
@ -750,6 +750,7 @@ static void *SWITCH_THREAD_FUNC video_thread_run(switch_thread_t *thread, void *
int d_w = context->eh.video_st->width, d_h = context->eh.video_st->height; int d_w = context->eh.video_st->width, d_h = context->eh.video_st->height;
int size = 0, skip = 0, skip_freq = 0, skip_count = 0, skip_total = 0, skip_total_count = 0; int size = 0, skip = 0, skip_freq = 0, skip_count = 0, skip_total = 0, skip_total_count = 0;
uint64_t delta_avg = 0, delta_sum = 0, delta_i = 0, delta = 0; uint64_t delta_avg = 0, delta_sum = 0, delta_i = 0, delta = 0;
int first = 1;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "video thread start\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "video thread start\n");
switch_assert(context->eh.video_queue); switch_assert(context->eh.video_queue);
@ -828,7 +829,9 @@ static void *SWITCH_THREAD_FUNC video_thread_run(switch_thread_t *thread, void *
fill_avframe(context->eh.video_st->frame, img); fill_avframe(context->eh.video_st->frame, img);
if (context->eh.finalize) { if (first) {
first = 0; // pts = 0;
} else if (context->eh.finalize) {
if (delta_i && !delta_avg) { if (delta_i && !delta_avg) {
delta_avg = (int)(double)(delta_sum / delta_i); delta_avg = (int)(double)(delta_sum / delta_i);
delta_i = 1; delta_i = 1;
@ -849,17 +852,16 @@ static void *SWITCH_THREAD_FUNC video_thread_run(switch_thread_t *thread, void *
switch_core_timer_sync(context->eh.video_timer); switch_core_timer_sync(context->eh.video_timer);
delta_tmp = (context->eh.video_timer->samplecount * 90) - context->eh.last_ts; delta_tmp = (context->eh.video_timer->samplecount * 90) - context->eh.last_ts;
if (delta_tmp != 0) { if (delta_tmp != 0) {
delta_sum += delta_tmp; delta_sum += delta_tmp;
delta_i++; delta_i++;
if (delta_i == UINT64_MAX) { if (delta_i == UINT64_MAX) {
delta_i = 1; delta_i = 1;
delta_sum = delta_avg; delta_sum = delta_avg;
} }
if ((delta_i % 10) == 0) { if ((delta_i % 10) == 0) {
delta_avg = (int)(double)(delta_sum / delta_i); delta_avg = (int)(double)(delta_sum / delta_i);
} }
@ -1920,7 +1922,7 @@ GCC_DIAG_ON(deprecated-declarations)
if (context->audio_timer || delta >= 60) { if (context->audio_timer || delta >= 60) {
uint32_t new_pts = context->video_timer.samplecount * (handle->samplerate / 1000); uint32_t new_pts = context->video_timer.samplecount * (handle->samplerate / 1000);
if (!context->audio_timer) { if (!context->audio_timer) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Delta of %d detected. Video timer sync: %ld/%d %ld\n", delta, context->audio_st[0].next_pts, context->video_timer.samplecount, new_pts - context->audio_st[0].next_pts); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Delta of %d detected. Video timer sync: %" SWITCH_UINT64_T_FMT "/%d %" SWITCH_UINT64_T_FMT "\n", delta, context->audio_st[0].next_pts, context->video_timer.samplecount, new_pts - context->audio_st[0].next_pts);
} }
sample_start = new_pts; sample_start = new_pts;
} }