[FFmpeg-cvslog] ffmpeg: fix reading from stdin on windows
Michael Niedermayer
git at videolan.org
Sun Sep 4 02:16:08 CEST 2011
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Sep 4 00:24:06 2011 +0200| [ca4d71b149ebe32aeaf617ffccf362624b9aafb1] | committer: Michael Niedermayer
ffmpeg: fix reading from stdin on windows
Based on code by Rolf Siegrist
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ca4d71b149ebe32aeaf617ffccf362624b9aafb1
---
configure | 2 ++
ffmpeg.c | 28 +++++++++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/configure b/configure
index 0752d73..10269db 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 96515c0..8b9cf1c 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
More information about the ffmpeg-cvslog
mailing list