aboutsummaryrefslogtreecommitdiff
path: root/libvpx/vp8/vp8_cx_iface.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvpx/vp8/vp8_cx_iface.c')
-rw-r--r--libvpx/vp8/vp8_cx_iface.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/libvpx/vp8/vp8_cx_iface.c b/libvpx/vp8/vp8_cx_iface.c
index b5865ce1f..340f3e663 100644
--- a/libvpx/vp8/vp8_cx_iface.c
+++ b/libvpx/vp8/vp8_cx_iface.c
@@ -18,7 +18,6 @@
#include "vpx_mem/vpx_mem.h"
#include "vpx_ports/static_assert.h"
#include "vpx_ports/system_state.h"
-#include "vpx_ports/vpx_once.h"
#include "vpx_util/vpx_timestamp.h"
#include "vp8/encoder/onyx_int.h"
#include "vpx/vp8cx.h"
@@ -474,14 +473,23 @@ static vpx_codec_err_t vp8e_set_config(vpx_codec_alg_priv_t *ctx,
ERROR("Cannot increase lag_in_frames");
res = validate_config(ctx, cfg, &ctx->vp8_cfg, 0);
+ if (res != VPX_CODEC_OK) return res;
- if (!res) {
- ctx->cfg = *cfg;
- set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL);
- vp8_change_config(ctx->cpi, &ctx->oxcf);
+ if (setjmp(ctx->cpi->common.error.jmp)) {
+ const vpx_codec_err_t codec_err =
+ update_error_state(ctx, &ctx->cpi->common.error);
+ ctx->cpi->common.error.setjmp = 0;
+ vpx_clear_system_state();
+ assert(codec_err != VPX_CODEC_OK);
+ return codec_err;
}
- return res;
+ ctx->cpi->common.error.setjmp = 1;
+ ctx->cfg = *cfg;
+ set_vp8e_config(&ctx->oxcf, ctx->cfg, ctx->vp8_cfg, NULL);
+ vp8_change_config(ctx->cpi, &ctx->oxcf);
+ ctx->cpi->common.error.setjmp = 0;
+ return VPX_CODEC_OK;
}
static vpx_codec_err_t get_quantizer(vpx_codec_alg_priv_t *ctx, va_list args) {
@@ -607,6 +615,17 @@ static vpx_codec_err_t set_screen_content_mode(vpx_codec_alg_priv_t *ctx,
return update_extracfg(ctx, &extra_cfg);
}
+static vpx_codec_err_t ctrl_set_rtc_external_ratectrl(vpx_codec_alg_priv_t *ctx,
+ va_list args) {
+ VP8_COMP *cpi = ctx->cpi;
+ const unsigned int data = CAST(VP8E_SET_GF_CBR_BOOST_PCT, args);
+ if (data) {
+ cpi->cyclic_refresh_mode_enabled = 0;
+ cpi->rt_always_update_correction_factor = 1;
+ }
+ return VPX_CODEC_OK;
+}
+
static vpx_codec_err_t vp8e_mr_alloc_mem(const vpx_codec_enc_cfg_t *cfg,
void **mem_loc) {
vpx_codec_err_t res = VPX_CODEC_OK;
@@ -683,7 +702,7 @@ static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx,
ctx->priv->enc.total_encoders = 1;
}
- once(vp8_initialize_enc);
+ vp8_initialize_enc();
res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0);
@@ -1245,6 +1264,7 @@ static vpx_codec_ctrl_fn_map_t vp8e_ctf_maps[] = {
{ VP8E_SET_MAX_INTRA_BITRATE_PCT, set_rc_max_intra_bitrate_pct },
{ VP8E_SET_SCREEN_CONTENT_MODE, set_screen_content_mode },
{ VP8E_SET_GF_CBR_BOOST_PCT, ctrl_set_rc_gf_cbr_boost_pct },
+ { VP8E_SET_RTC_EXTERNAL_RATECTRL, ctrl_set_rtc_external_ratectrl },
{ -1, NULL },
};