FS-11189 Rearrange VPX code to fix few bugs and make it more structured.

This commit is contained in:
Sergey Khripchenko 2018-08-28 07:17:57 -07:00 committed by Mike Jerris
parent 434baefcd0
commit 75dae616be
2 changed files with 53 additions and 59 deletions

View File

@ -22,7 +22,7 @@
<!-- <param name="enc-threads" value="1"/> -->
<param name="g-profile" value="2"/>
<param name="g-timebase" value="1/90000"/>
<param name="g-timebase" value="1/1000"/>
<!-- DEFULT | PARTITIONS -->
<param name="g-error-resilient" value="PARTITIONS"/>
<!-- ONE_PASS, FIRST_PASS, LAST_PASS"/> -->
@ -73,7 +73,7 @@
<!-- <param name="enc-threads" value="1"/> -->
<param name="g-profile" value="2"/>
<param name="g-timebase" value="1/90000"/>
<param name="g-timebase" value="1/1000"/>
<!-- DEFULT | PARTITIONS -->
<param name="g-error-resilient" value="PARTITIONS"/>
<!-- ONE_PASS, FIRST_PASS, LAST_PASS"/> -->

View File

@ -66,10 +66,8 @@ typedef struct my_vpx_cfg_s {
#define SHOW(cfg, field) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-28s = %d\n", #field, cfg->field);
static void show_config(my_vpx_cfg_t *my_cfg)
static void show_config(my_vpx_cfg_t *my_cfg, vpx_codec_enc_cfg_t *cfg)
{
vpx_codec_enc_cfg_t *cfg = &my_cfg->enc_cfg;
SHOW(my_cfg, lossless);
SHOW(my_cfg, cpuused);
SHOW(my_cfg, token_parts);
@ -397,30 +395,33 @@ struct vpx_globals vpx_globals = { 0 };
static switch_status_t init_decoder(switch_codec_t *codec)
{
vpx_context_t *context = (vpx_context_t *)codec->private_info;
vpx_codec_dec_cfg_t cfg = {0, 0, 0};
vpx_codec_flags_t dec_flags = 0;
//if (context->decoder_init) {
// vpx_codec_destroy(&context->decoder);
// context->decoder_init = 0;
//}
if (context->flags & SWITCH_CODEC_FLAG_DECODE && !context->decoder_init) {
vpx_codec_dec_cfg_t cfg = {0, 0, 0};
vpx_codec_flags_t dec_flags = 0;
vp8_postproc_cfg_t ppcfg;
//if (context->decoder_init) {
// vpx_codec_destroy(&context->decoder);
// context->decoder_init = 0;
//}
my_vpx_cfg_t *my_cfg = NULL;
if (context->is_vp9) {
cfg.threads = vpx_globals.vp9.dec_cfg.threads;
my_cfg = &vpx_globals.vp9;
} else {
// dec_flags = VPX_CODEC_USE_POSTPROC;
cfg.threads = vpx_globals.vp8.dec_cfg.threads;
my_cfg = &vpx_globals.vp8;
}
cfg.threads = my_cfg->dec_cfg.threads;
if (vpx_codec_dec_init(&context->decoder, context->decoder_interface, &cfg, dec_flags) != VPX_CODEC_OK) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s init error: [%d:%s]\n", vpx_codec_iface_name(context->decoder_interface), context->encoder.err, context->encoder.err_detail);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_ERROR,
"VPX decoder %s codec init error: [%d:%s]\n",
vpx_codec_iface_name(context->decoder_interface), context->decoder.err, context->decoder.err_detail);
return SWITCH_STATUS_FALSE;
}
context->last_ts = 0;
context->last_received_timestamp = 0;
context->last_received_complete_picture = 0;
@ -451,17 +452,11 @@ static switch_status_t init_encoder(switch_codec_t *codec)
{
vpx_context_t *context = (vpx_context_t *)codec->private_info;
vpx_codec_enc_cfg_t *config = &context->config;
int token_parts = 1;
int cpus = switch_core_cpu_count();
vpx_codec_enc_cfg_t *vp8_enc_cfg = &vpx_globals.vp8.enc_cfg;
vpx_codec_enc_cfg_t *vp9_enc_cfg = &vpx_globals.vp9.enc_cfg;
my_vpx_cfg_t *my_cfg = NULL;
if (context->is_vp9) {
*config = *vp9_enc_cfg;
my_cfg = &vpx_globals.vp9;
} else {
*config = *vp8_enc_cfg;
my_cfg = &vpx_globals.vp8;
}
@ -484,30 +479,26 @@ static switch_status_t init_encoder(switch_codec_t *codec)
}
if (context->bandwidth > vpx_globals.max_bitrate) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "BITRATE TRUNCATED FROM %d TO %d\n", context->bandwidth, vpx_globals.max_bitrate);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_WARNING, "REQUESTED BITRATE TRUNCATED FROM %d TO %d\n", context->bandwidth, vpx_globals.max_bitrate);
context->bandwidth = vpx_globals.max_bitrate;
}
context->pkt = NULL;
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_NOTICE,
"VPX reset encoder picture from %dx%d to %dx%d %u BW\n",
config->g_w, config->g_h, context->codec_settings.video.width, context->codec_settings.video.height, context->bandwidth);
"VPX encoder reset (WxH/BW) from %dx%d/%u to %dx%d/%u\n",
config->g_w, config->g_h, config->rc_target_bitrate,
context->codec_settings.video.width, context->codec_settings.video.height, context->bandwidth);
context->pkt = NULL;
context->start_time = switch_micro_time_now();
*config = my_cfg->enc_cfg; // reset whole config to current defaults
config->g_w = context->codec_settings.video.width;
config->g_h = context->codec_settings.video.height;
config->rc_target_bitrate = context->bandwidth;
token_parts = (cpus > 1) ? 3 : 0;
if (context->is_vp9) {
if (vpx_globals.vp9.token_parts > 0) {
token_parts = vpx_globals.vp9.token_parts;
}
if (context->lossless) {
if (context->lossless || my_cfg->lossless) {
config->rc_min_quantizer = 0;
config->rc_max_quantizer = 0;
}
@ -517,48 +508,51 @@ static switch_status_t init_encoder(switch_codec_t *codec)
config->ts_rate_decimator[0] = 1;
config->ts_periodicity = 1;
config->ts_layer_id[0] = 0;
} else {
if (vpx_globals.vp8.token_parts > 0) {
token_parts = vpx_globals.vp8.token_parts;
}
}
if (context->encoder_init) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "VPX ENCODER RESET\n");
if (vpx_codec_enc_config_set(&context->encoder, config) != VPX_CODEC_OK) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec init error: [%d:%s]\n", context->encoder.err, context->encoder.err_detail);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_ERROR,
"VPX encoder %s codec reconf error: [%d:%s]\n",
vpx_codec_iface_name(context->encoder_interface), context->encoder.err, context->encoder.err_detail);
return SWITCH_STATUS_FALSE;
}
} else if (context->flags & SWITCH_CODEC_FLAG_ENCODE) {
int token_parts;
if (vpx_globals.debug) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(context->encoder_interface));
show_config(my_cfg);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_INFO, "VPX encoder %s settings:\n", vpx_codec_iface_name(context->encoder_interface));
show_config(my_cfg, config);
}
if (vpx_codec_enc_init(&context->encoder, context->encoder_interface, config, 0 & VPX_CODEC_USE_OUTPUT_PARTITION) != VPX_CODEC_OK) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Codec %s init error: [%d:%s]\n", vpx_codec_iface_name(context->encoder_interface), context->encoder.err, context->encoder.err_detail);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_ERROR,
"VPX encoder %s codec init error: [%d:%s]\n",
vpx_codec_iface_name(context->encoder_interface), context->encoder.err, context->encoder.err_detail);
return SWITCH_STATUS_FALSE;
}
context->encoder_init = 1;
token_parts = (switch_core_cpu_count() > 1) ? 3 : 0;
if (my_cfg->token_parts > 0) {
token_parts = my_cfg->token_parts;
}
vpx_codec_control(&context->encoder, VP8E_SET_TOKEN_PARTITIONS, token_parts);
vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, my_cfg->cpuused);
vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, my_cfg->static_thresh);
if (context->is_vp9) {
if (context->lossless || vpx_globals.vp9.lossless) {
if (context->lossless || my_cfg->lossless) {
vpx_codec_control(&context->encoder, VP9E_SET_LOSSLESS, 1);
}
vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, vpx_globals.vp9.cpuused);
vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, vpx_globals.vp9.static_thresh);
vpx_codec_control(&context->encoder, VP9E_SET_TUNE_CONTENT, vpx_globals.vp9.tune_content);
vpx_codec_control(&context->encoder, VP9E_SET_TUNE_CONTENT, my_cfg->tune_content);
} else {
vpx_codec_control(&context->encoder, VP8E_SET_STATIC_THRESHOLD, vpx_globals.vp8.static_thresh);
vpx_codec_control(&context->encoder, VP8E_SET_CPUUSED, vpx_globals.vp8.cpuused);
vpx_codec_control(&context->encoder, VP8E_SET_NOISE_SENSITIVITY, vpx_globals.vp8.noise_sensitivity);
vpx_codec_control(&context->encoder, VP8E_SET_NOISE_SENSITIVITY, my_cfg->noise_sensitivity);
if (vpx_globals.vp8.max_intra_bitrate_pct) {
vpx_codec_control(&context->encoder, VP8E_SET_MAX_INTRA_BITRATE_PCT, vpx_globals.vp8.max_intra_bitrate_pct);
if (my_cfg->max_intra_bitrate_pct) {
vpx_codec_control(&context->encoder, VP8E_SET_MAX_INTRA_BITRATE_PCT, my_cfg->max_intra_bitrate_pct);
}
}
}
@ -603,7 +597,7 @@ static switch_status_t switch_vpx_init(switch_codec_t *codec, switch_codec_flag_
context->codec_settings.video.width = 320;
context->codec_settings.video.height = 240;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "VPX VER:%s VPX_IMAGE_ABI_VERSION:%d VPX_CODEC_ABI_VERSION:%d\n",
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(codec->session), SWITCH_LOG_DEBUG, "VPX VER:%s VPX_IMAGE_ABI_VERSION:%d VPX_CODEC_ABI_VERSION:%d\n",
vpx_codec_version_str(), VPX_IMAGE_ABI_VERSION, VPX_CODEC_ABI_VERSION);
return SWITCH_STATUS_SUCCESS;
@ -833,8 +827,8 @@ static switch_status_t switch_vpx_encode(switch_codec_t *codec, switch_frame_t *
context->framecount++;
//pts = (now - context->start_time) / 1000;
pts = frame->timestamp;
pts = (now - context->start_time) / 1000;
//pts = frame->timestamp;
dur = context->last_ms ? (now - context->last_ms) / 1000 : pts;
@ -1687,11 +1681,11 @@ SWITCH_STANDARD_API(vpx_api_function)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, " %-26s = %d\n", "vp10-dec-threads", vpx_globals.vp10.dec_cfg.threads);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(vpx_codec_vp8_cx()));
show_config(&vpx_globals.vp8);
show_config(&vpx_globals.vp8, &vpx_globals.vp8.enc_cfg);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: %s\n", vpx_codec_iface_name(vpx_codec_vp9_cx()));
show_config(&vpx_globals.vp9);
show_config(&vpx_globals.vp9, &vpx_globals.vp9.enc_cfg);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Codec: VP10\n");
show_config(&vpx_globals.vp10);
show_config(&vpx_globals.vp10, &vpx_globals.vp10.enc_cfg);
stream->write_function(stream, "+OK\n");
} else if (!strcasecmp(cmd, "debug")) {