VT: do not remove a rx session even if ECONNREFUSED occurred. [Problem] rx session removed if recvfrom() returned -1 with ECONNREFUSED reason. [Cause] ECONNREFUSED can be occurred while calling recvfrom() after sendto() for a rtcp packet such as RR and TMMBR if remote side didn't open a socket yet. [Solution] rx session should not be removed even if remote device didn't ready to receive a packet yet. Bug: 196252321 Change-Id: I22b1fbd660a930aaac5e0952fb81cf0537822b77 Signed-off-by: Gaurav <gaurav.tiw@samsung.com> (cherry picked from commit a261106c95bf8d3de4dc06fa3806f8c45bd91a2b)
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp index ffccbb1..0bd342a 100644 --- a/media/libstagefright/rtsp/ARTPConnection.cpp +++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -508,8 +508,6 @@ if (n != (ssize_t)buffer->size()) { ALOGW("failed to send RTCP TMMBR (%s).", n >= 0 ? "connection gone" : strerror(errno)); - - it = mStreams.erase(it); continue; } } @@ -560,8 +558,6 @@ if (n != (ssize_t)buffer->size()) { ALOGW("failed to send RTCP receiver report (%s).", n >= 0 ? "connection gone" : strerror(errno)); - - it = mStreams.erase(it); continue; } @@ -621,7 +617,14 @@ } while (nbytes < 0 && errno == EINTR); if (nbytes <= 0) { - return -ECONNRESET; + ALOGW("failed to recv rtp packet. cause=%s", strerror(errno)); + // ECONNREFUSED may happen in next recvfrom() calling if one of + // outgoing packet can not be delivered to remote by using sendto() + if (errno == ECONNREFUSED) { + return -ECONNREFUSED; + } else { + return -ECONNRESET; + } } buffer->setRange(0, nbytes); @@ -665,6 +668,10 @@ pRemoteRTCPAddr, sizeSockSt); } while (n < 0 && errno == EINTR); + if (n < 0) { + ALOGW("failed to send rtcp packet. cause=%s", strerror(errno)); + } + return n; }