fprintf(stderr, " default: same as --x264-bitrate, that is, one-second VBV)\n");
fprintf(stderr, " --x264-vbv-max-bitrate x264 local max bitrate (in kilobit/sec per --vbv-bufsize,\n");
fprintf(stderr, " 0 = no limit, default: same as --x264-bitrate, i.e., CBR)\n");
+ fprintf(stderr, " --x264-param=NAME[,VALUE] set any x264 parameter, for fine tuning\n");
fprintf(stderr, " --http-mux=NAME mux to use for HTTP streams (default " DEFAULT_STREAM_MUX_NAME ")\n");
fprintf(stderr, " --http-audio-codec=NAME audio codec to use for HTTP streams\n");
fprintf(stderr, " (default is to use the same as for the recording)\n");
{ "x264-bitrate", required_argument, 0, 1011 },
{ "x264-vbv-bufsize", required_argument, 0, 1012 },
{ "x264-vbv-max-bitrate", required_argument, 0, 1013 },
+ { "x264-param", required_argument, 0, 1017 },
{ "http-mux", required_argument, 0, 1004 },
{ "http-coarse-timebase", no_argument, 0, 1005 },
{ "http-audio-codec", required_argument, 0, 1006 },
case 1013:
global_flags.x264_vbv_max_bitrate = atoi(optarg);
break;
+ case 1017:
+ global_flags.x264_extra_param.push_back(optarg);
+ break;
case 1002:
global_flags.flat_audio = true;
break;
#include <map>
#include <string>
+#include <vector>
#include "defs.h"
int x264_bitrate = DEFAULT_X264_OUTPUT_BIT_RATE; // In kilobit/sec.
int x264_vbv_max_bitrate = -1; // In kilobits. 0 = no limit, -1 = same as <x264_bitrate> (CBR).
int x264_vbv_buffer_size = -1; // In kilobits. 0 = one-frame VBV, -1 = same as <x264_bitrate> (one-second VBV).
+ std::vector<std::string> x264_extra_param; // In “key[,value]” format.
bool enable_alsa_output = true;
std::map<int, int> default_stream_mapping;
};
// be on the safe side. Shouldn't affect quality in any meaningful way.
param.rc.i_qp_min = 5;
- // TODO: more flags here, via x264_param_parse().
+ for (const string &str : global_flags.x264_extra_param) {
+ const size_t pos = str.find(',');
+ if (pos == string::npos) {
+ if (x264_param_parse(¶m, str.c_str(), nullptr) != 0) {
+ fprintf(stderr, "ERROR: x264 rejected parameter '%s'\n", str.c_str());
+ }
+ } else {
+ const string key = str.substr(0, pos);
+ const string value = str.substr(pos + 1);
+ if (x264_param_parse(¶m, key.c_str(), value.c_str()) != 0) {
+ fprintf(stderr, "ERROR: x264 rejected parameter '%s' set to '%s'\n",
+ key.c_str(), value.c_str());
+ }
+ }
+ }
x264_param_apply_profile(¶m, "high");