From fde3198997ef794d036b6abd4d1c4a60c5c718f6 Mon Sep 17 00:00:00 2001 From: nafets227 Date: Thu, 27 Nov 2014 21:03:56 +0100 Subject: [PATCH] Bugfix: Reading from sockets. In cSatipRtp::Process() und cSatipRtcp::Process() we need to read until no more data is available, not just once. The original patch is polished and tweaked by Rolf Ahrenberg. --- device.c | 0 rtcp.c | 14 ++++++++------ rtp.c | 14 ++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) mode change 100755 => 100644 device.c diff --git a/device.c b/device.c old mode 100755 new mode 100644 diff --git a/rtcp.c b/rtcp.c index 03fb1b7..2695e8e 100644 --- a/rtcp.c +++ b/rtcp.c @@ -81,11 +81,13 @@ void cSatipRtcp::Process(void) { //debug("cSatipRtcp::%s() [device %d]", __FUNCTION__, tunerM.GetId()); if (bufferM) { - int length = Read(bufferM, bufferLenM); - if (length > 0) { - int offset = GetApplicationOffset(&length); - if (offset >= 0) - tunerM.ProcessApplicationData(bufferM + offset, length); - } + int length; + while ((length = Read(bufferM, bufferLenM)) > 0) { + int offset = GetApplicationOffset(&length); + if (offset >= 0) + tunerM.ProcessApplicationData(bufferM + offset, length); + } + if (errno != EAGAIN && errno != EWOULDBLOCK) + error("Error %d reading from RTCP socket [device %d]", errno, tunerM.GetId()); } } diff --git a/rtp.c b/rtp.c index 0a21e9f..754306c 100644 --- a/rtp.c +++ b/rtp.c @@ -111,11 +111,13 @@ void cSatipRtp::Process(void) { //debug("cSatipRtp::%s() [device %d]", __FUNCTION__, tunerM.GetId()); if (bufferM) { - int length = Read(bufferM, bufferLenM); - if (length > 0) { - int headerlen = GetHeaderLenght(length); - if ((headerlen >= 0) && (headerlen < length)) - tunerM.ProcessVideoData(bufferM + headerlen, length - headerlen); - } + int length; + while ((length = Read(bufferM, bufferLenM)) > 0) { + int headerlen = GetHeaderLenght(length); + if ((headerlen >= 0) && (headerlen < length)) + tunerM.ProcessVideoData(bufferM + headerlen, length - headerlen); + } + if (errno != EAGAIN && errno != EWOULDBLOCK) + error("Error %d reading from RTP socket [device %d]", errno, tunerM.GetId()); } }