From a15ad042c38a71e0de4b05203d4cd6c9e58c7466 Mon Sep 17 00:00:00 2001 From: kim-dong-hyun Date: Thu, 19 Mar 2020 17:50:04 +0900 Subject: [PATCH 01/13] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bc89785..0f1a0f5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # RTSP -c++ RTSP Client/Server - win32/linux/android +c++ RTSP Client/Server - windows/linux/android this project is RTSP client/server library for windows/linux/android. From 0005f4e959c23c3a68a024957a0a350f4f9cce37 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Wed, 14 Oct 2020 00:58:02 +0900 Subject: [PATCH 02/13] =?UTF-8?q?MySock=20=EB=B3=B4=EC=99=84,=20RTSPClient?= =?UTF-8?q?::openURL=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RTSPClient/RTSP/RTSPClient.cpp | 2 ++ Sock/MySock.cpp | 9 +++++++-- Sock/MySock.h | 3 ++- Sock/TaskScheduler.cpp | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/RTSPClient/RTSP/RTSPClient.cpp b/RTSPClient/RTSP/RTSPClient.cpp index 23e940c..2a1d43c 100644 --- a/RTSPClient/RTSP/RTSPClient.cpp +++ b/RTSPClient/RTSP/RTSPClient.cpp @@ -1484,6 +1484,8 @@ int RTSPClient::openURL(const char *url, int streamType, int timeout, bool rtpOn addr.s_addr = address; const char *ip_address = inet_ntoa(addr); + if (ip_address == NULL) break; + parsedURL = new char[strlen(ip_address)+strlen(urlSuffix)+20]; sprintf((char *)parsedURL, "rtsp://%s:%hu%s", ip_address, port, urlSuffix); diff --git a/Sock/MySock.cpp b/Sock/MySock.cpp index 443e298..3786e6b 100644 --- a/Sock/MySock.cpp +++ b/Sock/MySock.cpp @@ -7,6 +7,7 @@ MySock::MySock() { fSock = -1; fPort = 0; + fIsOpen = false; memset(&fClientAddr, 0, sizeof(struct sockaddr_in)); fIsSSM = false; fGroupAddress = fSourceFilterAddr = 0; @@ -27,9 +28,9 @@ void MySock::closeSock() } } - if (fSock >= 0) { + if (fIsOpen) { closeSocket(fSock); - fSock = -1; + fIsOpen = false; memset(&fClientAddr, 0, sizeof(struct sockaddr_in)); fGroupAddress = fSourceFilterAddr = 0; } @@ -46,6 +47,7 @@ int MySock::setupStreamSock(short port, int makeNonBlocking) if (sock > 0) { fSock = sock; fPort = port; + fIsOpen = true; } return sock; @@ -57,6 +59,7 @@ int MySock::setupDatagramSock(short port, int makeNonBlocking) if (sock > 0) { fSock = sock; fPort = port; + fIsOpen = true; } return sock; @@ -68,6 +71,7 @@ int MySock::setupServerSock(short port, int makeNonBlocking) if (sock > 0) { fSock = sock; fPort = port; + fIsOpen = true; } return sock; @@ -79,6 +83,7 @@ int MySock::setupClientSock(int serverSock, int makeNonBlocking) if (sock > 0) { fSock = sock; fPort = ntohs(fClientAddr.sin_port); + fIsOpen = true; } return sock; diff --git a/Sock/MySock.h b/Sock/MySock.h index c08308d..b561b70 100644 --- a/Sock/MySock.h +++ b/Sock/MySock.h @@ -13,7 +13,7 @@ class MySock int sock() { return fSock; } unsigned short port() { return fPort; } struct sockaddr_in& clientAddress() { return fClientAddr; } - bool isOpened() { return fSock != -1; } + bool isOpened() { return fIsOpen; } int setupStreamSock(short port, int makeNonBlocking); int setupDatagramSock(short port, int makeNonBlocking); @@ -54,6 +54,7 @@ class MySock protected: int fSock; unsigned short fPort; + bool fIsOpen; struct sockaddr_in fClientAddr; diff --git a/Sock/TaskScheduler.cpp b/Sock/TaskScheduler.cpp index 97d6170..d3bed4c 100644 --- a/Sock/TaskScheduler.cpp +++ b/Sock/TaskScheduler.cpp @@ -2,7 +2,7 @@ #include "RTSPCommonEnv.h" #include -THREAD_FUNC DoEventThread(void* lpParam) +static THREAD_FUNC DoEventThread(void* lpParam) { TaskScheduler *scheduler = (TaskScheduler *)lpParam; scheduler->doEventLoop(); From fe2c7d13ea5848a96a596d83da72bd8f0518c85f Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Mon, 9 Nov 2020 09:40:30 +0900 Subject: [PATCH 03/13] =?UTF-8?q?NetCommon.h=20=EC=9C=84=EC=B9=98=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EC=86=8C=EC=8A=A4=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {OS_Common => Sock}/NetCommon.h | 0 Sock/SockCommon.cpp | 4 ++-- Sock/TaskScheduler.cpp | 2 -- win32/RTSPClientLib/RTSPClientLib.vcxproj | 2 +- win32/RTSPClientLib/RTSPClientLib.vcxproj.filters | 6 +++--- win32/RTSPServerLib/RTSPServerLib.vcxproj | 2 +- win32/RTSPServerLib/RTSPServerLib.vcxproj.filters | 4 ++-- 7 files changed, 9 insertions(+), 11 deletions(-) rename {OS_Common => Sock}/NetCommon.h (100%) diff --git a/OS_Common/NetCommon.h b/Sock/NetCommon.h similarity index 100% rename from OS_Common/NetCommon.h rename to Sock/NetCommon.h diff --git a/Sock/SockCommon.cpp b/Sock/SockCommon.cpp index 8ee7481..e3456c0 100644 --- a/Sock/SockCommon.cpp +++ b/Sock/SockCommon.cpp @@ -94,14 +94,14 @@ int setupStreamSock(short port, int makeNonBlocking) socketErr("[%s] unable to create stream socket: ", __FUNCTION__); return newSocket; } -#if 0 + if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuseFlag, sizeof reuseFlag) != 0) { socketErr("[%s] setsockopt(SO_REUSEADDR) error: ", __FUNCTION__); closeSocket(newSocket); return -1; } -#endif + struct sockaddr_in c_addr; memset(&c_addr, 0, sizeof(c_addr)); c_addr.sin_addr.s_addr = INADDR_ANY; diff --git a/Sock/TaskScheduler.cpp b/Sock/TaskScheduler.cpp index d3bed4c..1a84264 100644 --- a/Sock/TaskScheduler.cpp +++ b/Sock/TaskScheduler.cpp @@ -25,8 +25,6 @@ TaskScheduler::~TaskScheduler() delete fReadHandlers; - THREAD_DESTROY(&fThread); - MUTEX_DESTROY(&fMutex); } diff --git a/win32/RTSPClientLib/RTSPClientLib.vcxproj b/win32/RTSPClientLib/RTSPClientLib.vcxproj index 75b20c5..8ded870 100644 --- a/win32/RTSPClientLib/RTSPClientLib.vcxproj +++ b/win32/RTSPClientLib/RTSPClientLib.vcxproj @@ -199,13 +199,13 @@ + - diff --git a/win32/RTSPClientLib/RTSPClientLib.vcxproj.filters b/win32/RTSPClientLib/RTSPClientLib.vcxproj.filters index 9791768..7924cf6 100644 --- a/win32/RTSPClientLib/RTSPClientLib.vcxproj.filters +++ b/win32/RTSPClientLib/RTSPClientLib.vcxproj.filters @@ -196,9 +196,6 @@ OS_Common - - OS_Common - OS_Common @@ -214,5 +211,8 @@ RTP + + Sock + \ No newline at end of file diff --git a/win32/RTSPServerLib/RTSPServerLib.vcxproj b/win32/RTSPServerLib/RTSPServerLib.vcxproj index b4040d9..c355e5a 100644 --- a/win32/RTSPServerLib/RTSPServerLib.vcxproj +++ b/win32/RTSPServerLib/RTSPServerLib.vcxproj @@ -145,6 +145,7 @@ + @@ -155,7 +156,6 @@ - diff --git a/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters b/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters index 2e7de43..86f86b4 100644 --- a/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters +++ b/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters @@ -60,8 +60,8 @@ RTSP - - OS_Common + + Sock From c87996ac05d56788bcbed16dbf38d6ea62100d39 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Mon, 9 Nov 2020 09:51:36 +0900 Subject: [PATCH 04/13] =?UTF-8?q?OS=5FCommon=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- win32/RTSPServerLib/RTSPServerLib.vcxproj | 8 +++++++ .../RTSPServerLib.vcxproj.filters | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/win32/RTSPServerLib/RTSPServerLib.vcxproj b/win32/RTSPServerLib/RTSPServerLib.vcxproj index c355e5a..bbc66ee 100644 --- a/win32/RTSPServerLib/RTSPServerLib.vcxproj +++ b/win32/RTSPServerLib/RTSPServerLib.vcxproj @@ -141,6 +141,10 @@ + + + + @@ -158,6 +162,10 @@ + + + + diff --git a/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters b/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters index 86f86b4..b28553e 100644 --- a/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters +++ b/win32/RTSPServerLib/RTSPServerLib.vcxproj.filters @@ -63,6 +63,18 @@ Sock + + OS_Common + + + OS_Common + + + OS_Common + + + OS_Common + @@ -110,6 +122,18 @@ RTSP + + OS_Common + + + OS_Common + + + OS_Common + + + OS_Common + From 4a661792131ccee0a1f4eee13131f2af302d0a60 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Mon, 9 Nov 2020 10:42:18 +0900 Subject: [PATCH 05/13] =?UTF-8?q?NetCommon.h=20=EC=97=90=20=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20define=20RTSPCommon.h=20=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/RTSPCommon.h | 7 +++++++ RTSPServer/RTSP/ServerMediaSession.cpp | 1 + Sock/NetCommon.h | 6 ------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Common/RTSPCommon.h b/Common/RTSPCommon.h index 7cda993..ae75515 100644 --- a/Common/RTSPCommon.h +++ b/Common/RTSPCommon.h @@ -13,6 +13,13 @@ typedef unsigned int u_int32_t; typedef unsigned __int64 uint64_t; typedef unsigned __int64 u_int64_t; typedef __int64 int64_t; + +#define _strcasecmp _strnicmp + +#if _MSC_VER <= 1700 +#define snprintf _snprintf +#endif + #else #include #endif diff --git a/RTSPServer/RTSP/ServerMediaSession.cpp b/RTSPServer/RTSP/ServerMediaSession.cpp index 5d469bb..d0c65da 100644 --- a/RTSPServer/RTSP/ServerMediaSession.cpp +++ b/RTSPServer/RTSP/ServerMediaSession.cpp @@ -2,6 +2,7 @@ #include "util.h" #include "SockCommon.h" #include "RTSPCommonEnv.h" +#include "RTSPCommon.h" #include diff --git a/Sock/NetCommon.h b/Sock/NetCommon.h index 1e58046..1c7f0b9 100644 --- a/Sock/NetCommon.h +++ b/Sock/NetCommon.h @@ -11,12 +11,6 @@ #define EINPROGRESS WSAEWOULDBLOCK #define EINTR WSAEINTR -#define _strcasecmp _strnicmp - -#if _MSC_VER <= 1700 -#define snprintf _snprintf -#endif - #else #include From de7e1a3c5e8b3daa4ec3c7333e1af89ad92f9ac2 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Tue, 10 Nov 2020 16:42:26 +0900 Subject: [PATCH 06/13] =?UTF-8?q?NetCommon.h/RTSPCommon.h=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/RTSPCommon.h | 1 + Sock/NetCommon.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/RTSPCommon.h b/Common/RTSPCommon.h index ae75515..01dda5c 100644 --- a/Common/RTSPCommon.h +++ b/Common/RTSPCommon.h @@ -22,6 +22,7 @@ typedef __int64 int64_t; #else #include +#define _strcasecmp strncasecmp #endif #pragma pack(push, 1) diff --git a/Sock/NetCommon.h b/Sock/NetCommon.h index 1c7f0b9..296f39e 100644 --- a/Sock/NetCommon.h +++ b/Sock/NetCommon.h @@ -26,7 +26,6 @@ #include #include -#define _strcasecmp strncasecmp #endif #endif From 2fbb9bba04f4c25d8f9bc8450e8e02bd1dd15b0a Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Thu, 15 Jul 2021 10:50:29 +0900 Subject: [PATCH 07/13] =?UTF-8?q?stopEventLoop=20fThread=20null=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sock/TaskScheduler.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sock/TaskScheduler.cpp b/Sock/TaskScheduler.cpp index 1a84264..a90d088 100644 --- a/Sock/TaskScheduler.cpp +++ b/Sock/TaskScheduler.cpp @@ -92,8 +92,10 @@ void TaskScheduler::stopEventLoop() { fTaskLoop = 0; - THREAD_JOIN(&fThread); - THREAD_DESTROY(&fThread); + if (fThread) { + THREAD_JOIN(&fThread); + THREAD_DESTROY(&fThread); + } } void TaskScheduler::doEventLoop() From 872538ad637c6a6c52342b95f3fa042624a4ecb5 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Thu, 10 Feb 2022 13:33:47 +0900 Subject: [PATCH 08/13] =?UTF-8?q?rtsp=20=EC=A0=91=EC=86=8D=EC=8B=9C=20user?= =?UTF-8?q?name/password=20=EB=85=B8=EC=B6=9C=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. rtsp://:@/ 포멧으로 접속시 username/password 노출안되도록 수정 2. H.265 VPS/SPS/PPS 처리 추가 3. 소스정리 --- RTSPClient/RTP/AC3RTPSource.cpp | 6 +-- RTSPClient/RTP/H264RTPSource.cpp | 20 ++++----- RTSPClient/RTP/H265RTPSource.cpp | 10 ++--- RTSPClient/RTP/JPEGRTPSource.cpp | 6 +-- RTSPClient/RTP/MPEG4ESRTPSource.cpp | 6 +-- RTSPClient/RTP/MPEG4GenericRTPSource.cpp | 6 +-- RTSPClient/RTP/RTPSource.cpp | 26 +++++------ RTSPClient/RTP/RTPSource.h | 8 ++-- RTSPClient/RTSP/MediaSession.cpp | 8 ++++ RTSPClient/RTSP/MediaSession.h | 4 ++ RTSPClient/RTSP/RTSPClient.cpp | 57 +++++++++++++++++++++++- tests/rtspclient.cpp | 7 ++- tests/rtspserver.cpp | 6 +-- 13 files changed, 121 insertions(+), 49 deletions(-) diff --git a/RTSPClient/RTP/AC3RTPSource.cpp b/RTSPClient/RTP/AC3RTPSource.cpp index c27ae85..1933e78 100644 --- a/RTSPClient/RTP/AC3RTPSource.cpp +++ b/RTSPClient/RTP/AC3RTPSource.cpp @@ -14,7 +14,7 @@ void AC3RTPSource::processFrame(RTPPacketBuffer *packet) { uint8_t *buf = packet->payload(); int len = packet->payloadLen(); - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); unsigned char* headerStart = buf; @@ -31,8 +31,8 @@ void AC3RTPSource::processFrame(RTPPacketBuffer *packet) // In case the sender did not set the "M" bit correctly, we also test for FT == 0: if (packet->markerBit() || FT == 0) { if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); fBeginFrame = false; } } diff --git a/RTSPClient/RTP/H264RTPSource.cpp b/RTSPClient/RTP/H264RTPSource.cpp index 15b6086..b520697 100644 --- a/RTSPClient/RTP/H264RTPSource.cpp +++ b/RTSPClient/RTP/H264RTPSource.cpp @@ -16,10 +16,10 @@ H264RTPSource::~H264RTPSource() void H264RTPSource::putStartCode() { - fFrameBuf[fFrameBufPos++] = 0x00; - fFrameBuf[fFrameBufPos++] = 0x00; - fFrameBuf[fFrameBufPos++] = 0x00; - fFrameBuf[fFrameBufPos++] = 0x01; + fFrameBuffer[fFrameBufferPos++] = 0x00; + fFrameBuffer[fFrameBufferPos++] = 0x00; + fFrameBuffer[fFrameBufferPos++] = 0x00; + fFrameBuffer[fFrameBufferPos++] = 0x01; } void H264RTPSource::processFrame(RTPPacketBuffer *packet) @@ -34,7 +34,7 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) uint8_t *buf_ptr = buf; bool isCompleteFrame = false; - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); uint8_t nalUnitType = (buf[0]&0x1F); @@ -42,7 +42,7 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) DPRINTF("nal_type: %d, size: %d\n", nalUnitType, len); if (!fIsStartFrame) { - if (fExtraData) { + if (fExtraDataSize > 0) { putStartCode(); offset = trimStartCode(fExtraData, fExtraDataSize); copyToFrameBuffer(&fExtraData[offset], fExtraDataSize - offset); @@ -105,8 +105,8 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) buf_ptr += staplen; len -= staplen; if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } break; } @@ -119,8 +119,8 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) if (isCompleteFrame) { if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } } diff --git a/RTSPClient/RTP/H265RTPSource.cpp b/RTSPClient/RTP/H265RTPSource.cpp index 048a17a..1da1a02 100644 --- a/RTSPClient/RTP/H265RTPSource.cpp +++ b/RTSPClient/RTP/H265RTPSource.cpp @@ -22,7 +22,7 @@ void H265RTPSource::processFrame(RTPPacketBuffer* packet) uint8_t* headerStart = buf; bool isCompleteFrame = false; - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); uint8_t nalUnitType = (headerStart[0] & 0x7E) >> 1; @@ -49,8 +49,8 @@ void H265RTPSource::processFrame(RTPPacketBuffer* packet) buf_ptr += nalUSize; len -= nalUSize; if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } } break; case 49: { // Fragmentation Unit (FU) @@ -83,7 +83,7 @@ void H265RTPSource::processFrame(RTPPacketBuffer* packet) if (isCompleteFrame) { if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } } \ No newline at end of file diff --git a/RTSPClient/RTP/JPEGRTPSource.cpp b/RTSPClient/RTP/JPEGRTPSource.cpp index d2c86dd..9215bb0 100644 --- a/RTSPClient/RTP/JPEGRTPSource.cpp +++ b/RTSPClient/RTP/JPEGRTPSource.cpp @@ -267,7 +267,7 @@ void JPEGRTPSource::processFrame(RTPPacketBuffer *packet) memcpy(&jpeg_buf[MAX_JPEG_HEADER_SIZE], buf, len); uint8_t *buf_ptr = &jpeg_buf[MAX_JPEG_HEADER_SIZE]; - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); unsigned char* qtables = NULL; unsigned qtlen = 0; @@ -391,8 +391,8 @@ void JPEGRTPSource::processFrame(RTPPacketBuffer *packet) if (packet->markerBit()) { if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } delete[] jpeg_buf; diff --git a/RTSPClient/RTP/MPEG4ESRTPSource.cpp b/RTSPClient/RTP/MPEG4ESRTPSource.cpp index 6844a5b..28f5f14 100644 --- a/RTSPClient/RTP/MPEG4ESRTPSource.cpp +++ b/RTSPClient/RTP/MPEG4ESRTPSource.cpp @@ -17,7 +17,7 @@ void MPEG4ESRTPSource::processFrame(RTPPacketBuffer *packet) { uint8_t *buf = (uint8_t *)packet->payload(); int len = packet->payloadLen(); - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); if (len >= 4) { if (buf[0] == 0 && buf[1] == 0 && buf[2] == 1) @@ -35,8 +35,8 @@ void MPEG4ESRTPSource::processFrame(RTPPacketBuffer *packet) if (packet->markerBit()) { if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); fBeginFrame = false; } } diff --git a/RTSPClient/RTP/MPEG4GenericRTPSource.cpp b/RTSPClient/RTP/MPEG4GenericRTPSource.cpp index 14a4588..8ea9b39 100644 --- a/RTSPClient/RTP/MPEG4GenericRTPSource.cpp +++ b/RTSPClient/RTP/MPEG4GenericRTPSource.cpp @@ -32,7 +32,7 @@ void MPEG4GenericRTPSource::processFrame(RTPPacketBuffer *packet) uint8_t *buf = (uint8_t *)packet->payload(); int len = packet->payloadLen(); - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); unsigned char* headerStart = buf; unsigned packetSize = len; @@ -80,7 +80,7 @@ void MPEG4GenericRTPSource::processFrame(RTPPacketBuffer *packet) ptr += fAUHeaders[i].size; if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); - resetFrameBuf(); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + resetFrameBuffer(); } } diff --git a/RTSPClient/RTP/RTPSource.cpp b/RTSPClient/RTP/RTPSource.cpp index 1d59e96..d318761 100644 --- a/RTSPClient/RTP/RTPSource.cpp +++ b/RTSPClient/RTP/RTPSource.cpp @@ -34,8 +34,8 @@ fRtpHandlerFunc(NULL), fRtpHandlerFuncData(NULL), fRtcpHandlerFunc(NULL), fRtcpH else if (!strcmp(subsession.mediumName(), "audio")) fFrameType = FRAME_TYPE_AUDIO; - fFrameBuf = new uint8_t[FRAME_BUFFER_SIZE]; - fFrameBufPos = 0; + fFrameBuffer = new uint8_t[FRAME_BUFFER_SIZE]; + fFrameBufferPos = 0; fLastSeqNum = fLastSeqNum2 = 0; fLastTimestamp = 0; @@ -89,7 +89,7 @@ RTPSource::~RTPSource() DELETE_OBJECT(fRtcpInstance); DELETE_ARRAY(fRecvBuf); - DELETE_ARRAY(fFrameBuf); + DELETE_ARRAY(fFrameBuffer); DELETE_ARRAY(fCodecName); DELETE_ARRAY(fExtraData); DELETE_ARRAY(fTrackId); @@ -240,15 +240,15 @@ void RTPSource::processFrame(RTPPacketBuffer *packet) { uint8_t *buf = (uint8_t *)packet->payload(); int len = packet->payloadLen(); - int64_t media_timestamp = packet->extTimestamp() == 0 ? getMediaTimestamp(packet->timestamp()) : packet->extTimestamp(); + int64_t timestamp = packet->extTimestamp() == 0 ? getRealTimestamp(packet->timestamp()) : packet->extTimestamp(); copyToFrameBuffer(buf, len); if (packet->markerBit() == 1 || fLastTimestamp != packet->timestamp()) { if (fFrameHandlerFunc) { - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, media_timestamp, fFrameBuf, fFrameBufPos); + fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); } - resetFrameBuf(); + resetFrameBuffer(); } } @@ -350,20 +350,20 @@ void RTPSource::sendRtcpReport(char *buf, int len) void RTPSource::copyToFrameBuffer(uint8_t *buf, int len) { - if (fFrameBufPos+len >= FRAME_BUFFER_SIZE) { + if (fFrameBufferPos+len >= FRAME_BUFFER_SIZE) { DPRINTF("RTP Frame Buffer overflow %s\n", fCodecName); - fFrameBufPos = 0; + fFrameBufferPos = 0; } - memmove(&fFrameBuf[fFrameBufPos], buf, len); - fFrameBufPos += len; + memmove(&fFrameBuffer[fFrameBufferPos], buf, len); + fFrameBufferPos += len; } -void RTPSource::resetFrameBuf() +void RTPSource::resetFrameBuffer() { - fFrameBufPos = 0; + fFrameBufferPos = 0; } -uint64_t RTPSource::getMediaTimestamp(uint32_t timestamp) +uint64_t RTPSource::getRealTimestamp(uint32_t timestamp) { uint64_t msec = 1000; uint64_t time_msec = timestamp*msec/fTimestampFrequency; diff --git a/RTSPClient/RTP/RTPSource.h b/RTSPClient/RTP/RTPSource.h index b73c813..d6d3fa2 100644 --- a/RTSPClient/RTP/RTPSource.h +++ b/RTSPClient/RTP/RTPSource.h @@ -55,10 +55,10 @@ class RTPSource protected: void copyToFrameBuffer(uint8_t *buf, int len); - void resetFrameBuf(); + void resetFrameBuffer(); protected: - uint64_t getMediaTimestamp(uint32_t timestamp); + uint64_t getRealTimestamp(uint32_t timestamp); protected: ReorderingPacketBuffer *fReorderingBuffer; @@ -84,8 +84,8 @@ class RTPSource uint32_t fSvrAddr; time_t fLastRtcpSendTime; - uint8_t* fFrameBuf; - int fFrameBufPos; + uint8_t* fFrameBuffer; + int fFrameBufferPos; FrameHandlerFunc fFrameHandlerFunc; void* fFrameHandlerFuncData; diff --git a/RTSPClient/RTSP/MediaSession.cpp b/RTSPClient/RTSP/MediaSession.cpp index 37cc199..da5dbe2 100644 --- a/RTSPClient/RTSP/MediaSession.cpp +++ b/RTSPClient/RTSP/MediaSession.cpp @@ -495,6 +495,7 @@ fObjecttype(0), fOctetalign(0), fProfile_level_id(0), fRobustsorting(0), fSizelength(0), fStreamstateindication(0), fStreamtype(0), fCpresent(false), fRandomaccessindication(false), fConfig(NULL), fMode(NULL), fSpropParameterSets(NULL), +fPropVps(NULL), fPropSps(NULL), fPropPps(NULL), fPlayStartTime(0.0), fPlayEndTime(0.0), fVideoWidth(0), fVideoHeight(0), fVideoFPS(0), fNumChannels(1), fScale(1.0f), fNPT_PTS_Offset(0.0f), fRTPSource(NULL) @@ -509,6 +510,7 @@ MediaSubsession::~MediaSubsession() delete[] fConnectionEndpointName; delete[] fSavedSDPLines; delete[] fMediumName; delete[] fCodecName; delete[] fProtocolName; delete[] fControlPath; delete[] fConfig; delete[] fMode; delete[] fSpropParameterSets; + delete[] fPropVps; delete[] fPropSps; delete[] fPropPps; if (sessionId) delete[] sessionId; @@ -819,6 +821,12 @@ bool MediaSubsession::parseSDPAttribute_fmtp(char const* sdpLine) } else if (sscanf(sdpLine, " sprop-parameter-sets = %[^; \t\r\n]", valueStr) == 1) { // Note: We used "sdpLine" here, because the value is case-sensitive. delete[] fSpropParameterSets; fSpropParameterSets = strDup(valueStr); + } else if (sscanf(sdpLine, " sprop-vps=%[^; \t\r\n]", valueStr) == 1) { + delete[] fPropVps; fPropVps = strDup(valueStr); + } else if (sscanf(sdpLine, " sprop-sps=%[^; \t\r\n]", valueStr) == 1) { + delete[] fPropSps; fPropSps = strDup(valueStr); + } else if (sscanf(sdpLine, " sprop-pps=%[^; \t\r\n]", valueStr) == 1) { + delete[] fPropPps; fPropPps = strDup(valueStr); } else { // Some of the above parameters are bool. Check whether the parameter // names appear alone, without a "= 1" at the end: diff --git a/RTSPClient/RTSP/MediaSession.h b/RTSPClient/RTSP/MediaSession.h index 8c82722..8acb426 100644 --- a/RTSPClient/RTSP/MediaSession.h +++ b/RTSPClient/RTSP/MediaSession.h @@ -148,6 +148,9 @@ class MediaSubsession char const* fmtp_config() const { return fConfig; } char const* fmtp_mode() const { return fMode; } char const* fmtp_spropparametersets() const { return fSpropParameterSets; } + char const* fmtp_spropVps() const { return fPropVps; } + char const* fmtp_spropSps() const { return fPropSps; } + char const* fmtp_spropPps() const { return fPropPps; } unsigned int connectionEndpointAddress() const; // Converts "fConnectionEndpointName" to an address (or 0 if unknown) void setDestinations(unsigned int defaultDestAddress); @@ -220,6 +223,7 @@ class MediaSubsession unsigned fSizelength, fStreamstateindication, fStreamtype; bool fCpresent, fRandomaccessindication; char *fConfig, *fMode, *fSpropParameterSets; + char *fPropVps, *fPropSps, *fPropPps; // H.265 double fPlayStartTime; double fPlayEndTime; diff --git a/RTSPClient/RTSP/RTSPClient.cpp b/RTSPClient/RTSP/RTSPClient.cpp index 2a1d43c..09d69dd 100644 --- a/RTSPClient/RTSP/RTSPClient.cpp +++ b/RTSPClient/RTSP/RTSPClient.cpp @@ -1491,6 +1491,8 @@ int RTSPClient::openURL(const char *url, int streamType, int timeout, bool rtpOn parseRTSPURLUsernamePassword(url, username, password); + if (username != NULL && password != NULL) url = parsedURL; + if (connectToServer(ip_address, port, timeout) < 0) break; @@ -1552,11 +1554,64 @@ int RTSPClient::openURL(const char *url, int streamType, int timeout, bool rtpOn fVideoFps = subsession->videoFPS(); if (!strcmp(fVideoCodec, "H264")) { - char *spropParameterSets = (char *)subsession->fmtp_spropparametersets(); + char* spropParameterSets = (char*)subsession->fmtp_spropparametersets(); if (spropParameterSets) { unsigned int sps_size; fVideoExtraData = parseH264ConfigStr(spropParameterSets, fVideoExtraDataSize, sps_size); } + } else if (!strcmp(fVideoCodec, "H265")) { + char* props_vps = (char*)subsession->fmtp_spropVps(); + char* props_sps = (char*)subsession->fmtp_spropSps(); + char* props_pps = (char*)subsession->fmtp_spropPps(); + + uint8_t* extraDataVps = NULL; + uint8_t* extraDataSps = NULL; + uint8_t* extraDataPps = NULL; + + int extraDataVpsSize = 0; + int extraDataSpsSize = 0; + int extraDataPpsSize = 0; + + if (props_vps) { + unsigned int size1 = 0, size2 = 0; + extraDataVps = parseH264ConfigStr(props_vps, size1, size2); + extraDataVpsSize = size1; + + //DPRINTF("size : %d %d\n", size1, size2); + //for (int i = 0; i < size1; i++) printf("0x%02x ", extraDataVps[i]); + //printf("\n"); + } + + if (props_sps) { + unsigned int size1 = 0, size2 = 0; + extraDataSps = parseH264ConfigStr(props_sps, size1, size2); + extraDataSpsSize = size1; + + //DPRINTF("size : %d %d\n", size1, size2); + //for (int i = 0; i < size1; i++) printf("0x%02x ", extraDataSps[i]); + //printf("\n"); + } + + if (props_pps) { + unsigned int size1 = 0, size2 = 0; + extraDataPps = parseH264ConfigStr(props_pps, size1, size2); + extraDataPpsSize = size1; + + //DPRINTF("size : %d %d\n", size1, size2); + //for (int i = 0; i < size1; i++) printf("0x%02x ", extraDataPps[i]); + //printf("\n"); + } + + fVideoExtraDataSize = extraDataVpsSize + extraDataSpsSize + extraDataPpsSize; + fVideoExtraData = new uint8_t[fVideoExtraDataSize]; + + memcpy(fVideoExtraData, extraDataVps, extraDataVpsSize); + memcpy(&fVideoExtraData[extraDataVpsSize], extraDataSps, extraDataSpsSize); + memcpy(&fVideoExtraData[extraDataVpsSize + extraDataSpsSize], extraDataPps, extraDataPpsSize); + + delete[] extraDataVps; + delete[] extraDataSps; + delete[] extraDataPps; } else if (!strcmp(fVideoCodec, "MP4V-ES")) { if (subsession->fmtp_config()) { fVideoExtraData = parseGeneralConfigStr((char const*)subsession->fmtp_config(), fVideoExtraDataSize); diff --git a/tests/rtspclient.cpp b/tests/rtspclient.cpp index e734580..be4a9f4 100644 --- a/tests/rtspclient.cpp +++ b/tests/rtspclient.cpp @@ -71,9 +71,14 @@ int main(int argc, char *argv[]) #else RTSPCommonEnv::SetDebugFlag(DEBUG_FLAG_RTSP); #endif - char *strURL = "rtsp://222.96.113.48:4554/AVStream1_2"; +#if 0 + char* strURL = "rtsp://127.0.0.1:8554/h264ESVideoTest"; fp_dump = fopen("video.264", "wb"); +#else + char* strURL = "rtsp://admin:antsANTS@192.168.140.69/0"; + fp_dump = fopen("video.265", "wb"); +#endif #ifdef RTSPCLIENT_DLL void *rtspClient = rtspclient_new(); diff --git a/tests/rtspserver.cpp b/tests/rtspserver.cpp index b0b1392..ba65fe7 100644 --- a/tests/rtspserver.cpp +++ b/tests/rtspserver.cpp @@ -38,11 +38,11 @@ RTSPLiveStreamer *streamers[NUM_STREAMER] = { NULL }; void addServerSessions() { streamers[0] = new RTSPLiveStreamer(); - streamers[0]->open("rtsp://172.30.1.213/live/main", 0, "stream1"); + streamers[0]->open("rtsp://127.0.0.1:8554/h265ESVideoTest", 0, "stream1"); streamers[0]->run(); streamers[1] = new RTSPLiveStreamer(); - streamers[1]->open("rtsp://admin:1234@172.30.10.103/h264", 0, "stream2"); + streamers[1]->open("rtsp://admin:antsANTS@192.168.140.69/0", 0, "stream2"); streamers[1]->run(); } @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) addServerSessions(); RTSPServer *rtspServer = RTSPServer::instance(); - rtspServer->startServer(8554); + rtspServer->startServer(554); char c; while (c = mygetch() != 'q') { From e90572c733ab1e278738ec8790a6bf3e287e3e7d Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Thu, 17 Feb 2022 16:42:45 +0900 Subject: [PATCH 09/13] =?UTF-8?q?rtspclient=20test=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=9E=A8=EC=97=90=EC=84=9C=20RTSP=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EB=81=8A=EA=B2=BC=EC=9D=84=EB=95=8C=20=EC=BD=9C?= =?UTF-8?q?=EB=B0=B1=EC=B2=98=EB=A6=AC=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/rtspclient.cpp | 11 ++++++++--- win32/RTSPClientDll/RTSPClientDll.cpp | 4 ++-- win32/RTSPClientDll/RTSPClientDll.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/rtspclient.cpp b/tests/rtspclient.cpp index be4a9f4..e471172 100644 --- a/tests/rtspclient.cpp +++ b/tests/rtspclient.cpp @@ -59,6 +59,11 @@ static void frameHandlerFunc(void *arg, RTP_FRAME_TYPE frame_type, int64_t times fwrite(buf, len, 1, fp_dump); } +static void closeHandlerFunc(void* arg, int err, int result) +{ + printf("RTSP session disconnected, err : %d, result : %d", err, result); +} + int main(int argc, char *argv[]) { #ifdef _DEBUG @@ -76,7 +81,7 @@ int main(int argc, char *argv[]) char* strURL = "rtsp://127.0.0.1:8554/h264ESVideoTest"; fp_dump = fopen("video.264", "wb"); #else - char* strURL = "rtsp://admin:antsANTS@192.168.140.69/0"; + char* strURL = "rtsp://admin:antsANTS@192.168.140.103/0"; fp_dump = fopen("video.265", "wb"); #endif @@ -94,9 +99,9 @@ int main(int argc, char *argv[]) #endif { #ifdef RTSPCLIENT_DLL - if (rtspclient_play_url(rtspClient, frameHandlerFunc, rtspClient) == 0) + if (rtspclient_play_url(rtspClient, frameHandlerFunc, rtspClient, closeHandlerFunc, rtspClient) == 0) #else - if (rtspClient->playURL(frameHandlerFunc, rtspClient, NULL, NULL) == 0) + if (rtspClient->playURL(frameHandlerFunc, rtspClient, closeHandlerFunc, rtspClient) == 0) #endif { char c; diff --git a/win32/RTSPClientDll/RTSPClientDll.cpp b/win32/RTSPClientDll/RTSPClientDll.cpp index 1a11394..423eb9a 100644 --- a/win32/RTSPClientDll/RTSPClientDll.cpp +++ b/win32/RTSPClientDll/RTSPClientDll.cpp @@ -28,11 +28,11 @@ RTSPCLIENTDLL_API int rtspclient_open_url(void *rtspclient, const char *url, int return -1; } -RTSPCLIENTDLL_API int rtspclient_play_url(void *rtspclient, DllFrameHandlerFunc *func, void *funcData) +RTSPCLIENTDLL_API int rtspclient_play_url(void *rtspclient, DllFrameHandlerFunc *func, void *funcData, DllCloseHandlerFunc* closeHandlerFunc, void* closeHandlerFuncData) { if (rtspclient) { RTSPClient *pRTSPClient = (RTSPClient *)rtspclient; - return pRTSPClient->playURL((FrameHandlerFunc)func, funcData, NULL, NULL, NULL, NULL); + return pRTSPClient->playURL((FrameHandlerFunc)func, funcData, closeHandlerFunc, closeHandlerFuncData, NULL, NULL); } return -1; } diff --git a/win32/RTSPClientDll/RTSPClientDll.h b/win32/RTSPClientDll/RTSPClientDll.h index ba2e6ab..2388f23 100644 --- a/win32/RTSPClientDll/RTSPClientDll.h +++ b/win32/RTSPClientDll/RTSPClientDll.h @@ -16,11 +16,12 @@ typedef enum DLL_RTP_FRAME_TYPE { DLL_FRAME_TYPE_VIDEO, DLL_FRAME_TYPE_AUDIO, DLL_FRAME_TYPE_ETC }; typedef void DllFrameHandlerFunc(void *arg, DLL_RTP_FRAME_TYPE frame_type, __int64 timestamp, unsigned char *buf, int len); +typedef void DllCloseHandlerFunc(void* arg, int err, int result); RTSPCLIENTDLL_API void* rtspclient_new(); RTSPCLIENTDLL_API void rtspclient_delete(void *rtspclient); RTSPCLIENTDLL_API int rtspclient_open_url(void *rtspclient, const char *url, int conn_type, int timeout); -RTSPCLIENTDLL_API int rtspclient_play_url(void *rtspclient, DllFrameHandlerFunc *func, void *funcData); +RTSPCLIENTDLL_API int rtspclient_play_url(void *rtspclient, DllFrameHandlerFunc *func, void *funcData, DllCloseHandlerFunc *closeHandlerFunc, void *closeHandlerFuncData); RTSPCLIENTDLL_API void rtspclient_close_url(void *rtspclient); RTSPCLIENTDLL_API void rtspclient_set_debug_flag(int flag); RTSPCLIENTDLL_API void rtspclient_set_debug_print(int print); From ce9f670b338f40539a3fbf3f14dcea0974f49e26 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Fri, 18 Feb 2022 16:03:27 +0900 Subject: [PATCH 10/13] =?UTF-8?q?=EC=BD=9C=EB=B0=B1=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RTSPClient/RTP/AC3RTPSource.cpp | 4 +-- RTSPClient/RTP/H264RTPSource.cpp | 8 ++--- RTSPClient/RTP/H265RTPSource.cpp | 8 ++--- RTSPClient/RTP/JPEGRTPSource.cpp | 4 +-- RTSPClient/RTP/MPEG4ESRTPSource.cpp | 4 +-- RTSPClient/RTP/MPEG4GenericRTPSource.cpp | 4 +-- RTSPClient/RTP/RTPSource.cpp | 42 ++++++++++++------------ RTSPClient/RTP/RTPSource.h | 12 +++---- RTSPClient/RTSP/RTSPClient.cpp | 42 ++++++++++++------------ RTSPClient/RTSP/RTSPClient.h | 24 +++++++------- tests/rtspclient.cpp | 10 +++--- tests/rtspserver.cpp | 2 +- 12 files changed, 82 insertions(+), 82 deletions(-) diff --git a/RTSPClient/RTP/AC3RTPSource.cpp b/RTSPClient/RTP/AC3RTPSource.cpp index 1933e78..f01fbc6 100644 --- a/RTSPClient/RTP/AC3RTPSource.cpp +++ b/RTSPClient/RTP/AC3RTPSource.cpp @@ -30,8 +30,8 @@ void AC3RTPSource::processFrame(RTPPacketBuffer *packet) // The RTP "M" (marker) bit indicates the last fragment of a frame. // In case the sender did not set the "M" bit correctly, we also test for FT == 0: if (packet->markerBit() || FT == 0) { - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); fBeginFrame = false; } diff --git a/RTSPClient/RTP/H264RTPSource.cpp b/RTSPClient/RTP/H264RTPSource.cpp index b520697..f996e4e 100644 --- a/RTSPClient/RTP/H264RTPSource.cpp +++ b/RTSPClient/RTP/H264RTPSource.cpp @@ -104,8 +104,8 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) buf_ptr += staplen; len -= staplen; - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } break; @@ -118,8 +118,8 @@ void H264RTPSource::processFrame(RTPPacketBuffer *packet) } if (isCompleteFrame) { - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } } diff --git a/RTSPClient/RTP/H265RTPSource.cpp b/RTSPClient/RTP/H265RTPSource.cpp index 1da1a02..14b03f6 100644 --- a/RTSPClient/RTP/H265RTPSource.cpp +++ b/RTSPClient/RTP/H265RTPSource.cpp @@ -48,8 +48,8 @@ void H265RTPSource::processFrame(RTPPacketBuffer* packet) buf_ptr += nalUSize; len -= nalUSize; - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } } break; @@ -82,8 +82,8 @@ void H265RTPSource::processFrame(RTPPacketBuffer* packet) } if (isCompleteFrame) { - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } } \ No newline at end of file diff --git a/RTSPClient/RTP/JPEGRTPSource.cpp b/RTSPClient/RTP/JPEGRTPSource.cpp index 9215bb0..a33149b 100644 --- a/RTSPClient/RTP/JPEGRTPSource.cpp +++ b/RTSPClient/RTP/JPEGRTPSource.cpp @@ -390,8 +390,8 @@ void JPEGRTPSource::processFrame(RTPPacketBuffer *packet) copyToFrameBuffer(buf_ptr, len); if (packet->markerBit()) { - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } diff --git a/RTSPClient/RTP/MPEG4ESRTPSource.cpp b/RTSPClient/RTP/MPEG4ESRTPSource.cpp index 28f5f14..6e4e5ed 100644 --- a/RTSPClient/RTP/MPEG4ESRTPSource.cpp +++ b/RTSPClient/RTP/MPEG4ESRTPSource.cpp @@ -34,8 +34,8 @@ void MPEG4ESRTPSource::processFrame(RTPPacketBuffer *packet) copyToFrameBuffer(buf, len); if (packet->markerBit()) { - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); fBeginFrame = false; } diff --git a/RTSPClient/RTP/MPEG4GenericRTPSource.cpp b/RTSPClient/RTP/MPEG4GenericRTPSource.cpp index 8ea9b39..c86f60d 100644 --- a/RTSPClient/RTP/MPEG4GenericRTPSource.cpp +++ b/RTSPClient/RTP/MPEG4GenericRTPSource.cpp @@ -79,8 +79,8 @@ void MPEG4GenericRTPSource::processFrame(RTPPacketBuffer *packet) copyToFrameBuffer(ptr, fAUHeaders[i].size); ptr += fAUHeaders[i].size; - if (fFrameHandlerFunc) - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); resetFrameBuffer(); } } diff --git a/RTSPClient/RTP/RTPSource.cpp b/RTSPClient/RTP/RTPSource.cpp index d318761..abbfd0c 100644 --- a/RTSPClient/RTP/RTPSource.cpp +++ b/RTSPClient/RTP/RTPSource.cpp @@ -12,8 +12,8 @@ RTPSource::RTPSource(int streamType, MediaSubsession &subsession, TaskScheduler : fStreamType(streamType), fRecvBuf(NULL), fRTPPayloadFormat(subsession.rtpPayloadFormat()), fTimestampFrequency(subsession.rtpTimestampFrequency()), fSSRC(rand()), fTask(&task), fSvrAddr(0), fRtspSock(NULL), fRtcpChannelId(subsession.rtcpChannelId), fCodecName(NULL), fReceptionStatsDB(NULL), fRtcpInstance(NULL), -fFrameHandlerFunc(NULL), fFrameHandlerFuncData(NULL), fIsStartFrame(false), fBeginFrame(false), fExtraData(NULL), fExtraDataSize(0), -fRtpHandlerFunc(NULL), fRtpHandlerFuncData(NULL), fRtcpHandlerFunc(NULL), fRtcpHandlerFuncData(NULL), fFrameType(FRAME_TYPE_ETC) +fFrameHandler(NULL), fFrameHandlerData(NULL), fIsStartFrame(false), fBeginFrame(false), fExtraData(NULL), fExtraDataSize(0), +fRtpHandler(NULL), fRtpHandlerData(NULL), fRtcpHandler(NULL), fRtcpHandlerData(NULL), fFrameType(FRAME_TYPE_ETC) { fReorderingBuffer = new ReorderingPacketBuffer(); @@ -101,14 +101,14 @@ void RTPSource::startNetworkReading(FrameHandlerFunc frameHandler, void *frameHa RTPHandlerFunc rtpHandler, void *rtpHandlerData, RTPHandlerFunc rtcpHandler, void *rtcpHandlerData) { - fFrameHandlerFunc = frameHandler; - fFrameHandlerFuncData = frameHandlerData; + fFrameHandler = frameHandler; + fFrameHandlerData = frameHandlerData; - fRtpHandlerFunc = rtpHandler; - fRtpHandlerFuncData = rtpHandlerData; + fRtpHandler = rtpHandler; + fRtpHandlerData = rtpHandlerData; - fRtcpHandlerFunc = rtcpHandler; - fRtcpHandlerFuncData = rtcpHandlerData; + fRtcpHandler = rtcpHandler; + fRtcpHandlerData = rtcpHandlerData; if (fRtpSock.isOpened()) fTask->turnOnBackgroundReadHandling(fRtpSock.sock(), &incomingRtpPacketHandler, this); @@ -125,14 +125,14 @@ void RTPSource::stopNetworkReading() if (fRtcpSock.isOpened()) fTask->turnOffBackgroundReadHandling(fRtcpSock.sock()); - fFrameHandlerFunc = NULL; - fFrameHandlerFuncData = NULL; + fFrameHandler = NULL; + fFrameHandlerData = NULL; - fRtpHandlerFunc = NULL; - fRtpHandlerFuncData = NULL; + fRtpHandler = NULL; + fRtpHandlerData = NULL; - fRtcpHandlerFunc = NULL; - fRtcpHandlerFuncData = NULL; + fRtcpHandler = NULL; + fRtcpHandlerData = NULL; fReorderingBuffer->reset(); } @@ -211,10 +211,10 @@ void RTPSource::processNextPacket() fLastSeqNum = seqnum; - if (fRtpHandlerFunc) - fRtpHandlerFunc(fRtpHandlerFuncData, fTrackId, (char *)nextPacket->buf(), nextPacket->length()); + if (fRtpHandler) + fRtpHandler(fRtpHandlerData, fTrackId, (char *)nextPacket->buf(), nextPacket->length()); - if (fFrameHandlerFunc) + if (fFrameHandler) processFrame(nextPacket); fReorderingBuffer->releaseUsedPacket(nextPacket); @@ -245,8 +245,8 @@ void RTPSource::processFrame(RTPPacketBuffer *packet) copyToFrameBuffer(buf, len); if (packet->markerBit() == 1 || fLastTimestamp != packet->timestamp()) { - if (fFrameHandlerFunc) { - fFrameHandlerFunc(fFrameHandlerFuncData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); + if (fFrameHandler) { + fFrameHandler(fFrameHandlerData, fFrameType, timestamp, fFrameBuffer, fFrameBufferPos); } resetFrameBuffer(); } @@ -321,8 +321,8 @@ void RTPSource::rtcpReadHandler(char *buf, int len, struct sockaddr_in &fromAddr RTCPInstance::onExpire(fRtcpInstance); } - if (fRtcpHandlerFunc) - fRtcpHandlerFunc(fRtcpHandlerFuncData, fTrackId, buf, len); + if (fRtcpHandler) + fRtcpHandler(fRtcpHandlerData, fTrackId, buf, len); } void RTPSource::sendRtcpReport(char *buf, int len) diff --git a/RTSPClient/RTP/RTPSource.h b/RTSPClient/RTP/RTPSource.h index d6d3fa2..1f0534a 100644 --- a/RTSPClient/RTP/RTPSource.h +++ b/RTSPClient/RTP/RTPSource.h @@ -86,8 +86,8 @@ class RTPSource uint8_t* fFrameBuffer; int fFrameBufferPos; - FrameHandlerFunc fFrameHandlerFunc; - void* fFrameHandlerFuncData; + FrameHandlerFunc fFrameHandler; + void* fFrameHandlerData; // TCP ϶ MySock* fRtspSock; @@ -100,11 +100,11 @@ class RTPSource TaskScheduler* fTask; char* fRecvBuf; - RTPHandlerFunc fRtpHandlerFunc; - void* fRtpHandlerFuncData; + RTPHandlerFunc fRtpHandler; + void* fRtpHandlerData; - RTPHandlerFunc fRtcpHandlerFunc; - void* fRtcpHandlerFuncData; + RTPHandlerFunc fRtcpHandler; + void* fRtcpHandlerData; }; #endif diff --git a/RTSPClient/RTSP/RTSPClient.cpp b/RTSPClient/RTSP/RTSPClient.cpp index 09d69dd..f16244b 100644 --- a/RTSPClient/RTSP/RTSPClient.cpp +++ b/RTSPClient/RTSP/RTSPClient.cpp @@ -38,7 +38,7 @@ RTSPClient::RTSPClient() fLastResponseCode = 0; - fCloseFunc = NULL; fCloseFuncData = NULL; + fCloseHandler = NULL; fCloseHandlerData = NULL; fVideoCodec = fAudioCodec = NULL; fVideoWidth = fVideoHeight = fVideoFps = 0; @@ -52,8 +52,8 @@ RTSPClient::RTSPClient() fIsSendGetParam = false; fLastSendGetParam = 0; - fRTPReceiveFunc = fRTCPReceiveFunc = NULL; - fRTPReceiveFuncData = fRTCPReceiveFuncData = NULL; + fRTPReceiveHandler = fRTCPReceiveHandler = NULL; + fRTPReceiveHandlerData = fRTCPReceiveHandlerData = NULL; fTask = new TaskScheduler(); } @@ -85,7 +85,7 @@ void RTSPClient::reset() fCurrentAuthenticator.reset(); - fCloseFunc = NULL; fCloseFuncData = NULL; + fCloseHandler = NULL; fCloseHandlerData = NULL; fVideoCodec = fAudioCodec = NULL; fVideoWidth = fVideoHeight = fVideoFps = 0; @@ -342,8 +342,8 @@ void RTSPClient::tcpReadError(int result) fTask->turnOffBackgroundReadHandling(fRtspSock.sock()); - if (fCloseFunc) - fCloseFunc(fCloseFuncData, err, result); + if (fCloseHandler) + fCloseHandler(fCloseHandlerData, err, result); } void RTSPClient::tcpReadHandler(void *instance, int) @@ -1647,10 +1647,10 @@ int RTSPClient::openURL(const char *url, int streamType, int timeout, bool rtpOn return 0; } -int RTSPClient::playURL(FrameHandlerFunc func, void *funcData, - OnCloseFunc onCloseFunc, void *onCloseFuncData, - OnPacketReceiveFunc onRTPReceiveFunc, void *onRTPReceiveFuncData, - OnPacketReceiveFunc onRTCPReceiveFunc, void *onRTCPReceiveFuncData) +int RTSPClient::playURL(FrameHandlerFunc frameHandler, void *frameHandlerData, + CloseHandlerFunc closeHandler, void *closeHandlerData, + PacketReceiveHandlerFunc rtpReceiveHandler, void *rtpReceiveHandlerData, + PacketReceiveHandlerFunc rtcpReceiveHandler, void *rtcpReceiveHandlerData) { if (!fMediaSession) return -1; @@ -1658,21 +1658,21 @@ int RTSPClient::playURL(FrameHandlerFunc func, void *funcData, if (!playMediaSession(*fMediaSession, true)) return -1; - fCloseFunc = onCloseFunc; - fCloseFuncData = onCloseFuncData; + fCloseHandler = closeHandler; + fCloseHandlerData = closeHandlerData; - fRTPReceiveFunc = onRTPReceiveFunc; - fRTPReceiveFuncData = onRTPReceiveFuncData; + fRTPReceiveHandler = rtpReceiveHandler; + fRTPReceiveHandlerData = rtpReceiveHandlerData; - fRTCPReceiveFunc = onRTCPReceiveFunc; - fRTCPReceiveFuncData = onRTCPReceiveFuncData; + fRTCPReceiveHandler = rtcpReceiveHandler; + fRTCPReceiveHandlerData = rtcpReceiveHandlerData; MediaSubsessionIterator *iter = new MediaSubsessionIterator(*fMediaSession); MediaSubsession *subsession = NULL; while ((subsession=iter->next()) != NULL) { if (subsession->fRTPSource) - subsession->fRTPSource->startNetworkReading(func, funcData, rtpHandlerCallback, this, rtcpHandlerCallback, this); + subsession->fRTPSource->startNetworkReading(frameHandler, frameHandlerData, rtpHandlerCallback, this, rtcpHandlerCallback, this); } if (fTCPStreamIdCount > 0) fTCPReadingState = AWAITING_DOLLAR; @@ -1810,16 +1810,16 @@ void RTSPClient::rtpHandlerCallback(void *arg, char *trackId, char *buf, int len } } - if (client->fRTPReceiveFunc) - client->fRTPReceiveFunc(client->fRTPReceiveFuncData, trackId, buf, len); + if (client->fRTPReceiveHandler) + client->fRTPReceiveHandler(client->fRTPReceiveHandlerData, trackId, buf, len); } void RTSPClient::rtcpHandlerCallback(void *arg, char *trackId, char *buf, int len) { RTSPClient *client = (RTSPClient *)arg; - if (client->fRTCPReceiveFunc) - client->fRTCPReceiveFunc(client->fRTCPReceiveFuncData, trackId, buf, len); + if (client->fRTCPReceiveHandler) + client->fRTCPReceiveHandler(client->fRTCPReceiveHandlerData, trackId, buf, len); } void RTSPClient::sendGetParam() diff --git a/RTSPClient/RTSP/RTSPClient.h b/RTSPClient/RTSP/RTSPClient.h index bd8cf91..41ceb09 100644 --- a/RTSPClient/RTSP/RTSPClient.h +++ b/RTSPClient/RTSP/RTSPClient.h @@ -9,8 +9,8 @@ #define RECV_BUF_SIZE (1024*1024) #define SEND_GET_PARAM_DURATION (50) -typedef void (*OnCloseFunc)(void *arg, int err, int result); -typedef void (*OnPacketReceiveFunc)(void *arg, const char *trackId, char *buf, int len); +typedef void (*CloseHandlerFunc)(void *arg, int err, int result); +typedef void (*PacketReceiveHandlerFunc)(void *arg, const char *trackId, char *buf, int len); class RTPSource; @@ -21,10 +21,10 @@ class RTSPClient virtual ~RTSPClient(); int openURL(const char *url, int streamType, int timeout = 2, bool rtpOnly = false); - int playURL(FrameHandlerFunc func, void *funcData, - OnCloseFunc onCloseFunc, void *onCloseFuncData, - OnPacketReceiveFunc onRTPReceiveFunc = NULL, void *onRTPReceiveFuncData = NULL, - OnPacketReceiveFunc onRTCPReceiveFunc = NULL, void *onRTCPReceiveFuncData = NULL); + int playURL(FrameHandlerFunc frameHandler, void *frameHandlerData, + CloseHandlerFunc closeHandler, void *closeHandlerFunc, + PacketReceiveHandlerFunc rtpReceiveHandler = NULL, void *rtpReceiveHandlerData = NULL, + PacketReceiveHandlerFunc rtcpReceiveHandler = NULL, void *rtcpReceiveHandlerData = NULL); void closeURL(); void sendGetParam(); int sendPause(); @@ -167,8 +167,8 @@ class RTSPClient unsigned fLastResponseCode; - OnCloseFunc fCloseFunc; - void* fCloseFuncData; + CloseHandlerFunc fCloseHandler; + void* fCloseHandlerData; const char* fVideoCodec; const char* fAudioCodec; @@ -188,10 +188,10 @@ class RTSPClient time_t fLastSendGetParam; // GET_PARAMETER polling time // for rtsp server - OnPacketReceiveFunc fRTPReceiveFunc; - void* fRTPReceiveFuncData; - OnPacketReceiveFunc fRTCPReceiveFunc; - void* fRTCPReceiveFuncData; + PacketReceiveHandlerFunc fRTPReceiveHandler; + void* fRTPReceiveHandlerData; + PacketReceiveHandlerFunc fRTCPReceiveHandler; + void* fRTCPReceiveHandlerData; }; #endif diff --git a/tests/rtspclient.cpp b/tests/rtspclient.cpp index e471172..495b2bb 100644 --- a/tests/rtspclient.cpp +++ b/tests/rtspclient.cpp @@ -50,16 +50,16 @@ int mygetch(void) FILE *fp_dump = NULL; #ifdef RTSPCLIENT_DLL -static void frameHandlerFunc(void *arg, DLL_RTP_FRAME_TYPE frame_type, __int64 timestamp, unsigned char *buf, int len) +static void frameHandler(void *arg, DLL_RTP_FRAME_TYPE frame_type, __int64 timestamp, unsigned char *buf, int len) #else -static void frameHandlerFunc(void *arg, RTP_FRAME_TYPE frame_type, int64_t timestamp, unsigned char *buf, int len) +static void frameHandler(void *arg, RTP_FRAME_TYPE frame_type, int64_t timestamp, unsigned char *buf, int len) #endif { if (fp_dump) fwrite(buf, len, 1, fp_dump); } -static void closeHandlerFunc(void* arg, int err, int result) +static void closeHandler(void* arg, int err, int result) { printf("RTSP session disconnected, err : %d, result : %d", err, result); } @@ -99,9 +99,9 @@ int main(int argc, char *argv[]) #endif { #ifdef RTSPCLIENT_DLL - if (rtspclient_play_url(rtspClient, frameHandlerFunc, rtspClient, closeHandlerFunc, rtspClient) == 0) + if (rtspclient_play_url(rtspClient, frameHandler, rtspClient, closeHandler, rtspClient) == 0) #else - if (rtspClient->playURL(frameHandlerFunc, rtspClient, closeHandlerFunc, rtspClient) == 0) + if (rtspClient->playURL(frameHandler, rtspClient, closeHandler, rtspClient) == 0) #endif { char c; diff --git a/tests/rtspserver.cpp b/tests/rtspserver.cpp index ba65fe7..1bac659 100644 --- a/tests/rtspserver.cpp +++ b/tests/rtspserver.cpp @@ -42,7 +42,7 @@ void addServerSessions() streamers[0]->run(); streamers[1] = new RTSPLiveStreamer(); - streamers[1]->open("rtsp://admin:antsANTS@192.168.140.69/0", 0, "stream2"); + streamers[1]->open("rtsp://admin:antsANTS@192.168.140.103/0", 0, "stream2"); streamers[1]->run(); } From 1c95260b0609c84e29996694639664d8a9a055e2 Mon Sep 17 00:00:00 2001 From: kim dong hyun Date: Fri, 18 Feb 2022 16:17:55 +0900 Subject: [PATCH 11/13] =?UTF-8?q?rtsp=20=EC=84=9C=EB=B2=84=20=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=EB=B3=80=EA=B2=BD=20554->8554=20(=EB=A6=AC=EB=88=85?= =?UTF-8?q?=EC=8A=A4=EC=97=90=EC=84=9C=20=ED=8F=AC=ED=8A=B8=EC=97=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=8B=A4=ED=8C=A8=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/rtspserver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/rtspserver.cpp b/tests/rtspserver.cpp index 1bac659..4e45a58 100644 --- a/tests/rtspserver.cpp +++ b/tests/rtspserver.cpp @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) addServerSessions(); RTSPServer *rtspServer = RTSPServer::instance(); - rtspServer->startServer(554); + rtspServer->startServer(8554); char c; while (c = mygetch() != 'q') { From 636ffeb7123d8d9bfdfc2a20db8beb1e24803592 Mon Sep 17 00:00:00 2001 From: Vahid Nasehi Oskouei <83704425+biot2@users.noreply.github.com> Date: Sat, 30 Apr 2022 16:43:30 +0430 Subject: [PATCH 12/13] Update RTSPClient.cpp --- RTSPClient/RTSP/RTSPClient.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RTSPClient/RTSP/RTSPClient.cpp b/RTSPClient/RTSP/RTSPClient.cpp index f16244b..9d5aa62 100644 --- a/RTSPClient/RTSP/RTSPClient.cpp +++ b/RTSPClient/RTSP/RTSPClient.cpp @@ -942,7 +942,8 @@ void RTSPClient::constructSubsessionURL(MediaSubsession const& subsession, prefix = separator = ""; } else { unsigned prefixLen = strlen(prefix); - separator = (prefix[prefixLen-1] == '/' || suffix[0] == '/') ? "" : "/"; + unsigned suffixLen = strlen(suffix); + separator = ((prefixLen > 0 && prefix[prefixLen-1] == '/') || (suffixlen > 0 && suffix[0] == '/')) ? "" : "/"; } } From ceb4f66cb9d80feb98ea33862d06d22f42e08f3f Mon Sep 17 00:00:00 2001 From: Vahid Nasehi Oskouei <83704425+biot2@users.noreply.github.com> Date: Sat, 30 Apr 2022 18:13:15 +0430 Subject: [PATCH 13/13] Update RTSPClient.cpp Missspelling bug fix for last commit --- RTSPClient/RTSP/RTSPClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RTSPClient/RTSP/RTSPClient.cpp b/RTSPClient/RTSP/RTSPClient.cpp index 9d5aa62..7c5fc38 100644 --- a/RTSPClient/RTSP/RTSPClient.cpp +++ b/RTSPClient/RTSP/RTSPClient.cpp @@ -943,7 +943,7 @@ void RTSPClient::constructSubsessionURL(MediaSubsession const& subsession, } else { unsigned prefixLen = strlen(prefix); unsigned suffixLen = strlen(suffix); - separator = ((prefixLen > 0 && prefix[prefixLen-1] == '/') || (suffixlen > 0 && suffix[0] == '/')) ? "" : "/"; + separator = ((prefixLen > 0 && prefix[prefixLen-1] == '/') || (suffixLen > 0 && suffix[0] == '/')) ? "" : "/"; } }