chore: [30-x-y] cherry-pick 2 changes from 3-M125 (#42590)
* d3cc351e0294 from libaom * ad697557950c from libaom
This commit is contained in:
parent
f6966f6e35
commit
9c293834f1
4 changed files with 362 additions and 1 deletions
|
@ -11,5 +11,6 @@
|
|||
{ "patch_dir": "src/electron/patches/Mantle", "repo": "src/third_party/squirrel.mac/vendor/Mantle" },
|
||||
{ "patch_dir": "src/electron/patches/ReactiveObjC", "repo": "src/third_party/squirrel.mac/vendor/ReactiveObjC" },
|
||||
{ "patch_dir": "src/electron/patches/webrtc", "repo": "src/third_party/webrtc" },
|
||||
{ "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" }
|
||||
{ "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" },
|
||||
{ "patch_dir": "src/electron/patches/libaom", "repo": "src/third_party/libaom/source/libaom"}
|
||||
]
|
||||
|
|
2
patches/libaom/.patches
Normal file
2
patches/libaom/.patches
Normal file
|
@ -0,0 +1,2 @@
|
|||
update_codec_config_after_svc_scale_controls.patch
|
||||
encode_api_test_add_repro_for_chromium_339877165.patch
|
|
@ -0,0 +1,162 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: James Zern <jzern@google.com>
|
||||
Date: Thu, 16 May 2024 13:44:52 -0700
|
||||
Subject: encode_api_test: add repro for chromium 339877165
|
||||
|
||||
BUG=chromium:339877165
|
||||
|
||||
Change-Id: I69dcc2cda098ec96a34e1e5f7ef557ee8caf5521
|
||||
(cherry picked from commit 01467cdbd524900eed283660836179fd1b2cd536)
|
||||
|
||||
diff --git a/test/encode_api_test.cc b/test/encode_api_test.cc
|
||||
index a7d5b3aa3c7dbcfce8e726fca1f1670ed878e53c..27bcbc14c14c4218d45e59e509fbe5fdbdc005bb 100644
|
||||
--- a/test/encode_api_test.cc
|
||||
+++ b/test/encode_api_test.cc
|
||||
@@ -635,6 +635,147 @@ TEST(EncodeAPI, PtsOrDurationTooBig) {
|
||||
aom_codec_destroy(&enc);
|
||||
}
|
||||
|
||||
+// Reproduces https://crbug.com/339877165.
|
||||
+TEST(EncodeAPI, Buganizer339877165) {
|
||||
+ // Initialize libaom encoder.
|
||||
+ aom_codec_iface_t *const iface = aom_codec_av1_cx();
|
||||
+ aom_codec_ctx_t enc;
|
||||
+ aom_codec_enc_cfg_t cfg;
|
||||
+
|
||||
+ ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_REALTIME),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ cfg.g_w = 2560;
|
||||
+ cfg.g_h = 1600;
|
||||
+ cfg.rc_target_bitrate = 231;
|
||||
+ cfg.rc_end_usage = AOM_CBR;
|
||||
+ cfg.g_threads = 8;
|
||||
+
|
||||
+ ASSERT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ // From libaom_av1_encoder.cc in WebRTC.
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_CPUUSED, 11), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_CDEF, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_TPL_MODEL, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_DELTAQ_MODE, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_ORDER_HINT, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_AQ_MODE, 3), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_MAX_INTRA_BITRATE_PCT, 300),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_COEFF_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MODE_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MV_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_PALETTE, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TILE_ROWS, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TILE_COLUMNS, 2), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_OBMC, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_NOISE_SENSITIVITY, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_WARPED_MOTION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_GLOBAL_MOTION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_REF_FRAME_MVS, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SUPERBLOCK_SIZE,
|
||||
+ AOM_SUPERBLOCK_SIZE_DYNAMIC),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_CFL_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_SMOOTH_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_ANGLE_DELTA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_FILTER_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_INTRA_DEFAULT_TX_ONLY, 1),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_DISABLE_TRELLIS_QUANT, 1),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DIST_WTD_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DIFF_WTD_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DUAL_FILTER, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTERINTRA_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTERINTRA_WEDGE, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTRA_EDGE_FILTER, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTRABC, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_MASKED_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_PAETH_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_QM, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_RECT_PARTITIONS, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_RESTORATION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_SMOOTH_INTERINTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_TX64, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MAX_REFERENCE_FRAMES, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_enc_config_set(&enc, &cfg), AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_params_t svc_params = {};
|
||||
+ svc_params.number_spatial_layers = 2;
|
||||
+ svc_params.number_temporal_layers = 1;
|
||||
+ svc_params.max_quantizers[0] = svc_params.max_quantizers[1] = 56;
|
||||
+ svc_params.min_quantizers[0] = svc_params.min_quantizers[1] = 10;
|
||||
+ svc_params.scaling_factor_num[0] = svc_params.scaling_factor_num[1] = 1;
|
||||
+ svc_params.scaling_factor_den[0] = 2;
|
||||
+ svc_params.scaling_factor_den[1] = 1;
|
||||
+ svc_params.layer_target_bitrate[0] = cfg.rc_target_bitrate;
|
||||
+ svc_params.framerate_factor[0] = 1;
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_PARAMS, &svc_params),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_layer_id_t layer_id = {};
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_LAYER_ID, &layer_id),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_ref_frame_config_t ref_frame_config = {};
|
||||
+ ref_frame_config.refresh[0] = 1;
|
||||
+ ASSERT_EQ(
|
||||
+ aom_codec_control(&enc, AV1E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ // Create input image.
|
||||
+ aom_image_t *const image =
|
||||
+ CreateGrayImage(AOM_IMG_FMT_I420, cfg.g_w, cfg.g_h);
|
||||
+ ASSERT_NE(image, nullptr);
|
||||
+
|
||||
+ // Encode layer 0.
|
||||
+ ASSERT_EQ(aom_codec_encode(&enc, image, 0, 1, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ layer_id.spatial_layer_id = 1;
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_LAYER_ID, &layer_id),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ ref_frame_config.refresh[0] = 0;
|
||||
+ ASSERT_EQ(
|
||||
+ aom_codec_control(&enc, AV1E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ // Encode layer 1.
|
||||
+ ASSERT_EQ(aom_codec_encode(&enc, image, 0, 1, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ // Free resources.
|
||||
+ aom_img_free(image);
|
||||
+ aom_codec_destroy(&enc);
|
||||
+}
|
||||
+
|
||||
class EncodeAPIParameterized
|
||||
: public testing::TestWithParam<std::tuple<
|
||||
/*usage=*/unsigned int, /*speed=*/int, /*aq_mode=*/unsigned int>> {};
|
|
@ -0,0 +1,196 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: James Zern <jzern@google.com>
|
||||
Date: Tue, 14 May 2024 17:54:10 -0700
|
||||
Subject: update codec config after svc/scale controls
|
||||
|
||||
This ensures the encoder state/allocations stay in sync with scaling and
|
||||
svc layer changes. In the SVC case, depending on the resolution,
|
||||
differences in the chosen superblock size among layers may have caused a
|
||||
crash. This was reproducible in WebRTC in screen content mode.
|
||||
|
||||
The fix is based on a change by Yuan Tong (tongyuan200097) [1]. It
|
||||
refreshes the encoder config after AOME_SET_SCALEMODE,
|
||||
AOME_SET_NUMBER_SPATIAL_LAYERS and AV1E_SET_SVC_PARAMS if no frames have
|
||||
been encoded. AV1E_SET_SVC_PARAMS was missed in the original change.
|
||||
|
||||
[1]: https://aomedia-review.googlesource.com/c/aom/+/171941/2
|
||||
|
||||
Bug: chromium:339877165
|
||||
Change-Id: Ib3d2a123b159898d7c7e19c81e89ff148920e1f1
|
||||
(cherry picked from commit e42f4b1980bbbc772aa886d8b43a885461d7b89e)
|
||||
|
||||
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
|
||||
index 2b6b1504e6245b44f7693612eda31bfe3a14c402..652c6eadef2911a1a54a14cd78fd064b801868f5 100644
|
||||
--- a/av1/av1_cx_iface.c
|
||||
+++ b/av1/av1_cx_iface.c
|
||||
@@ -1609,37 +1609,42 @@ static aom_codec_err_t ctrl_get_baseline_gf_interval(aom_codec_alg_priv_t *ctx,
|
||||
return AOM_CODEC_OK;
|
||||
}
|
||||
|
||||
+static aom_codec_err_t update_encoder_cfg(aom_codec_alg_priv_t *ctx) {
|
||||
+ set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
|
||||
+ av1_check_fpmt_config(ctx->ppi, &ctx->oxcf);
|
||||
+ bool is_sb_size_changed = false;
|
||||
+ av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
|
||||
+ for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
|
||||
+ AV1_COMP *const cpi = ctx->ppi->parallel_cpi[i];
|
||||
+ struct aom_internal_error_info *const error = cpi->common.error;
|
||||
+ if (setjmp(error->jmp)) {
|
||||
+ error->setjmp = 0;
|
||||
+ return error->error_code;
|
||||
+ }
|
||||
+ error->setjmp = 1;
|
||||
+ av1_change_config(cpi, &ctx->oxcf, is_sb_size_changed);
|
||||
+ error->setjmp = 0;
|
||||
+ }
|
||||
+ if (ctx->ppi->cpi_lap != NULL) {
|
||||
+ AV1_COMP *const cpi_lap = ctx->ppi->cpi_lap;
|
||||
+ struct aom_internal_error_info *const error = cpi_lap->common.error;
|
||||
+ if (setjmp(error->jmp)) {
|
||||
+ error->setjmp = 0;
|
||||
+ return error->error_code;
|
||||
+ }
|
||||
+ error->setjmp = 1;
|
||||
+ av1_change_config(cpi_lap, &ctx->oxcf, is_sb_size_changed);
|
||||
+ error->setjmp = 0;
|
||||
+ }
|
||||
+ return AOM_CODEC_OK;
|
||||
+}
|
||||
+
|
||||
static aom_codec_err_t update_extra_cfg(aom_codec_alg_priv_t *ctx,
|
||||
const struct av1_extracfg *extra_cfg) {
|
||||
const aom_codec_err_t res = validate_config(ctx, &ctx->cfg, extra_cfg);
|
||||
if (res == AOM_CODEC_OK) {
|
||||
ctx->extra_cfg = *extra_cfg;
|
||||
- set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
|
||||
- av1_check_fpmt_config(ctx->ppi, &ctx->oxcf);
|
||||
- bool is_sb_size_changed = false;
|
||||
- av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
|
||||
- for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
|
||||
- AV1_COMP *const cpi = ctx->ppi->parallel_cpi[i];
|
||||
- struct aom_internal_error_info *const error = cpi->common.error;
|
||||
- if (setjmp(error->jmp)) {
|
||||
- error->setjmp = 0;
|
||||
- return error->error_code;
|
||||
- }
|
||||
- error->setjmp = 1;
|
||||
- av1_change_config(cpi, &ctx->oxcf, is_sb_size_changed);
|
||||
- error->setjmp = 0;
|
||||
- }
|
||||
- if (ctx->ppi->cpi_lap != NULL) {
|
||||
- AV1_COMP *const cpi_lap = ctx->ppi->cpi_lap;
|
||||
- struct aom_internal_error_info *const error = cpi_lap->common.error;
|
||||
- if (setjmp(error->jmp)) {
|
||||
- error->setjmp = 0;
|
||||
- return error->error_code;
|
||||
- }
|
||||
- error->setjmp = 1;
|
||||
- av1_change_config(cpi_lap, &ctx->oxcf, is_sb_size_changed);
|
||||
- error->setjmp = 0;
|
||||
- }
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -3610,11 +3615,23 @@ static aom_codec_err_t ctrl_set_scale_mode(aom_codec_alg_priv_t *ctx,
|
||||
aom_scaling_mode_t *const mode = va_arg(args, aom_scaling_mode_t *);
|
||||
|
||||
if (mode) {
|
||||
- const int res = av1_set_internal_size(
|
||||
- &ctx->ppi->cpi->oxcf, &ctx->ppi->cpi->resize_pending_params,
|
||||
- mode->h_scaling_mode, mode->v_scaling_mode);
|
||||
- av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
- return (res == 0) ? AOM_CODEC_OK : AOM_CODEC_INVALID_PARAM;
|
||||
+ AV1EncoderConfig *const oxcf =
|
||||
+ ctx->ppi->seq_params_locked ? &ctx->ppi->cpi->oxcf : &ctx->oxcf;
|
||||
+ const int res =
|
||||
+ av1_set_internal_size(oxcf, &ctx->ppi->cpi->resize_pending_params,
|
||||
+ mode->h_scaling_mode, mode->v_scaling_mode);
|
||||
+ if (res == 0) {
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame
|
||||
+ // and superblock sizes are updated before they're fixed by the first
|
||||
+ // encode call.
|
||||
+ if (ctx->ppi->seq_params_locked) {
|
||||
+ av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
+ return AOM_CODEC_OK;
|
||||
+ }
|
||||
+ return update_encoder_cfg(ctx);
|
||||
+ }
|
||||
+ return AOM_CODEC_INVALID_PARAM;
|
||||
} else {
|
||||
return AOM_CODEC_INVALID_PARAM;
|
||||
}
|
||||
@@ -3635,6 +3652,13 @@ static aom_codec_err_t ctrl_set_number_spatial_layers(aom_codec_alg_priv_t *ctx,
|
||||
if (number_spatial_layers > MAX_NUM_SPATIAL_LAYERS)
|
||||
return AOM_CODEC_INVALID_PARAM;
|
||||
ctx->ppi->number_spatial_layers = number_spatial_layers;
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame and
|
||||
+ // superblock sizes are updated before they're fixed by the first encode
|
||||
+ // call.
|
||||
+ if (!ctx->ppi->seq_params_locked) {
|
||||
+ return update_encoder_cfg(ctx);
|
||||
+ }
|
||||
return AOM_CODEC_OK;
|
||||
}
|
||||
|
||||
@@ -3652,8 +3676,6 @@ static aom_codec_err_t ctrl_set_svc_params(aom_codec_alg_priv_t *ctx,
|
||||
va_list args) {
|
||||
AV1_PRIMARY *const ppi = ctx->ppi;
|
||||
AV1_COMP *const cpi = ppi->cpi;
|
||||
- AV1_COMMON *const cm = &cpi->common;
|
||||
- AV1EncoderConfig *oxcf = &cpi->oxcf;
|
||||
aom_svc_params_t *const params = va_arg(args, aom_svc_params_t *);
|
||||
int64_t target_bandwidth = 0;
|
||||
ppi->number_spatial_layers = params->number_spatial_layers;
|
||||
@@ -3693,19 +3715,38 @@ static aom_codec_err_t ctrl_set_svc_params(aom_codec_alg_priv_t *ctx,
|
||||
target_bandwidth += lc->layer_target_bitrate;
|
||||
}
|
||||
}
|
||||
- if (cm->current_frame.frame_number == 0) {
|
||||
- if (!cpi->ppi->seq_params_locked) {
|
||||
- SequenceHeader *const seq_params = &ppi->seq_params;
|
||||
- seq_params->operating_points_cnt_minus_1 =
|
||||
- ppi->number_spatial_layers * ppi->number_temporal_layers - 1;
|
||||
- av1_init_seq_coding_tools(ppi, &cpi->oxcf, 1);
|
||||
- }
|
||||
+
|
||||
+ if (ppi->seq_params_locked) {
|
||||
+ AV1EncoderConfig *const oxcf = &cpi->oxcf;
|
||||
+ // Keep ctx->oxcf in sync in case further codec controls are made prior
|
||||
+ // to encoding.
|
||||
+ ctx->oxcf.rc_cfg.target_bandwidth = oxcf->rc_cfg.target_bandwidth =
|
||||
+ target_bandwidth;
|
||||
+ set_primary_rc_buffer_sizes(oxcf, ppi);
|
||||
+ av1_update_layer_context_change_config(cpi, target_bandwidth);
|
||||
+ check_reset_rc_flag(cpi);
|
||||
+ } else {
|
||||
+ // Note av1_init_layer_context() relies on cpi->oxcf. The order of that
|
||||
+ // call and the ones in the other half of this block (which
|
||||
+ // update_encoder_cfg() transitively makes) is important. So we keep
|
||||
+ // ctx->oxcf and cpi->oxcf in sync here as update_encoder_cfg() will
|
||||
+ // overwrite cpi->oxcf with ctx->oxcf.
|
||||
+ ctx->oxcf.rc_cfg.target_bandwidth = cpi->oxcf.rc_cfg.target_bandwidth =
|
||||
+ target_bandwidth;
|
||||
+ SequenceHeader *const seq_params = &ppi->seq_params;
|
||||
+ seq_params->operating_points_cnt_minus_1 =
|
||||
+ ppi->number_spatial_layers * ppi->number_temporal_layers - 1;
|
||||
+
|
||||
av1_init_layer_context(cpi);
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame
|
||||
+ // and superblock sizes are updated before they're fixed by the first
|
||||
+ // encode call.
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
- oxcf->rc_cfg.target_bandwidth = target_bandwidth;
|
||||
- set_primary_rc_buffer_sizes(oxcf, cpi->ppi);
|
||||
- av1_update_layer_context_change_config(cpi, target_bandwidth);
|
||||
- check_reset_rc_flag(cpi);
|
||||
+ } else if (!ppi->seq_params_locked) {
|
||||
+ // Ensure frame and superblock sizes are updated.
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
return AOM_CODEC_OK;
|
Loading…
Add table
Reference in a new issue