X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fflags.cpp;fp=nageru%2Fflags.cpp;h=ed35062427ec01330bc26fa7bcf4cbfaf9a0ff23;hb=8202dbe236c5e206989c383004f9dba116ea12bd;hp=769263bb771adfb55667f39170d6dd4492100005;hpb=70e2471c1297f5ee5592918a736224841d8e4d77;p=nageru diff --git a/nageru/flags.cpp b/nageru/flags.cpp index 769263b..ed35062 100644 --- a/nageru/flags.cpp +++ b/nageru/flags.cpp @@ -24,6 +24,7 @@ enum LongOption { OPTION_HTTP_UNCOMPRESSED_VIDEO, OPTION_HTTP_X264_VIDEO, OPTION_RECORD_X264_VIDEO, + OPTION_SEPARATE_X264_DISK_ENCODE, OPTION_X264_PRESET, OPTION_X264_TUNE, OPTION_X264_SPEEDCONTROL, @@ -33,6 +34,11 @@ enum LongOption { OPTION_X264_VBV_BUFSIZE, OPTION_X264_VBV_MAX_BITRATE, OPTION_X264_PARAM, + OPTION_X264_SEPARATE_DISK_PRESET, + OPTION_X264_SEPARATE_DISK_TUNE, + OPTION_X264_SEPARATE_DISK_BITRATE, + OPTION_X264_SEPARATE_DISK_CRF, + OPTION_X264_SEPARATE_DISK_PARAM, OPTION_HTTP_MUX, OPTION_HTTP_COARSE_TIMEBASE, OPTION_HTTP_AUDIO_CODEC, @@ -154,6 +160,8 @@ void usage(Program program) fprintf(stderr, " --http-x264-video send x264-compressed video to HTTP clients\n"); fprintf(stderr, " --record-x264-video store x264-compressed video to disk (implies --http-x264-video,\n"); fprintf(stderr, " removes the need for working VA-API encoding)\n"); + fprintf(stderr, " --separate-x264-disk-encode run a different x264 encoder for disk recording\n"); + fprintf(stderr, " (implies --record-x264-video)\n"); } fprintf(stderr, " --x264-preset x264 quality preset (default " X264_DEFAULT_PRESET ")\n"); fprintf(stderr, " --x264-tune x264 tuning (default " X264_DEFAULT_TUNE ", can be blank)\n"); @@ -167,6 +175,15 @@ void usage(Program program) 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"); + if (program == PROGRAM_NAGERU) { + fprintf(stderr, " --x264-separate-disk-preset x264 quality preset (default " X264_DEFAULT_PRESET ")\n"); + fprintf(stderr, " --x264-separate-disk-tune x264 tuning (default " X264_DEFAULT_TUNE ", can be blank)\n"); + fprintf(stderr, " --x264-separate-disk-bitrate x264 bitrate (in kilobit/sec, default %d)\n", + DEFAULT_X264_OUTPUT_BIT_RATE); + fprintf(stderr, " --x264-separate-disk-crf=VALUE quality-based VBR (-12 to 51), \n"); + fprintf(stderr, " incompatible with --x264-separate-disk-bitrate\n"); + fprintf(stderr, " --x264-separate-disk-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"); @@ -254,6 +271,7 @@ void parse_flags(Program program, int argc, char * const argv[]) { "http-uncompressed-video", no_argument, 0, OPTION_HTTP_UNCOMPRESSED_VIDEO }, { "http-x264-video", no_argument, 0, OPTION_HTTP_X264_VIDEO }, { "record-x264-video", no_argument, 0, OPTION_RECORD_X264_VIDEO }, + { "separate-x264-disk-encode", no_argument, 0, OPTION_SEPARATE_X264_DISK_ENCODE }, { "x264-preset", required_argument, 0, OPTION_X264_PRESET }, { "x264-tune", required_argument, 0, OPTION_X264_TUNE }, { "x264-speedcontrol", no_argument, 0, OPTION_X264_SPEEDCONTROL }, @@ -263,6 +281,11 @@ void parse_flags(Program program, int argc, char * const argv[]) { "x264-vbv-bufsize", required_argument, 0, OPTION_X264_VBV_BUFSIZE }, { "x264-vbv-max-bitrate", required_argument, 0, OPTION_X264_VBV_MAX_BITRATE }, { "x264-param", required_argument, 0, OPTION_X264_PARAM }, + { "x264-separate-disk-preset", required_argument, 0, OPTION_X264_SEPARATE_DISK_PRESET }, + { "x264-separate-disk-tune", required_argument, 0, OPTION_X264_SEPARATE_DISK_TUNE }, + { "x264-separate-disk-bitrate", required_argument, 0, OPTION_X264_SEPARATE_DISK_BITRATE }, + { "x264-separate-disk-crf", required_argument, 0, OPTION_X264_SEPARATE_DISK_CRF }, + { "x264-separate-disk-param", required_argument, 0, OPTION_X264_SEPARATE_DISK_PARAM }, { "http-mux", required_argument, 0, OPTION_HTTP_MUX }, { "http-audio-codec", required_argument, 0, OPTION_HTTP_AUDIO_CODEC }, { "http-audio-bitrate", required_argument, 0, OPTION_HTTP_AUDIO_BITRATE }, @@ -413,6 +436,11 @@ void parse_flags(Program program, int argc, char * const argv[]) global_flags.x264_video_to_disk = true; global_flags.x264_video_to_http = true; break; + case OPTION_SEPARATE_X264_DISK_ENCODE: + global_flags.x264_video_to_disk = true; + global_flags.x264_video_to_http = true; + global_flags.x264_separate_disk_encode = true; + break; case OPTION_X264_PRESET: global_flags.x264_preset = optarg; break; @@ -440,6 +468,21 @@ void parse_flags(Program program, int argc, char * const argv[]) case OPTION_X264_PARAM: global_flags.x264_extra_param.push_back(optarg); break; + case OPTION_X264_SEPARATE_DISK_PRESET: + global_flags.x264_separate_disk_preset = optarg; + break; + case OPTION_X264_SEPARATE_DISK_TUNE: + global_flags.x264_separate_disk_tune = optarg; + break; + case OPTION_X264_SEPARATE_DISK_BITRATE: + global_flags.x264_separate_disk_bitrate = atoi(optarg); + break; + case OPTION_X264_SEPARATE_DISK_CRF: + global_flags.x264_separate_disk_crf = atof(optarg); + break; + case OPTION_X264_SEPARATE_DISK_PARAM: + global_flags.x264_separate_disk_extra_param.push_back(optarg); + break; case OPTION_FLAT_AUDIO: // If --flat-audio is given, turn off everything that messes with the sound, // except the final makeup gain. @@ -630,6 +673,9 @@ void parse_flags(Program program, int argc, char * const argv[]) } else if (global_flags.x264_preset.empty()) { global_flags.x264_preset = X264_DEFAULT_PRESET; } + if (global_flags.x264_separate_disk_preset.empty()) { + global_flags.x264_separate_disk_preset = X264_DEFAULT_PRESET; + } if (!theme_dirs.empty()) { global_flags.theme_dirs = theme_dirs; } @@ -713,6 +759,15 @@ void parse_flags(Program program, int argc, char * const argv[]) global_flags.x264_bitrate = DEFAULT_X264_OUTPUT_BIT_RATE; } + if (!isinf(global_flags.x264_separate_disk_crf)) { // CRF mode is selected. + if (global_flags.x264_separate_disk_bitrate != -1) { + fprintf(stderr, "ERROR: --x264-separate-disk-bitrate and --x264-separate-disk-crf are mutually incompatible.\n"); + exit(1); + } + } else if (global_flags.x264_separate_disk_bitrate == -1) { + global_flags.x264_separate_disk_bitrate = DEFAULT_X264_OUTPUT_BIT_RATE; + } + if (!card_to_mjpeg_stream_export_set) { // Fill in the default mapping (export all cards, in order). for (unsigned card_idx = 0; card_idx < unsigned(global_flags.max_num_cards); ++card_idx) {