aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-03-30 20:58:13 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-03-31 00:22:29 +0200
commit8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f (patch)
tree4ceb47c028310043843cdf10ddf2f031d9a0eee6
parent93dfda88968c5e4d3f596f35a446fb7c238e96b2 (diff)
downloadffmpeg-8b8bf89e52bc3bf4be1a9f10eb1eb153a443172f.tar.gz
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@gmx.at>
-rwxr-xr-xconfigure2
-rw-r--r--ffmpeg.c60
2 files changed, 56 insertions, 6 deletions
diff --git a/configure b/configure
index 40d5aba153..4cc64af740 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 50cda1a345..97226556dd 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();