New upstream version 24.0.1+dfsg1
This commit is contained in:
parent
b14f9eae6d
commit
5a730d6ec3
842 changed files with 42245 additions and 33385 deletions
|
|
@ -11,17 +11,18 @@ static void fatal_sock_shutdown(struct rtmp_stream *stream)
|
|||
}
|
||||
|
||||
static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
||||
uint64_t last_send_time)
|
||||
uint64_t last_send_time)
|
||||
{
|
||||
WSANETWORKEVENTS net_events;
|
||||
bool success;
|
||||
|
||||
success = !WSAEnumNetworkEvents(stream->rtmp.m_sb.sb_socket, NULL,
|
||||
&net_events);
|
||||
&net_events);
|
||||
if (!success) {
|
||||
blog(LOG_ERROR, "socket_thread_windows: Aborting due to "
|
||||
"WSAEnumNetworkEvents failure, %d",
|
||||
WSAGetLastError());
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Aborting due to "
|
||||
"WSAEnumNetworkEvents failure, %d",
|
||||
WSAGetLastError());
|
||||
fatal_sock_shutdown(stream);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -34,24 +35,26 @@ static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
|||
uint32_t diff =
|
||||
(os_gettime_ns() / 1000000) - last_send_time;
|
||||
|
||||
blog(LOG_ERROR, "socket_thread_windows: Received "
|
||||
"FD_CLOSE, %u ms since last send "
|
||||
"(buffer: %d / %d)",
|
||||
diff,
|
||||
stream->write_buf_len,
|
||||
stream->write_buf_size);
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Received "
|
||||
"FD_CLOSE, %u ms since last send "
|
||||
"(buffer: %d / %d)",
|
||||
diff, stream->write_buf_len,
|
||||
stream->write_buf_size);
|
||||
}
|
||||
|
||||
if (os_event_try(stream->stop_event) != EAGAIN)
|
||||
blog(LOG_ERROR, "socket_thread_windows: Aborting due "
|
||||
"to FD_CLOSE during shutdown, "
|
||||
"%d bytes lost, error %d",
|
||||
stream->write_buf_len,
|
||||
net_events.iErrorCode[FD_CLOSE_BIT]);
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Aborting due "
|
||||
"to FD_CLOSE during shutdown, "
|
||||
"%d bytes lost, error %d",
|
||||
stream->write_buf_len,
|
||||
net_events.iErrorCode[FD_CLOSE_BIT]);
|
||||
else
|
||||
blog(LOG_ERROR, "socket_thread_windows: Aborting due "
|
||||
"to FD_CLOSE, error %d",
|
||||
net_events.iErrorCode[FD_CLOSE_BIT]);
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Aborting due "
|
||||
"to FD_CLOSE, error %d",
|
||||
net_events.iErrorCode[FD_CLOSE_BIT]);
|
||||
|
||||
fatal_sock_shutdown(stream);
|
||||
return false;
|
||||
|
|
@ -63,8 +66,8 @@ static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
|||
bool fatal = false;
|
||||
|
||||
for (;;) {
|
||||
int ret = recv(stream->rtmp.m_sb.sb_socket,
|
||||
discard, sizeof(discard), 0);
|
||||
int ret = recv(stream->rtmp.m_sb.sb_socket, discard,
|
||||
sizeof(discard), 0);
|
||||
if (ret == -1) {
|
||||
err_code = WSAGetLastError();
|
||||
if (err_code == WSAEWOULDBLOCK)
|
||||
|
|
@ -77,10 +80,11 @@ static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
|||
}
|
||||
|
||||
if (fatal) {
|
||||
blog(LOG_ERROR, "socket_thread_windows: "
|
||||
"Socket error, recv() returned "
|
||||
"%d, GetLastError() %d",
|
||||
ret, err_code);
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: "
|
||||
"Socket error, recv() returned "
|
||||
"%d, GetLastError() %d",
|
||||
ret, err_code);
|
||||
stream->rtmp.last_error_code = err_code;
|
||||
fatal_sock_shutdown(stream);
|
||||
return false;
|
||||
|
|
@ -92,62 +96,55 @@ static bool socket_event(struct rtmp_stream *stream, bool *can_write,
|
|||
}
|
||||
|
||||
static void ideal_send_backlog_event(struct rtmp_stream *stream,
|
||||
bool *can_write)
|
||||
bool *can_write)
|
||||
{
|
||||
ULONG ideal_send_backlog;
|
||||
int ret;
|
||||
|
||||
ret = idealsendbacklogquery(
|
||||
stream->rtmp.m_sb.sb_socket,
|
||||
&ideal_send_backlog);
|
||||
ret = idealsendbacklogquery(stream->rtmp.m_sb.sb_socket,
|
||||
&ideal_send_backlog);
|
||||
if (ret == 0) {
|
||||
int cur_tcp_bufsize;
|
||||
int size = sizeof(cur_tcp_bufsize);
|
||||
|
||||
ret = getsockopt(stream->rtmp.m_sb.sb_socket,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
(char *)&cur_tcp_bufsize,
|
||||
&size);
|
||||
ret = getsockopt(stream->rtmp.m_sb.sb_socket, SOL_SOCKET,
|
||||
SO_SNDBUF, (char *)&cur_tcp_bufsize, &size);
|
||||
if (ret == 0) {
|
||||
if (cur_tcp_bufsize < (int)ideal_send_backlog) {
|
||||
int bufsize = (int)ideal_send_backlog;
|
||||
setsockopt(stream->rtmp.m_sb.sb_socket,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
(const char *)&bufsize,
|
||||
sizeof(bufsize));
|
||||
SOL_SOCKET, SO_SNDBUF,
|
||||
(const char *)&bufsize,
|
||||
sizeof(bufsize));
|
||||
|
||||
blog(LOG_INFO, "socket_thread_windows: "
|
||||
"Increasing send buffer to "
|
||||
"ISB %d (buffer: %d / %d)",
|
||||
ideal_send_backlog,
|
||||
stream->write_buf_len,
|
||||
stream->write_buf_size);
|
||||
blog(LOG_INFO,
|
||||
"socket_thread_windows: "
|
||||
"Increasing send buffer to "
|
||||
"ISB %d (buffer: %d / %d)",
|
||||
ideal_send_backlog, stream->write_buf_len,
|
||||
stream->write_buf_size);
|
||||
}
|
||||
} else {
|
||||
blog(LOG_ERROR, "socket_thread_windows: Got "
|
||||
"send_backlog_event but "
|
||||
"getsockopt() returned %d",
|
||||
WSAGetLastError());
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Got "
|
||||
"send_backlog_event but "
|
||||
"getsockopt() returned %d",
|
||||
WSAGetLastError());
|
||||
}
|
||||
} else {
|
||||
blog(LOG_ERROR, "socket_thread_windows: Got "
|
||||
"send_backlog_event but WSAIoctl() "
|
||||
"returned %d",
|
||||
WSAGetLastError());
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: Got "
|
||||
"send_backlog_event but WSAIoctl() "
|
||||
"returned %d",
|
||||
WSAGetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
enum data_ret {
|
||||
RET_BREAK,
|
||||
RET_FATAL,
|
||||
RET_CONTINUE
|
||||
};
|
||||
enum data_ret { RET_BREAK, RET_FATAL, RET_CONTINUE };
|
||||
|
||||
static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
|
||||
uint64_t *last_send_time, size_t latency_packet_size,
|
||||
int delay_time)
|
||||
uint64_t *last_send_time,
|
||||
size_t latency_packet_size, int delay_time)
|
||||
{
|
||||
bool exit_loop = false;
|
||||
|
||||
|
|
@ -170,19 +167,18 @@ static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
|
|||
min(latency_packet_size, stream->write_buf_len);
|
||||
|
||||
ret = RTMPSockBuf_Send(&stream->rtmp.m_sb,
|
||||
(const char *)stream->write_buf,
|
||||
(int)send_len);
|
||||
(const char *)stream->write_buf,
|
||||
(int)send_len);
|
||||
} else {
|
||||
ret = RTMPSockBuf_Send(&stream->rtmp.m_sb,
|
||||
(const char *)stream->write_buf,
|
||||
(int)stream->write_buf_len);
|
||||
(const char *)stream->write_buf,
|
||||
(int)stream->write_buf_len);
|
||||
}
|
||||
|
||||
if (ret > 0) {
|
||||
if (stream->write_buf_len - ret)
|
||||
memmove(stream->write_buf,
|
||||
stream->write_buf + ret,
|
||||
stream->write_buf_len - ret);
|
||||
memmove(stream->write_buf, stream->write_buf + ret,
|
||||
stream->write_buf_len - ret);
|
||||
stream->write_buf_len -= ret;
|
||||
|
||||
*last_send_time = os_gettime_ns() / 1000000;
|
||||
|
|
@ -210,10 +206,11 @@ static enum data_ret write_data(struct rtmp_stream *stream, bool *can_write,
|
|||
if (fatal_err) {
|
||||
/* connection closed, or connection was aborted /
|
||||
* socket closed / etc, that's a fatal error. */
|
||||
blog(LOG_ERROR, "socket_thread_windows: "
|
||||
"Socket error, send() returned %d, "
|
||||
"GetLastError() %d",
|
||||
ret, err_code);
|
||||
blog(LOG_ERROR,
|
||||
"socket_thread_windows: "
|
||||
"Socket error, send() returned %d, "
|
||||
"GetLastError() %d",
|
||||
ret, err_code);
|
||||
|
||||
pthread_mutex_unlock(&stream->write_buf_mutex);
|
||||
stream->rtmp.last_error_code = err_code;
|
||||
|
|
@ -250,14 +247,15 @@ static inline void socket_thread_windows_internal(struct rtmp_stream *stream)
|
|||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
|
||||
|
||||
WSAEventSelect(stream->rtmp.m_sb.sb_socket,
|
||||
stream->socket_available_event,
|
||||
FD_READ|FD_WRITE|FD_CLOSE);
|
||||
stream->socket_available_event,
|
||||
FD_READ | FD_WRITE | FD_CLOSE);
|
||||
|
||||
send_backlog_event = CreateEvent(NULL, true, false, NULL);
|
||||
|
||||
if (stream->low_latency_mode) {
|
||||
delay_time = 1000 / LATENCY_FACTOR;
|
||||
latency_packet_size = stream->write_buf_size / (LATENCY_FACTOR - 2);
|
||||
latency_packet_size =
|
||||
stream->write_buf_size / (LATENCY_FACTOR - 2);
|
||||
} else {
|
||||
latency_packet_size = stream->write_buf_size;
|
||||
delay_time = 0;
|
||||
|
|
@ -265,13 +263,13 @@ static inline void socket_thread_windows_internal(struct rtmp_stream *stream)
|
|||
|
||||
if (!stream->disable_send_window_optimization) {
|
||||
memset(&send_backlog_overlapped, 0,
|
||||
sizeof(send_backlog_overlapped));
|
||||
sizeof(send_backlog_overlapped));
|
||||
send_backlog_overlapped.hEvent = send_backlog_event;
|
||||
idealsendbacklognotify(stream->rtmp.m_sb.sb_socket,
|
||||
&send_backlog_overlapped, NULL);
|
||||
&send_backlog_overlapped, NULL);
|
||||
} else {
|
||||
blog(LOG_INFO, "socket_thread_windows: Send window "
|
||||
"optimization disabled by user.");
|
||||
"optimization disabled by user.");
|
||||
}
|
||||
|
||||
HANDLE objs[3];
|
||||
|
|
@ -286,7 +284,8 @@ static inline void socket_thread_windows_internal(struct rtmp_stream *stream)
|
|||
if (stream->write_buf_len == 0) {
|
||||
//blog(LOG_DEBUG, "Exiting on empty buffer");
|
||||
pthread_mutex_unlock(&stream->write_buf_mutex);
|
||||
os_event_reset(stream->send_thread_signaled_exit);
|
||||
os_event_reset(
|
||||
stream->send_thread_signaled_exit);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -312,18 +311,15 @@ static inline void socket_thread_windows_internal(struct rtmp_stream *stream)
|
|||
|
||||
ResetEvent(send_backlog_event);
|
||||
idealsendbacklognotify(stream->rtmp.m_sb.sb_socket,
|
||||
&send_backlog_overlapped, NULL);
|
||||
&send_backlog_overlapped, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (can_write) {
|
||||
for (;;) {
|
||||
enum data_ret ret = write_data(
|
||||
stream,
|
||||
&can_write,
|
||||
&last_send_time,
|
||||
latency_packet_size,
|
||||
delay_time);
|
||||
stream, &can_write, &last_send_time,
|
||||
latency_packet_size, delay_time);
|
||||
|
||||
switch (ret) {
|
||||
case RET_BREAK:
|
||||
|
|
@ -334,12 +330,12 @@ static inline void socket_thread_windows_internal(struct rtmp_stream *stream)
|
|||
}
|
||||
}
|
||||
}
|
||||
exit_write_loop:;
|
||||
exit_write_loop:;
|
||||
}
|
||||
|
||||
if (stream->rtmp.m_sb.sb_socket != INVALID_SOCKET)
|
||||
WSAEventSelect(stream->rtmp.m_sb.sb_socket,
|
||||
stream->socket_available_event, 0);
|
||||
stream->socket_available_event, 0);
|
||||
|
||||
blog(LOG_INFO, "socket_thread_windows: Normal exit");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue