#include <windows.h>
#include <psapi.h>
#endif
+#if HAVE_SETCONSOLECTRLHANDLER
+#include <windows.h>
+#endif
+
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
static volatile int received_sigterm = 0;
static volatile int received_nb_signals = 0;
static volatile int transcode_init_done = 0;
+static volatile int ffmpeg_exited = 0;
static int main_return_code = 0;
static void
}
}
+#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)
{
#if HAVE_TERMIOS_H
#ifdef SIGXCPU
signal(SIGXCPU, sigterm_handler);
#endif
+#if HAVE_SETCONSOLECTRLHANDLER
+ SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
+#endif
}
/* read a key without blocking */
av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
}
term_exit();
+ ffmpeg_exited = 1;
}
void remove_avoptions(AVDictionary **a, AVDictionary *b)
ret = AVERROR_INVALIDDATA;
}
- if (*got_output || ret<0 || pkt->size)
+ if (*got_output || ret<0)
decode_error_stat[ret<0] ++;
+ if (ret < 0 && exit_on_error)
+ exit_program(1);
+
if (!*got_output || ret < 0)
return ret;
);
}
- if (*got_output || ret<0 || pkt->size)
+ if (*got_output || ret<0)
decode_error_stat[ret<0] ++;
+ if (ret < 0 && exit_on_error)
+ exit_program(1);
+
if (*got_output && ret >= 0) {
if (ist->dec_ctx->width != decoded_frame->width ||
ist->dec_ctx->height != decoded_frame->height ||
int i, ret = avcodec_decode_subtitle2(ist->dec_ctx,
&subtitle, got_output, pkt);
- if (*got_output || ret<0 || pkt->size)
+ if (*got_output || ret<0)
decode_error_stat[ret<0] ++;
+ if (ret < 0 && exit_on_error)
+ exit_program(1);
+
if (ret < 0 || !*got_output) {
if (!pkt->size)
sub2video_flush(ist);