From ea69f9cf6152bab766444cda4b9538f8950d3e45 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 11 Nov 2015 16:36:50 -0800 Subject: [PATCH] obs-outputs: Call recv when data received Not calling recv when data is received will accumulate data in the internal recveive buffer until it's full, in which case is will stop acknowledging. This can lead to unjustified disconnections. --- plugins/obs-outputs/rtmp-stream.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index ddb2fa03b..6ba047e46 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -28,6 +28,8 @@ #ifdef _WIN32 #include +#else +#include #endif #define do_log(level, format, ...) \ @@ -251,13 +253,40 @@ static inline bool get_next_packet(struct rtmp_stream *stream, return new_packet; } +static void discard_recv_data(RTMP *rtmp, size_t size) +{ + uint8_t buf[512]; + + do { + size_t bytes = size > 512 ? 512 : size; + size -= bytes; + +#ifdef _WIN32 + recv(rtmp->m_sb.sb_socket, buf, (int)bytes, 0); +#else + recv(rtmp->m_sb.sb_socket, buf, bytes, 0); +#endif + } while (size > 0); +} + static int send_packet(struct rtmp_stream *stream, struct encoder_packet *packet, bool is_header, size_t idx) { uint8_t *data; size_t size; + int recv_size = 0; int ret = 0; +#ifdef _WIN32 + ret = ioctlsocket(stream->rtmp.m_sb.sb_socket, FIONREAD, + (u_long*)&recv_size); +#else + ret = ioctl(stream->rtmp.m_sb.sb_socket, FIONREAD, &recv_size); +#endif + + if (ret >= 0 && recv_size > 0) + discard_recv_data(&stream->rtmp, (size_t)recv_size); + flv_packet_mux(packet, &data, &size, is_header); #ifdef TEST_FRAMEDROPS os_sleep_ms(rand() % 40);