From 508e627eaad81db60cee79b596a800ba3d49a325 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Fri, 10 Feb 2017 20:58:50 +0100 Subject: [PATCH] Allow adjusting the maximum input queue length by a command-line flag. --- flags.cpp | 14 ++++++++++++++ flags.h | 1 + mixer.cpp | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/flags.cpp b/flags.cpp index f81f96d..b926d14 100644 --- a/flags.cpp +++ b/flags.cpp @@ -46,6 +46,7 @@ enum LongOption { OPTION_DISABLE_ALSA_OUTPUT, OPTION_NO_FLUSH_PBOS, OPTION_PRINT_VIDEO_LATENCY, + OPTION_MAX_INPUT_QUEUE_FRAMES, OPTION_AUDIO_QUEUE_LENGTH_MS, OPTION_OUTPUT_YCBCR_COEFFICIENTS, OPTION_OUTPUT_BUFFER_FRAMES, @@ -105,6 +106,8 @@ void usage() fprintf(stderr, " (will give display corruption, but makes it\n"); fprintf(stderr, " possible to run with apitrace in real time)\n"); fprintf(stderr, " --print-video-latency print out measurements of video latency on stdout\n"); + fprintf(stderr, " --max-input-queue-frames=FRAMES never keep more than FRAMES frames for each card\n"); + fprintf(stderr, " (default 6, minimum 1)\n"); fprintf(stderr, " --audio-queue-length-ms=MS length of audio resampling queue (default 100.0)\n"); fprintf(stderr, " --output-ycbcr-coefficients={rec601,rec709,auto}\n"); fprintf(stderr, " Y'CbCr coefficient standard of output (default auto)\n"); @@ -163,6 +166,7 @@ void parse_flags(int argc, char * const argv[]) { "disable-alsa-output", no_argument, 0, OPTION_DISABLE_ALSA_OUTPUT }, { "no-flush-pbos", no_argument, 0, OPTION_NO_FLUSH_PBOS }, { "print-video-latency", no_argument, 0, OPTION_PRINT_VIDEO_LATENCY }, + { "max-input-queue-frames", required_argument, 0, OPTION_MAX_INPUT_QUEUE_FRAMES }, { "audio-queue-length-ms", required_argument, 0, OPTION_AUDIO_QUEUE_LENGTH_MS }, { "output-ycbcr-coefficients", required_argument, 0, OPTION_OUTPUT_YCBCR_COEFFICIENTS }, { "output-buffer-frames", required_argument, 0, OPTION_OUTPUT_BUFFER_FRAMES }, @@ -323,6 +327,9 @@ void parse_flags(int argc, char * const argv[]) case OPTION_PRINT_VIDEO_LATENCY: global_flags.print_video_latency = true; break; + case OPTION_MAX_INPUT_QUEUE_FRAMES: + global_flags.max_input_queue_frames = atoi(optarg); + break; case OPTION_AUDIO_QUEUE_LENGTH_MS: global_flags.audio_queue_length_ms = atof(optarg); break; @@ -431,4 +438,11 @@ void parse_flags(int argc, char * const argv[]) fprintf(stderr, "ERROR: --output-slop-frames can't be negative.\n"); exit(1); } + if (global_flags.max_input_queue_frames < 1) { + fprintf(stderr, "ERROR: --max-input-queue-frames must be at least 1.\n"); + exit(1); + } + if (global_flags.max_input_queue_frames > 10) { + fprintf(stderr, "WARNING: --max-input-queue-frames has little effect over 10.\n"); + } } diff --git a/flags.h b/flags.h index bc86952..7bfab5d 100644 --- a/flags.h +++ b/flags.h @@ -46,6 +46,7 @@ struct Flags { int output_card = -1; double output_buffer_frames = 6.0; double output_slop_frames = 0.5; + int max_input_queue_frames = 6; }; extern Flags global_flags; diff --git a/mixer.cpp b/mixer.cpp index 093e63e..c7a4659 100644 --- a/mixer.cpp +++ b/mixer.cpp @@ -81,7 +81,7 @@ void insert_new_frame(RefCountedFrame frame, unsigned field_num, bool interlaced void QueueLengthPolicy::update_policy(unsigned queue_length) { if (queue_length == 0) { // Starvation. - if (been_at_safe_point_since_last_starvation && safe_queue_length < 6) { + if (been_at_safe_point_since_last_starvation && safe_queue_length < global_flags.max_input_queue_frames) { ++safe_queue_length; fprintf(stderr, "Card %u: Starvation, increasing safe limit to %u frame(s)\n", card_index, safe_queue_length); -- 2.39.2