X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=x264_encoder.cpp;h=ccf6942e1813ef7aa4748b45b531d108dd06d64f;hb=d3e48df512d9476d3849227067792a3537bb094e;hp=e32fcacf7bc12db1929613d191c4165208aed44e;hpb=35b405f813c4fd4eccf67eb95dce877c9e288421;p=nageru diff --git a/x264_encoder.cpp b/x264_encoder.cpp index e32fcac..ccf6942 100644 --- a/x264_encoder.cpp +++ b/x264_encoder.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "defs.h" @@ -28,6 +29,7 @@ extern "C" { using namespace movit; using namespace std; using namespace std::chrono; +using namespace std::placeholders; namespace { @@ -66,7 +68,7 @@ X264Encoder::X264Encoder(AVOutputFormat *oformat) : wants_global_headers(oformat->flags & AVFMT_GLOBALHEADER), dyn(load_x264_for_bit_depth(global_flags.x264_bit_depth)) { - call_once(x264_metrics_inited, [&](){ + call_once(x264_metrics_inited, [](){ global_metrics.add("x264_queued_frames", &metric_x264_queued_frames, Metrics::TYPE_GAUGE); global_metrics.add("x264_max_queued_frames", &metric_x264_max_queued_frames, Metrics::TYPE_GAUGE); global_metrics.add("x264_dropped_frames", &metric_x264_dropped_frames); @@ -153,7 +155,7 @@ void X264Encoder::init_x264() param.vui.i_vidformat = 5; // Unspecified. param.vui.b_fullrange = 0; param.vui.i_colorprim = 1; // BT.709. - param.vui.i_transfer = 2; // Unspecified (since we use sRGB). + param.vui.i_transfer = 13; // sRGB. if (global_flags.ycbcr_rec709_coefficients) { param.vui.i_colmatrix = 1; // BT.709. } else { @@ -330,38 +332,13 @@ void X264Encoder::encode_frame(X264Encoder::QueuedFrame qf) 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. - } - }; - + unsigned new_rate = new_bitrate_kbit.load(); // Can be 0 for no change. 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); - }); + speed_control->set_config_override_function(bind(&speed_control_override_func, new_rate, qf.ycbcr_coefficients, _1)); } else { x264_param_t param; dyn.x264_encoder_parameters(x264, ¶m); - if (bitrate_override_func) { - bitrate_override_func(¶m); - } - ycbcr_coefficients_override_func(¶m); + speed_control_override_func(new_rate, qf.ycbcr_coefficients, ¶m); dyn.x264_encoder_reconfig(x264, ¶m); } @@ -434,3 +411,18 @@ void X264Encoder::encode_frame(X264Encoder::QueuedFrame qf) mux->add_packet(pkt, pic.i_pts, pic.i_dts); } } + +void X264Encoder::speed_control_override_func(unsigned bitrate_kbit, movit::YCbCrLumaCoefficients ycbcr_coefficients, x264_param_t *param) +{ + if (bitrate_kbit != 0) { + param->rc.i_bitrate = bitrate_kbit; + update_vbv_settings(param); + } + + if (ycbcr_coefficients == YCBCR_REC_709) { + param->vui.i_colmatrix = 1; // BT.709. + } else { + assert(ycbcr_coefficients == YCBCR_REC_601); + param->vui.i_colmatrix = 6; // BT.601/SMPTE 170M. + } +}