]> git.sesse.net Git - nageru/commitdiff
Allow adjusting the maximum input queue length by a command-line flag.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Fri, 10 Feb 2017 19:58:50 +0000 (20:58 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Fri, 10 Feb 2017 23:45:28 +0000 (00:45 +0100)
flags.cpp
flags.h
mixer.cpp

index f81f96d65aea9eab5853ace1027d5d1387a30160..b926d14c6070348ba5edaa94d0f59e44e4d073d9 100644 (file)
--- 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 bc869526b88007164699bda284b41fe793c08e0f..7bfab5d34d994a31b148c7f8ca2fcb29eaed5309 100644 (file)
--- 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;
 
index 093e63e7214d28296a17fb92d6eebf97effd9154..c7a4659c8a66a486a85345310f897cdf49e601c4 100644 (file)
--- 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);