[FFmpeg-cvslog] Revert "Do no modify terminal parameters using termios.h"

Michael Niedermayer git at videolan.org
Thu Mar 31 00:35:58 CEST 2011


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Mar 30 20:58:13 2011 +0200| [8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f] | committer: Michael Niedermayer

Revert "Do no modify terminal parameters using termios.h"

This reverts commit cb48e245e6e770f146220fac0a8bd4dc1a5e006c.

Reason being we like pressing "q" to quit ffmpeg.

Conflicts:

	ffmpeg.c

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f
---

 configure |    2 ++
 ffmpeg.c  |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/configure b/configure
index 40d5aba..4cc64af 100755
--- a/configure
+++ b/configure
@@ -1118,6 +1118,7 @@ HAVE_LIST="
     sys_soundcard_h
     sys_videoio_h
     ten_operands
+    termios_h
     threads
     truncf
     vfp_args
@@ -2803,6 +2804,7 @@ check_header poll.h
 check_header sys/mman.h
 check_header sys/resource.h
 check_header sys/select.h
+check_header termios.h
 check_header vdpau/vdpau.h
 check_header vdpau/vdpau_x11.h
 check_header X11/extensions/XvMClib.h
diff --git a/ffmpeg.c b/ffmpeg.c
index 50cda1a..9722655 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -69,7 +69,12 @@
 #include <sys/select.h>
 #endif
 
-#if HAVE_KBHIT
+#if HAVE_TERMIOS_H
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <termios.h>
+#elif HAVE_KBHIT
 #include <conio.h>
 #endif
 #include <time.h>
@@ -338,6 +343,12 @@ typedef struct AVInputFile {
     int nb_streams;       /* nb streams we are aware of */
 } AVInputFile;
 
+#if HAVE_TERMIOS_H
+
+/* init terminal so that we can grab keys */
+static struct termios oldtty;
+#endif
+
 #if CONFIG_AVFILTER
 
 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
@@ -425,6 +436,9 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
 static void term_exit(void)
 {
     av_log(NULL, AV_LOG_QUIET, "");
+#if HAVE_TERMIOS_H
+    tcsetattr (0, TCSANOW, &oldtty);
+#endif
 }
 
 static volatile int received_sigterm = 0;
@@ -439,6 +453,26 @@ sigterm_handler(int sig)
 
 static void term_init(void)
 {
+#if HAVE_TERMIOS_H
+    struct termios tty;
+
+    tcgetattr (0, &tty);
+    oldtty = tty;
+    atexit(term_exit);
+
+    tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+                          |INLCR|IGNCR|ICRNL|IXON);
+    tty.c_oflag |= OPOST;
+    tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
+    tty.c_cflag &= ~(CSIZE|PARENB);
+    tty.c_cflag |= CS8;
+    tty.c_cc[VMIN] = 1;
+    tty.c_cc[VTIME] = 0;
+
+    tcsetattr (0, TCSANOW, &tty);
+    signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
+#endif
+
     signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).  */
     signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
 #ifdef SIGXCPU
@@ -449,7 +483,25 @@ static void term_init(void)
 /* read a key without blocking */
 static int read_key(void)
 {
-#if HAVE_KBHIT
+#if HAVE_TERMIOS_H
+    int n = 1;
+    unsigned char ch;
+    struct timeval tv;
+    fd_set rfds;
+
+    FD_ZERO(&rfds);
+    FD_SET(0, &rfds);
+    tv.tv_sec = 0;
+    tv.tv_usec = 0;
+    n = select(1, &rfds, NULL, NULL, &tv);
+    if (n > 0) {
+        n = read(0, &ch, 1);
+        if (n == 1)
+            return ch;
+
+        return n;
+    }
+#elif HAVE_KBHIT
     if(kbhit())
         return(getch());
 #endif
@@ -2467,11 +2519,7 @@ static int transcode(AVFormatContext **output_files,
 
     if (!using_stdin) {
         if(verbose >= 0)
-#if HAVE_KBHIT
             fprintf(stderr, "Press [q] to stop encoding\n");
-#else
-            fprintf(stderr, "Press ctrl-c to stop encoding\n");
-#endif
         url_set_interrupt_cb(decode_interrupt_cb);
     }
     term_init();



More information about the ffmpeg-cvslog mailing list