diff --git a/configure b/configure index 0752d73302..10269db2f0 100755 --- a/configure +++ b/configure @@ -1101,6 +1101,7 @@ HAVE_LIST=" memalign mkstemp mmap + PeekNamedPipe posix_memalign round roundf @@ -2842,6 +2843,7 @@ check_func strerror_r check_func strptime check_func strtok_r check_func_headers conio.h kbhit +check_func_headers windows.h PeekNamedPipe check_func_headers io.h setmode check_func_headers lzo/lzo1x.h lzo1x_999_compress check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi diff --git a/ffmpeg.c b/ffmpeg.c index 96515c0bcc..8b9cf1c1ac 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -487,9 +487,9 @@ static void term_init(void) /* read a key without blocking */ static int read_key(void) { + unsigned char ch; #if HAVE_TERMIOS_H int n = 1; - unsigned char ch; struct timeval tv; fd_set rfds; @@ -509,6 +509,32 @@ static int read_key(void) return n; } #elif HAVE_KBHIT +# if HAVE_PEEKNAMEDPIPE + static int is_pipe; + static HANDLE input_handle; + DWORD dw, nchars; + if(!input_handle){ + input_handle = GetStdHandle(STD_INPUT_HANDLE); + is_pipe = !GetConsoleMode(input_handle, &dw); + } + + if (stdin->_cnt > 0) { + read(0, &ch, 1); + return ch; + } + if (is_pipe) { + /* When running under a GUI, you will end here. */ + if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL)) + return -1; + //Read it + if(nchars != 0) { + read(0, &ch, 1); + return ch; + }else{ + return -1; + } + } +# endif if(kbhit()) return(getch()); #endif