From ba2ee84e34bc57c42203a1f7329ab72e4f19ce02 Mon Sep 17 00:00:00 2001
From: Adrian Cable <adrian.cable@gmail.com>
Date: Thu, 10 Oct 2019 09:17:42 -0700
Subject: [PATCH] Support on-the-fly encoder bitrate adjustment using ffmpeg
 interactive mode

---
 fftools/ffmpeg.c | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index b6ecb89893..9cf7a7dc0e 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -4003,11 +4003,51 @@ static int check_keyboard_interaction(int64_t cur_time)
         if(debug) av_log_set_level(AV_LOG_DEBUG);
         fprintf(stderr,"debug=%d\n", debug);
     }
+    if (key == 'r') {
+        OutputStream *enc_ost;
+        AVCodecContext *enc_ctx;
+        int bitrate;
+        char buf[32];
+        int k = 0;
+        int i = 0;
+        int newRateSet = 0;
+        
+        set_tty_echo(1);
+        while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
+            if (k > 0)
+                buf[i++] = k;
+        buf[i] = 0;
+        set_tty_echo(0);
+        
+        fprintf(stderr, "\n");
+        if (k <= 0 || sscanf(buf, "%d", &bitrate) != 1) {
+            av_log(NULL, AV_LOG_ERROR, "Error parsing specified target bitrate\n");
+        } else {
+            for (i = 0; i < nb_output_streams; i++) {
+                enc_ost = output_streams[i];
+            
+                if (enc_ost->attachment_filename)
+                    continue;
+            
+                enc_ctx = enc_ost->stream_copy ? enc_ost->st->codec : enc_ost->enc_ctx;
+                if (enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+                    newRateSet = 1;
+                    enc_ctx->bit_rate = bitrate;
+                    enc_ctx->rc_max_rate = bitrate;
+                    enc_ctx->rc_buffer_size = 2*bitrate;
+                }
+            }
+            if (newRateSet == 1) {
+                av_log(NULL, AV_LOG_INFO, "Dynamic bitrate adjustment: %d bits/sec\n", bitrate);
+            }
+        }
+    }
     if (key == '?'){
         fprintf(stderr, "key    function\n"
                         "?      show this help\n"
                         "+      increase verbosity\n"
                         "-      decrease verbosity\n"
+                        "r      dynamically adjust encoder bitrate, e.g. r299000 to set 299kbit/sec\n"
                         "c      Send command to first matching filter supporting it\n"
                         "C      Send/Queue command to all matching filters\n"
                         "D      cycle through available debug modes\n"
-- 
2.21.0 (Apple Git-122)

