diff --git a/.gitignore b/.gitignore index a5c22c3..b178679 100644 --- a/.gitignore +++ b/.gitignore @@ -51,5 +51,5 @@ myRtspClient/jrtplib/src/cmake_install.cmake myRtspClient/libmyRtspClient.so myRtspClient/jrtplib/examples/example[0-9] cmake_config_build.* -CMakeLists.txt third_party/JRTPLIB/examples/* +cmake_install.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f1390a1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,20 @@ +project(myRtspClient) + +include_directories(third_party/Base64_live555/include) +include_directories(third_party/md5/include) +include_directories(third_party/JRTPLIB/src) +include_directories(include) +include_directories(myRtspClient/include) +include_directories(third_party/JTHREAD/src) + + +add_subdirectory(third_party/JRTPLIB _JTRPLIB) +include_directories(${PROJECT_BINARY_DIR}/_JTRPLIB/src) + + +file(GLOB SOURCES "myRtspClient/*.cpp" "third_party/Base64_live555/*.cpp" "third_party/md5/*.cpp" "third_party/JTHREAD/*.cpp" "third_party/JTHREAD/src*.cpp" "third_party/JTHREAD/jthread/*.cpp") + +add_library(myRtspClient SHARED ${SOURCES}) +add_library(myRtspClient-static STATIC ${SOURCES}) +target_link_libraries(myRtspClient jrtplib-shared) +target_link_libraries(myRtspClient-static jrtplib-static) diff --git a/config.armlinux b/config.armlinux index 13a8ac0..06c8aba 100755 --- a/config.armlinux +++ b/config.armlinux @@ -6,7 +6,7 @@ CROSS_COMPILE= $(CROSS_COMPILE_DIR)/bin/arm-linux-gnueabi- # # CROSS_COMPILE_DIR?= # CROSS_COMPILE?= -COMPILE_OPTS = $(INCLUDES) -I. -O2 +COMPILE_OPTS = $(INCLUDES) -I. -O2 -std=c++11 C = c C_COMPILER = $(CROSS_COMPILE)gcc C_FLAGS = $(COMPILE_OPTS) diff --git a/config.debug b/config.debug index a03eed8..fa58e6c 100755 --- a/config.debug +++ b/config.debug @@ -1,4 +1,4 @@ -COMPILE_OPTS = $(INCLUDES) -I. -g -fPIC +COMPILE_OPTS = $(INCLUDES) -I. -g -std=c++11 -fPIC C = c C_COMPILER = cc C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) diff --git a/config.linux b/config.linux index 5ab8682..fafd61f 100755 --- a/config.linux +++ b/config.linux @@ -1,4 +1,4 @@ -COMPILE_OPTS = $(INCLUDES) -I. -O2 -fPIC +COMPILE_OPTS = $(INCLUDES) -I. -O2 -std=c++11 -fPIC C = c C_COMPILER = cc C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) diff --git a/config.macosx b/config.macosx index 84e8b93..27a517e 100755 --- a/config.macosx +++ b/config.macosx @@ -1,4 +1,4 @@ -COMPILE_OPTS = $(INCLUDES) -I. -O2 +COMPILE_OPTS = $(INCLUDES) -I. -O2 -std=c++11 C = c C_COMPILER = cc C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) diff --git a/example/common_example.cpp b/example/common_example.cpp index ecb4bdb..9140d7d 100644 --- a/example/common_example.cpp +++ b/example/common_example.cpp @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) * if there are several 'video' session * refered in SDP, only receive packets of the first * 'video' session, the same as 'audio'.*/ - // int packet_num = 0; + int packet_num = 0; const size_t BufSize = 98304; uint8_t buf[BufSize]; size_t size = 0; diff --git a/example/complete_example.cpp b/example/complete_example.cpp index 0e26067..fc902b9 100644 --- a/example/complete_example.cpp +++ b/example/complete_example.cpp @@ -141,7 +141,7 @@ int main(int argc, char *argv[]) SPS, PPS, VPS by yourself just at the begining of the video data */ /* For convenience, you could refer to "simple_example.cpp" */ /* Get SPS, PPS, VPS manually start */ - // Client.SetObtainVpsSpsPpsPeriodly(false); + // Client.SetObtainVpsSpsPpsPeriodly(false); // if(!Client.GetVPSNalu(buf, &size)) { // if(write(fd, buf, size) < 0) { // perror("write"); @@ -156,7 +156,7 @@ int main(int argc, char *argv[]) // if(write(fd, buf, size) < 0) { // perror("write"); // } - // } + // } /* Get SPS, PPS, VPS manually end */ diff --git a/gtest/test_suit_regex.cpp b/gtest/test_suit_regex.cpp index c78df1e..53b0b4f 100644 --- a/gtest/test_suit_regex.cpp +++ b/gtest/test_suit_regex.cpp @@ -140,16 +140,3 @@ TEST(myRegex, SDP) group.pop_front(); EXPECT_EQ(group.front() == "RAHBpVgeSA==", true); } - -TEST(myRegex, Session) -{ - MyRegex Regex; - - string str("Session: 617suw+aMAmF7a3m; timeout=60"); - string Pattern("Session: +([0-9a-zA-Z_\\$-.\\..\\+]+)"); - list group; - - EXPECT_EQ(Regex.Regex(str.c_str(), Pattern.c_str(), &group), MyRegex::REGEX_SUCCESS); - group.pop_front(); - EXPECT_EQ(group.front() == "617suw+aMAmF7a3m", true); -} diff --git a/third_party/JRTPLIB/CMakeLists.txt b/third_party/JRTPLIB/CMakeLists.txt new file mode 100644 index 0000000..aff47d4 --- /dev/null +++ b/third_party/JRTPLIB/CMakeLists.txt @@ -0,0 +1,238 @@ +# Configure for cmake here +set(JTHREAD_FOUND 0) +cmake_minimum_required(VERSION 2.8) +if (POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif() + +project(jrtplib) +set(VERSION_MAJOR 3) +set(VERSION_MINOR 11) +set(VERSION_DEBUG 1) +set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_DEBUG}") + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake") +if (CMAKE_INSTALL_PREFIX AND NOT CMAKE_PREFIX_PATH) + #message("Setting CMAKE_PREFIX_PATH to ${CMAKE_INSTALL_PREFIX}") + file(TO_CMAKE_PATH "${CMAKE_INSTALL_PREFIX}" CMAKE_PREFIX_PATH) +endif() + +set (_DEFAULT_LIBRARY_INSTALL_DIR lib) +if (EXISTS "${CMAKE_INSTALL_PREFIX}/lib32/" AND CMAKE_SIZEOF_VOID_P EQUAL 4) + set (_DEFAULT_LIBRARY_INSTALL_DIR lib32) +elseif (EXISTS "${CMAKE_INSTALL_PREFIX}/lib64/" AND CMAKE_SIZEOF_VOID_P EQUAL 8) + set (_DEFAULT_LIBRARY_INSTALL_DIR lib64) +endif () + +set(LIBRARY_INSTALL_DIR "${_DEFAULT_LIBRARY_INSTALL_DIR}" CACHE PATH "Library installation directory") +if(NOT IS_ABSOLUTE "${LIBRARY_INSTALL_DIR}") + set(LIBRARY_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIBRARY_INSTALL_DIR}") +endif() + +include(CheckCXXCompilerFlag) +include(CheckIncludeFile) +include(CheckIncludeFileCXX) +include(CheckCXXSourceCompiles) +include(TestBigEndian) +include(${PROJECT_SOURCE_DIR}/cmake/Macros.cmake) + +include_directories("${PROJECT_SOURCE_DIR}/../JTHREAD/build/src") +set(JTHREAD_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/../JTHREAD") +set(JTHREAD_LIBRARIES "-L${PROJECT_SOURCE_DIR}/../JTHREAD/build/src" "-ljthread" "-lpthread") + + +# find_package(JThread) + +set(JRTPLIB_LINK_LIBS "") +set(JRTPLIB_INTERNAL_INCLUDES "") +set(JRTPLIB_EXTERNAL_INCLUDES "") + +add_additional_stuff(JRTPLIB_EXTERNAL_INCLUDES JRTPLIB_LINK_LIBS) + +jrtplib_support_option("Support SDES PRIV items" JRTPLIB_SUPPORT_SDESPRIV RTP_SUPPORT_SDESPRIV ON "// No support for SDES PRIV items") +jrtplib_support_option("Support the probation mechanism for a new source" JRTPLIB_SUPPORT_PROBATION RTP_SUPPORT_PROBATION ON "// Do not wait for a number of consecutive packets to validate source") +jrtplib_support_option("Support sending RTCP APP packets" JRTPLIB_SUPPORT_SENDAPP RTP_SUPPORT_SENDAPP ON "// No direct support for sending RTCP APP packets") +jrtplib_support_option("Support sending unknown RTCP packets" JRTPLIB_SUPPORT_RTCPUNKNOWN RTP_SUPPORT_RTCPUNKNOWN OFF "// No support for sending unknown RTCP packets") +jrtplib_support_option("Support memory management mechanism" JRTPLIB_SUPPORT_MEMORYMGMT RTP_SUPPORT_MEMORYMANAGEMENT ON "// No memory management support") + +jrtplib_include_test(sys/filio.h RTP_HAVE_SYS_FILIO "// Don't have ") +jrtplib_include_test(sys/sockio.h RTP_HAVE_SYS_SOCKIO "// Don't have ") +jrtplib_include_test(netinet/in.h RTP_SUPPORT_NETINET_IN "// Don't have ") + +if (JTHREAD_FOUND) + set(V "ON") +else (JTHREAD_FOUND) + set(V "OFF") +endif (JTHREAD_FOUND) + +option(JTHREAD_ENABLED "Thread support" ${V}) +if (JTHREAD_ENABLED) + set (RTP_SUPPORT_THREAD "#define RTP_SUPPORT_THREAD") + if (JTHREAD_FOUND) + save_paths(JRTPLIB_EXTERNAL_INCLUDES "${JTHREAD_INCLUDE_DIRS}") + save_paths(JRTPLIB_LINK_LIBS "${JTHREAD_LIBRARIES}") + endif(JTHREAD_FOUND) +else (JTHREAD_ENABLED) + set (RTP_SUPPORT_THREAD "// No support for JThread was enabled") +endif (JTHREAD_ENABLED) + +find_package(LIBSRTP) +if (LIBSRTP_FOUND) + set(V "ON") +else (LIBSRTP_FOUND) + set(V "OFF") +endif (LIBSRTP_FOUND) + +option(SRTP_ENABLED "Secure RTP (SRTP) support" ${V}) +if (SRTP_ENABLED) + set(RTP_SUPPORT_SRTP "#define RTP_SUPPORT_SRTP") + if (LIBSRTP_FOUND) + save_paths(JRTPLIB_EXTERNAL_INCLUDES "${LIBSRTP_INCLUDE_DIR}") + save_paths(JRTPLIB_LINK_LIBS "${LIBSRTP_LIBRARY_DIR}") + endif (LIBSRTP_FOUND) +else (SRTP_ENABLED) + set(RTP_SUPPORT_SRTP "// No SRTP support") +endif (SRTP_ENABLED) + +if (CMAKE_CROSSCOMPILING) + option (JRTPLIB_USE_BIGENDIAN "Target platform is big endian" ON) + if (JRTPLIB_USE_BIGENDIAN) + set(RTP_ENDIAN "#define RTP_BIG_ENDIAN") + else (JRTPLIB_USE_BIGENDIAN) + set(RTP_ENDIAN "// Little endian system") + endif (JRTPLIB_USE_BIGENDIAN) +else (CMAKE_CROSSCOMPILING) + test_big_endian(JRTPLIB_BIGENDIAN) + if (JRTPLIB_BIGENDIAN) + set(RTP_ENDIAN "#define RTP_BIG_ENDIAN") + else (JRTPLIB_BIGENDIAN) + set(RTP_ENDIAN "// Little endian system") + endif (JRTPLIB_BIGENDIAN) +endif (CMAKE_CROSSCOMPILING) + +option(JRTPLIB_COMPILE_TESTS "Compile various tests in the 'tests' subdirectory" NO) + +# Check winsock first +set(TESTDEFS "") +set(EMPTYWSSTRING "// Not using winsock sockets") +jrtplib_test_feature(winsocktest RTP_SOCKETTYPE_WINSOCK FALSE "${EMPTYWSSTRING}" "${TESTDEFS}") +if ("${RTP_SOCKETTYPE_WINSOCK}" STREQUAL "${EMPTYWSSTRING}") + set(JRTPLIB_WINSOCK FALSE) +else () + set(JRTPLIB_WINSOCK TRUE) + set(TESTDEFS "${TESTDEFS} -DRTP_SOCKETTYPE_WINSOCK") +endif() + +jrtplib_test_feature(socklentest RTP_SOCKLENTYPE_UINT TRUE "// socklen_t is 'int'" "${TESTDEFS}") +jrtplib_test_feature(ipv4mcasttest RTP_SUPPORT_IPV4MULTICAST FALSE "// No IPv4 multicasting support" "${TESTDEFS}") +jrtplib_test_feature(salentest RTP_HAVE_SOCKADDR_LEN FALSE "// No sa_len member in struct sockaddr" "${TESTDEFS}") +jrtplib_test_feature(getloginrtest RTP_SUPPORT_GETLOGINR FALSE "// Not using getlogin_r" "${TESTDEFS}") +jrtplib_test_feature(ipv6test RTP_SUPPORT_IPV6 FALSE "// No IPv6 support" "${TESTDEFS}") +jrtplib_test_feature(ipv6mcasttest RTP_SUPPORT_IPV6MULTICAST FALSE "// No IPv6 multicasting support" "${TESTDEFS}") +jrtplib_test_feature(performancecounter RTP_HAVE_QUERYPERFORMANCECOUNTER FALSE "// No QueryPerformanceCounter support" "${TESTDEFS}") +jrtplib_test_feature(suffix RTP_HAVE_VSUINT64SUFFIX FALSE "// No ui64 suffix" "${TESTDEFS}") +jrtplib_test_feature(arrayalloc RTP_HAVE_ARRAYALLOC FALSE "// No custom new[]" "${TESTDEFS}") +jrtplib_test_feature(randstest RTP_HAVE_RAND_S FALSE "// No rand_s support" "${TESTDEFS}") +jrtplib_test_feature(strncpystest RTP_HAVE_STRNCPY_S FALSE "// No strncpy_s support" "${TESTDEFS}") +jrtplib_test_feature(clockgettimetest RTP_HAVE_CLOCK_GETTIME FALSE "// No clock_gettime support" "${TESTDEFS}") +jrtplib_test_feature(polltest RTP_HAVE_POLL FALSE "// No 'poll' support" "${TESTDEFS}") +jrtplib_test_feature(wsapolltest RTP_HAVE_WSAPOLL FALSE "// No 'WSAPoll' support" "${TESTDEFS}") +jrtplib_test_feature(msgnosignaltest RTP_HAVE_MSG_NOSIGNAL FALSE "// No MSG_NOSIGNAL option" "${TESTDEFS}") +jrtplib_test_feature(ifaddrstest RTP_SUPPORT_IFADDRS FALSE "// No ifaddrs support" "${TESTDEFS}") + +check_cxx_source_compiles("#include \n#include \nint main(void) { char s[1024]; _snprintf_s(s, 1024,\"%d\", 10);\n return 0; }" JRTPLIB_SNPRINTF_S) +if (JRTPLIB_SNPRINTF_S) + set(RTP_SNPRINTF_VERSION "#define RTP_HAVE_SNPRINTF_S") +else () + check_cxx_source_compiles("#include \n#include \nint main(void) { char s[1024]; _snprintf(s, 1024,\"%d\", 10);\n return 0; }" JRTPLIB_SNPRINTF) + if (JRTPLIB_SNPRINTF) + set(RTP_SNPRINTF_VERSION "#define RTP_HAVE_SNPRINTF") + else () + set(RTP_SNPRINTF_VERSION "// Stdio snprintf version") + endif() +endif() + +check_cxx_source_compiles("#include \n#include \nint main(void) { size_t a = 0 ; size_t b = a; uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_STDINT) +if (JRTPLIB_STDINT) + set(RTP_INTTYPE_HEADERS "#include \n#include ") +else (JRTPLIB_STDINT) + check_cxx_source_compiles("#include \n#include \nint main(void) { uint32_t x = 0; uint32_t y = x; return 0; }" JRTPLIB_INTTYPES) + if (JRTPLIB_INTTYPES) + set(RTP_INTTYPE_HEADERS "#include \n#include \n") + else (JRTPLIB_INTTYPES) + if (MSVC) + set(RTP_INTTYPE_HEADERS "#include \"rtptypes_win.h\"") + else (MSVC) + set(RTP_INTTYPE_HEADERS "#error Could not find header files that define types like 'uint32_t'. Please edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h and make sure that the following types are defined: int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t") + message("\n\nError: Could not find header files that define types like 'uint32_t'.\nPlease edit the file ${PROJECT_BINARY_DIR}/src/rtptypes_unix.h\nand make sure that the following types are defined: \nint8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t\n\n") + endif (MSVC) + endif (JRTPLIB_INTTYPES) +endif (JRTPLIB_STDINT) + +if (JRTPLIB_WINSOCK) + set(RTP_WINSOCK_HEADERS "#ifdef RTP_SOCKETTYPE_WINSOCK\n #include \n #include \n#ifndef _WIN32_WCE\n #include \n#endif // _WIN32_WCE\n#endif // RTP_SOCKETTYPE_WINSOCK\n") + list(APPEND JRTPLIB_LINK_LIBS "ws2_32") +endif () + +if (MSVC) + set(JRTPLIB_COMPILE_STATIC ON CACHE BOOL "Flag indicating if a static library should be built, or a dynamic one") +endif () + +if (NOT MSVC OR JRTPLIB_COMPILE_STATIC) + set(JRTPLIB_IMPORT "") + set(JRTPLIB_EXPORT "") +else () + set(JRTPLIB_IMPORT "__declspec(dllimport)") + set(JRTPLIB_EXPORT "__declspec(dllexport)") +endif () + +configure_file("${PROJECT_SOURCE_DIR}/src/rtptypes.h.in" "${PROJECT_BINARY_DIR}/src/rtptypes.h") +configure_file("${PROJECT_SOURCE_DIR}/src/rtpconfig.h.in" "${PROJECT_BINARY_DIR}/src/rtpconfig.h") +configure_file("${PROJECT_SOURCE_DIR}/src/rtplibraryversioninternal.h.in" "${PROJECT_BINARY_DIR}/src/rtplibraryversioninternal.h") + +save_paths(JRTPLIB_INTERNAL_INCLUDES "${PROJECT_SOURCE_DIR}/src" "${PROJECT_BINARY_DIR}/src") + +add_subdirectory(src) +# add_subdirectory(examples) + +if (JRTPLIB_COMPILE_TESTS) + add_subdirectory(tests) +endif() + +if (NOT MSVC) + set(JRTPLIB_LIBS "-L${LIBRARY_INSTALL_DIR}" "-ljrtp") +else () + set(JRTPLIB_LIBS optimized "${LIBRARY_INSTALL_DIR}/jrtplib.lib" + debug "${LIBRARY_INSTALL_DIR}/jrtplib_d.lib") +endif () + +set(JRTPLIB_INCDIRS ${JRTPLIB_EXTERNAL_INCLUDES} ${CMAKE_INSTALL_PREFIX}/include) +set(JRTPLIB_LIBS ${JRTPLIB_LIBS} ${JRTPLIB_LINK_LIBS}) +remove_empty(JRTPLIB_INCDIRS) +list(REMOVE_DUPLICATES JRTPLIB_INCDIRS) +remove_empty(JRTPLIB_LIBS) + +foreach(ARG ${JRTPLIB_LIBS}) + set(JRTPLIB_LIBS_CMAKECONFIG "${JRTPLIB_LIBS_CMAKECONFIG} \"${ARG}\"") +endforeach() +foreach(ARG ${JRTPLIB_INCDIRS}) + set(JRTPLIB_INCDIRS_CMAKECONFIG "${JRTPLIB_INCDIRS_CMAKECONFIG} \"${ARG}\"") +endforeach() + +configure_file("${PROJECT_SOURCE_DIR}/cmake/JRTPLIBConfig.cmake.in" "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake") +install(FILES "${PROJECT_BINARY_DIR}/cmake/JRTPLIBConfig.cmake" DESTINATION ${LIBRARY_INSTALL_DIR}/cmake/JRTPLIB) + +if (NOT MSVC) + foreach(ARG ${JRTPLIB_LIBS}) + set(JRTPLIB_LIBS_PKGCONFIG "${JRTPLIB_LIBS_PKGCONFIG} ${ARG}") + endforeach() + foreach(ARG ${JRTPLIB_INCDIRS}) + set(JRTPLIB_INCDIRS_PKGCONFIG "${JRTPLIB_INCDIRS_PKGCONFIG} -I${ARG}") + endforeach() + + configure_file(${PROJECT_SOURCE_DIR}/pkgconfig/jrtplib.pc.in ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc) + install(FILES ${PROJECT_BINARY_DIR}/pkgconfig/jrtplib.pc DESTINATION ${LIBRARY_INSTALL_DIR}/pkgconfig) +endif () + + + diff --git a/third_party/JRTPLIB/src/rtpudpv4transmitter.cpp b/third_party/JRTPLIB/src/rtpudpv4transmitter.cpp index 9b8cb29..7be02a5 100644 --- a/third_party/JRTPLIB/src/rtpudpv4transmitter.cpp +++ b/third_party/JRTPLIB/src/rtpudpv4transmitter.cpp @@ -188,7 +188,7 @@ int GetAutoSockets(uint32_t bindIP, bool allowOdd, bool rtcpMux, addr.sin_family = AF_INET; addr.sin_port = 0; addr.sin_addr.s_addr = htonl(bindIP); - if (bind(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) + if (::bind(sock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) { RTPCLOSE(sock); for (size_t i = 0 ; i < toClose.size() ; i++) @@ -255,7 +255,7 @@ int GetAutoSockets(uint32_t bindIP, bool allowOdd, bool rtcpMux, addr.sin_family = AF_INET; addr.sin_port = htons(secondPort); addr.sin_addr.s_addr = htonl(bindIP); - if (bind(sock2,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) == 0) + if (::bind(sock2,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) == 0) { // In this case, we have two consecutive port numbers, the lower of // which is even @@ -399,7 +399,7 @@ int RTPUDPv4Transmitter::Create(size_t maximumpacketsize,const RTPTransmissionPa addr.sin_family = AF_INET; addr.sin_port = htons(params->GetPortbase()); addr.sin_addr.s_addr = htonl(bindIP); - if (bind(rtpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) + if (::bind(rtpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) { CLOSESOCKETS; MAINMUTEX_UNLOCK @@ -422,7 +422,7 @@ int RTPUDPv4Transmitter::Create(size_t maximumpacketsize,const RTPTransmissionPa addr.sin_family = AF_INET; addr.sin_port = htons(rtcpport); addr.sin_addr.s_addr = htonl(bindIP); - if (bind(rtcpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) + if (::bind(rtcpsock,(struct sockaddr *)&addr,sizeof(struct sockaddr_in)) != 0) { CLOSESOCKETS; MAINMUTEX_UNLOCK