mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-09 14:14:39 +02:00
ffmpeg: windows: respond to logoff and ctrl+break messages as well
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
bd0f14123f
commit
4ebb43f19c
2
configure
vendored
2
configure
vendored
@ -1787,6 +1787,7 @@ SYSTEM_FUNCS="
|
|||||||
pthread_cancel
|
pthread_cancel
|
||||||
sched_getaffinity
|
sched_getaffinity
|
||||||
SetConsoleTextAttribute
|
SetConsoleTextAttribute
|
||||||
|
SetConsoleCtrlHandler
|
||||||
setmode
|
setmode
|
||||||
setrlimit
|
setrlimit
|
||||||
Sleep
|
Sleep
|
||||||
@ -4990,6 +4991,7 @@ check_func_headers windows.h GetSystemTimeAsFileTime
|
|||||||
check_func_headers windows.h MapViewOfFile
|
check_func_headers windows.h MapViewOfFile
|
||||||
check_func_headers windows.h PeekNamedPipe
|
check_func_headers windows.h PeekNamedPipe
|
||||||
check_func_headers windows.h SetConsoleTextAttribute
|
check_func_headers windows.h SetConsoleTextAttribute
|
||||||
|
check_func_headers windows.h SetConsoleCtrlHandler
|
||||||
check_func_headers windows.h Sleep
|
check_func_headers windows.h Sleep
|
||||||
check_func_headers windows.h VirtualAlloc
|
check_func_headers windows.h VirtualAlloc
|
||||||
check_struct windows.h "CONDITION_VARIABLE" Ptr
|
check_struct windows.h "CONDITION_VARIABLE" Ptr
|
||||||
|
41
ffmpeg.c
41
ffmpeg.c
@ -79,6 +79,10 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_SETCONSOLECTRLHANDLER
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_SYS_SELECT_H
|
#if HAVE_SYS_SELECT_H
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
@ -313,6 +317,7 @@ void term_exit(void)
|
|||||||
static volatile int received_sigterm = 0;
|
static volatile int received_sigterm = 0;
|
||||||
static volatile int received_nb_signals = 0;
|
static volatile int received_nb_signals = 0;
|
||||||
static volatile int transcode_init_done = 0;
|
static volatile int transcode_init_done = 0;
|
||||||
|
static volatile int ffmpeg_exited = 0;
|
||||||
static int main_return_code = 0;
|
static int main_return_code = 0;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -329,6 +334,38 @@ sigterm_handler(int sig)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HAVE_SETCONSOLECTRLHANDLER
|
||||||
|
static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
|
||||||
|
{
|
||||||
|
av_log(NULL, AV_LOG_DEBUG, "\nReceived windows signal %ld\n", fdwCtrlType);
|
||||||
|
|
||||||
|
switch (fdwCtrlType)
|
||||||
|
{
|
||||||
|
case CTRL_C_EVENT:
|
||||||
|
case CTRL_BREAK_EVENT:
|
||||||
|
sigterm_handler(SIGINT);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case CTRL_CLOSE_EVENT:
|
||||||
|
case CTRL_LOGOFF_EVENT:
|
||||||
|
case CTRL_SHUTDOWN_EVENT:
|
||||||
|
sigterm_handler(SIGTERM);
|
||||||
|
/* Basically, with these 3 events, when we return from this method the
|
||||||
|
process is hard terminated, so stall as long as we need to
|
||||||
|
to try and let the main thread(s) clean up and gracefully terminate
|
||||||
|
(we have at most 5 seconds, but should be done far before that). */
|
||||||
|
while (!ffmpeg_exited) {
|
||||||
|
Sleep(0);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
av_log(NULL, AV_LOG_ERROR, "Received unknown windows signal %ld\n", fdwCtrlType);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void term_init(void)
|
void term_init(void)
|
||||||
{
|
{
|
||||||
#if HAVE_TERMIOS_H
|
#if HAVE_TERMIOS_H
|
||||||
@ -362,6 +399,9 @@ void term_init(void)
|
|||||||
#ifdef SIGXCPU
|
#ifdef SIGXCPU
|
||||||
signal(SIGXCPU, sigterm_handler);
|
signal(SIGXCPU, sigterm_handler);
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_SETCONSOLECTRLHANDLER
|
||||||
|
SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read a key without blocking */
|
/* read a key without blocking */
|
||||||
@ -537,6 +577,7 @@ static void ffmpeg_cleanup(int ret)
|
|||||||
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
|
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
|
||||||
}
|
}
|
||||||
term_exit();
|
term_exit();
|
||||||
|
ffmpeg_exited = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_avoptions(AVDictionary **a, AVDictionary *b)
|
void remove_avoptions(AVDictionary **a, AVDictionary *b)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user