+
+ frames_being_encoded[qf.pts] = qf.received_ts;
+ }
+
+ // See if we have a new bitrate to change to.
+ unsigned new_rate = new_bitrate_kbit.exchange(0); // Read and clear.
+ if (new_rate != 0) {
+ bitrate_override_func = [new_rate](x264_param_t *param) {
+ param->rc.i_bitrate = new_rate;
+ update_vbv_settings(param);
+ };
+ }
+
+ auto ycbcr_coefficients_override_func = [qf](x264_param_t *param) {
+ if (qf.ycbcr_coefficients == YCBCR_REC_709) {
+ param->vui.i_colmatrix = 1; // BT.709.
+ } else {
+ assert(qf.ycbcr_coefficients == YCBCR_REC_601);
+ param->vui.i_colmatrix = 6; // BT.601/SMPTE 170M.
+ }
+ };
+
+ if (speed_control) {
+ speed_control->set_config_override_function([this, ycbcr_coefficients_override_func](x264_param_t *param) {
+ if (bitrate_override_func) {
+ bitrate_override_func(param);
+ }
+ ycbcr_coefficients_override_func(param);
+ });
+ } else {
+ x264_param_t param;
+ dyn.x264_encoder_parameters(x264, ¶m);
+ if (bitrate_override_func) {
+ bitrate_override_func(¶m);
+ }
+ ycbcr_coefficients_override_func(¶m);
+ dyn.x264_encoder_reconfig(x264, ¶m);