#include <x264.h>
#include <atomic>
#include <cstdint>
+#include <functional>
#include <mutex>
#include "defs.h"
using namespace movit;
using namespace std;
using namespace std::chrono;
+using namespace std::placeholders;
namespace {
: 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);
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 {
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);
}
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.
+ }
+}