#define IPPROTO_UDPLITE 136
#endif
+#if HAVE_W32THREADS
+#undef HAVE_PTHREAD_CANCEL
+#define HAVE_PTHREAD_CANCEL 1
+#endif
+
#if HAVE_PTHREAD_CANCEL
-#include <pthread.h>
+#include "libavutil/thread.h"
#endif
#ifndef IPV6_ADD_MEMBERSHIP
goto fail;
}
} else {
- /* set udp recv buffer size to the requested value (default 64K) */
+ /* set udp recv buffer size to the requested value (default UDP_RX_BUF_SIZE) */
tmp = s->buffer_size;
if (setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp, sizeof(tmp)) < 0) {
ff_log_net_error(h, AV_LOG_WARNING, "setsockopt(SO_RECVBUF)");
if (s->thread_started) {
int ret;
// Cancel only read, as write has been signaled as success to the user
- if (h->flags & AVIO_FLAG_READ)
+ if (h->flags & AVIO_FLAG_READ) {
+#ifdef _WIN32
+ /* recvfrom() is not a cancellation point for win32, so we shutdown
+ * the socket and abort pending IO, subsequent recvfrom() calls
+ * will fail with WSAESHUTDOWN causing the thread to exit. */
+ shutdown(s->udp_fd, SD_RECEIVE);
+ CancelIoEx((HANDLE)(SOCKET)s->udp_fd, NULL);
+#else
pthread_cancel(s->circular_buffer_thread);
+#endif
+ }
ret = pthread_join(s->circular_buffer_thread, NULL);
if (ret != 0)
av_log(h, AV_LOG_ERROR, "pthread_join(): %s\n", strerror(ret));