From ca4d71b149ebe32aeaf617ffccf362624b9aafb1 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michaelni@gmx.at>
Date: Sun, 4 Sep 2011 00:24:06 +0200
Subject: [PATCH] ffmpeg: fix reading from stdin on windows

Based on code by Rolf Siegrist
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
---
 configure |  2 ++
 ffmpeg.c  | 28 +++++++++++++++++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/configure b/configure
index 0752d733028..10269db2f09 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 96515c0bcc6..8b9cf1c1ac5 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
-- 
GitLab