Codebase list ortp / c93c206
Import upstream version 5.0.0 Debian Janitor 2 years ago
13 changed file(s) with 120 addition(s) and 53 deletion(s). Raw diff Collapse all Expand all
55
66 ## [Unreleased]
77
8 ## [5.0.0] - 2021-07-08
9
10 ### Fixed
11 - small memory leak around TMMBR receiving.
12
13
14 ## [4.5.0] - 2021-03-29
15
16 ### Fixed
17 - minor fixes
818
919 ## [4.4.0] - 2019-06-16
1020
2020 ############################################################################
2121
2222 cmake_minimum_required(VERSION 3.1)
23 project(oRTP VERSION 4.4.0)
23 project(oRTP VERSION 5.0.0)
2424
2525
2626 set(ORTP_MAJOR_VERSION ${PROJECT_VERSION_MAJOR})
3939 #include <stdarg.h>
4040 #include <string.h>
4141
42 #ifdef __linux
42 #ifdef __linux__
4343 #include <stdint.h>
4444 #endif
4545
132132 #if defined(__MINGW32__) || !defined(WINAPI_FAMILY_PARTITION) || !defined(WINAPI_PARTITION_DESKTOP)
133133 #define ORTP_WINDOWS_DESKTOP 1
134134 #elif defined(WINAPI_FAMILY_PARTITION)
135 // See bctoolbox/include/port.h for WINAPI_PARTITION checker
135136 #if defined(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
136137 #define ORTP_WINDOWS_DESKTOP 1
138 #elif defined (WINAPI_PARTITION_PC_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PC_APP)
139 #define ORTP_WINDOWS_DESKTOP 1
140 #define ORTP_WINDOWS_UWP 1
137141 #elif defined(WINAPI_PARTITION_PHONE_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
138142 #define ORTP_WINDOWS_PHONE 1
139143 #elif defined(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
7676 list(APPEND ORTP_SOURCE_FILES_CXX winrttimer.cpp winrttimer.h)
7777 set_source_files_properties(winrttimer.cpp PROPERTIES COMPILE_FLAGS "/ZW /AI\$(WindowsSDK_MetadataPath)")
7878 endif()
79 list(APPEND LIBS ws2_32)# symbols for in6addr_any
7980 endif()
8081
8182 if(WIN32)
134135 target_link_libraries(ortp PUBLIC bctoolbox PRIVATE ${LIBS})
135136 if(MSVC)
136137 if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
137 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/ortp.pdb
138 install(FILES $<TARGET_PDB_FILE:ortp>
138139 DESTINATION ${CMAKE_INSTALL_BINDIR}
139140 PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
140141 )
8585 PAGE_READWRITE, // read/write access
8686 0, // size: high 32-bits
8787 SHMEMSIZE, // size: low 32-bits
88 #ifdef ORTP_WINDOWS_UWP
89 L"oRTPSharedMemory"); // name of map object
90 #else
8891 "oRTPSharedMemory"); // name of map object
92 #endif
8993
9094 if (hMapObject == NULL)
9195 return FALSE;
147147
148148 static const char *find_param_occurence_of(const char *fmtp, const char *param){
149149 const char *pos=fmtp;
150 int param_len = (int)strlen(param);
150151 do{
151152 pos=strstr(pos,param);
152153 if (pos){
153154 /*check that the occurence found is not a subword of a parameter name*/
154 if (pos==fmtp) break;
155 if (pos[-1]==';' || pos[-1]==' '){
156 break;
155 if (pos==fmtp){
156 if (pos[param_len] == '=') break; /* found it */
157 }else if ((pos[-1]==';' || pos[-1]==' ') && pos[param_len] == '='){
158 break; /* found it */
157159 }
158160 pos+=strlen(param);
159161 }
160 }while(pos!=NULL);
162 }while (pos!=NULL);
161163 return pos;
162164 }
163165
2525 #include "ortp/str_utils.h"
2626 #include "utils.h"
2727 #include <bctoolbox/port.h>
28 #include <bctoolbox/charconv.h>
2829
2930 #if defined(_WIN32) && !defined(_WIN32_WCE)
3031 #include <process.h>
531532 ortp_pipe_t ortp_server_pipe_create(const char *name){
532533 #ifdef ORTP_WINDOWS_DESKTOP
533534 ortp_pipe_t h;
534 char *pipename=make_pipe_name(name);
535 h=CreateNamedPipe(pipename,PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_MESSAGE|PIPE_WAIT,1,
536 32768,32768,0,NULL);
537 ortp_free(pipename);
535 #ifdef ORTP_WINDOWS_UWP
536 char *pipenameBuf=make_pipe_name(name);
537 wchar_t * pipename = bctbx_string_to_wide_string(pipenameBuf);
538 ortp_free(pipenameBuf);
539 #else
540 char *pipename=make_pipe_name(name);
541 #endif
542
543 h=CreateNamedPipe(pipename, PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_MESSAGE|PIPE_WAIT, 1, 32768, 32768, 0, NULL);
538544 if (h==INVALID_HANDLE_VALUE){
539545 ortp_error("Fail to create named pipe %s",pipename);
540546 }
547
548 #ifdef ORTP_WINDOWS_UWP
549 bctbx_free(pipename);
550 #else
551 ortp_free(pipename);
552 #endif
541553 if (event==NULL) event=CreateEvent(NULL,TRUE,FALSE,NULL);
542554 return h;
543555 #else
595607 }
596608
597609 ortp_pipe_t ortp_client_pipe_connect(const char *name){
598 #ifdef ORTP_WINDOWS_DESKTOP
610 #if defined( ORTP_WINDOWS_DESKTOP) && !defined(ORTP_WINDOWS_UWP)
599611 char *pipename=make_pipe_name(name);
600612 ortp_pipe_t hpipe = CreateFile(
601613 pipename, // pipe name
646658 void *ortp_shm_open(unsigned int keyid, int size, int create){
647659 #ifdef ORTP_WINDOWS_DESKTOP
648660 HANDLE h;
661 void *buf;
662
663 #ifdef BCTBX_WINDOWS_UWP
664 char nameBuf[64];
665 snprintf(nameBuf,sizeof(nameBuf),"%x",keyid);
666 wchar_t * name = bctbx_string_to_wide_string(nameBuf);
667 #else
649668 char name[64];
650 void *buf;
651
652669 snprintf(name,sizeof(name),"%x",keyid);
670 #endif
671
653672 if (create){
654673 h = CreateFileMapping(
655674 INVALID_HANDLE_VALUE, // use paging file
668687 ortp_error("Fail to open file mapping (create=%i)",create);
669688 return NULL;
670689 }
690 #ifdef BCTBX_WINDOWS_UWP
691 bctbx_free(name);
692 #endif
671693 buf = (LPTSTR) MapViewOfFile(h, // handle to map object
672694 FILE_MAP_ALL_ACCESS, // read/write permission
673695 0,
719741
720742 void _ortp_get_cur_time(ortpTimeSpec *ret, bool_t realtime){
721743 #if defined(_WIN32_WCE) || defined(_WIN32)
722 #if defined( ORTP_WINDOWS_DESKTOP ) && !defined(ENABLE_MICROSOFT_STORE_APP)
744 #if defined( ORTP_WINDOWS_DESKTOP ) && !defined(ENABLE_MICROSOFT_STORE_APP) && !defined(ORTP_WINDOWS_UWP)
723745 DWORD timemillis;
724746 # if defined(_WIN32_WCE)
725747 timemillis=GetTickCount();
784806 }
785807
786808 void ortp_sleep_until(const ortpTimeSpec *ts){
787 #ifdef __linux
809 #ifdef __linux__
788810 struct timespec rq;
789811 rq.tv_sec=ts->tv_sec;
790812 rq.tv_nsec=ts->tv_nsec;
862884 return 0;
863885 }
864886 #endif
865 #elif defined(__QNXNTO__) || ((defined(__linux) || defined(__APPLE__)) && !defined(HAVE_ARC4RANDOM))
887 #elif defined(__QNXNTO__) || ((defined(__linux__) || defined(__APPLE__)) && !defined(HAVE_ARC4RANDOM))
866888
867889 static unsigned int ortp_urandom(void) {
868890 static int fd=-1;
888910 #else
889911 return arc4random();
890912 #endif
891 #elif defined(__linux) || defined(__APPLE__)
913 #elif defined(__linux__) || defined(__APPLE__)
892914 return ortp_urandom();
893915 #elif defined(_WIN32)
894916 static int initd=0;
8888 #else //_WIN32
8989
9090
91 #ifdef ENABLE_MICROSOFT_STORE_APP
91 #if defined(ENABLE_MICROSOFT_STORE_APP) || defined(ORTP_WINDOWS_UWP)
9292
9393 #include <windows.h>
9494 #include <mmsystem.h>
383383 if (size<sizeof(rtcp_app_t)) return 0;
384384 rtcp_common_header_init(&app->ch,session,RTCP_APP,subtype,size);
385385 app->ssrc=htonl(session->snd.ssrc);
386 memset(app->name, 0, 4);
387 strncpy(app->name, name, sizeof(app->name) - 1);
386 memset(app->name, 0, sizeof(app->name));
387 memcpy(app->name, name, sizeof(app->name));
388388 return sizeof(rtcp_app_t);
389389 }
390390
454454 msgpullup(primarymsg, (size_t)-1);
455455
456456 // TODO: Fix when possible
457 int len = primarymsg->b_wptr - primarymsg->b_rptr;
457 size_t len = primarymsg->b_wptr - primarymsg->b_rptr;
458458 memcpy(m->b_rptr, primarymsg->b_rptr, len);
459459 m->b_wptr = m->b_rptr + len;
460460
16641664 meta_rtp_transport_destroy(rtcp_meta_transport);
16651665
16661666 #if (_WIN32_WINNT >= 0x0600) && defined(ORTP_WINDOWS_DESKTOP)
1667 #ifndef ENABLE_MICROSOFT_STORE_APP
1667 #if !defined(ENABLE_MICROSOFT_STORE_APP) && !defined(ORTP_WINDOWS_UWP)
16681668 if (session->rtp.QoSFlowID != 0)
16691669 {
16701670 ortp_message("check OS support for qwave.lib");
16861686 #endif //ENABLE_MICROSOFT_STORE_APP
16871687 #endif
16881688
1689 if (session->rtcp.tmmbr_info.sent)
1690 freemsg(session->rtcp.tmmbr_info.sent);
16891691 if (session->rtcp.tmmbr_info.received)
16901692 freemsg(session->rtcp.tmmbr_info.received);
16911693 if (session->rtcp.send_algo.fb_packets)
22192221
22202222 if (id == (int)(*tmp >> 4)) {
22212223 if (data) *data = tmp + 1;
2222 return size;
2224 return (int)size;
22232225 }
22242226
22252227 tmp += size + 1;
22342236
22352237 if (id == (int)*tmp) {
22362238 if (data) *data = tmp + 2;
2237 return size;
2239 return (int)size;
22382240 }
22392241
22402242 tmp += size + 2;
25852587 return 0;
25862588 }
25872589
2588 ret = msgdsize(msg);
2590 ret = (int)msgdsize(msg);
25892591 }
25902592 }
25912593
264264 if (ortp_WSARecvMsg == NULL) {
265265 GUID guid = WSAID_WSARECVMSG;
266266 DWORD bytes_returned;
267 if (WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid),
267 if ( WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid),
268268 &ortp_WSARecvMsg, sizeof(ortp_WSARecvMsg), &bytes_returned, NULL, NULL) == SOCKET_ERROR) {
269 ortp_warning("WSARecvMsg function not found.");
269 ortp_warning("WSARecvMsg function not found [%d].", WSAGetLastError());
270270 }
271271 }
272272 #endif
661661 if (session->rtp.gs.socket == (ortp_socket_t)-1) return 0;
662662
663663 #if (_WIN32_WINNT >= 0x0600) && defined(ORTP_WINDOWS_DESKTOP)
664 #ifndef ENABLE_MICROSOFT_STORE_APP
664 #if !defined(ENABLE_MICROSOFT_STORE_APP) && !defined(ORTP_WINDOWS_UWP)
665665 ortp_message("check OS support for qwave.lib");
666666 if (IsWindowsVistaOrGreater()) {
667667 if (session->dscp==0)
735735 }
736736 }
737737 #if (_WIN32_WINNT >= 0x0600) && defined(ORTP_WINDOWS_DESKTOP)
738 #ifndef ENABLE_MICROSOFT_STORE_APP
738 #if !defined(ENABLE_MICROSOFT_STORE_APP) && !defined(ORTP_WINDOWS_UWP)
739739 }
740740 #endif // ENABLE_MICROSOFT_STORE_APP
741741 #endif
10161016
10171017 #if defined(_WIN32) || defined(_WIN32_WCE)
10181018 #define MAX_BUF 64
1019 static int rtp_sendmsg(int sock, mblk_t *m, const struct sockaddr *rem_addr, socklen_t addr_len) {
1019 static int rtp_sendmsg(ortp_socket_t sock, mblk_t *m, const struct sockaddr *rem_addr, socklen_t addr_len) {
10201020 WSAMSG msg = {0};
10211021 WSABUF wsabuf[MAX_BUF];
10221022 DWORD dwBytes = 0;
10291029 struct sockaddr_storage v4, v6Mapped;
10301030 socklen_t v4Len=0, v6MappedLen=0;
10311031 bool_t useV4 = FALSE;
1032 struct sockaddr remote_address = {0};
1033 struct addrinfo* feed_server = NULL;
10321034
10331035 for (wsabufLen = 0; wsabufLen < MAX_BUF && mTrack != NULL; mTrack = mTrack->b_cont, ++wsabufLen) {
1036 wsabuf[wsabufLen].len = (ULONG)(mTrack->b_wptr - mTrack->b_rptr);
10341037 wsabuf[wsabufLen].buf = mTrack->b_rptr;
1035 wsabuf[wsabufLen].len = mTrack->b_wptr - mTrack->b_rptr;
10361038 }
10371039 msg.lpBuffers = wsabuf; // contents
10381040 msg.dwBufferCount = wsabufLen;
10441046 }
10451047 ortp_error("Too long msgb (%i fragments) , didn't fit into iov, end discarded.", MAX_BUF + count);
10461048 }
1047 msg.name = (SOCKADDR *)rem_addr;
1048 msg.namelen = addr_len;
1049 if( addr_len == 0){
1050 // Get the local host information
1051 msg.namelen = 0;
1052 msg.name = NULL;
1053 }else{
1054 msg.namelen = addr_len;
1055 msg.name = (SOCKADDR *)rem_addr;
1056 }
10491057 msg.Control.buf = ctrlBuffer;
10501058 msg.Control.len = sizeof(ctrlBuffer);
10511059 cmsg = WSA_CMSG_FIRSTHDR(&msg);
10841092 msg.Control.len = controlSize;
10851093 if (controlSize == 0)
10861094 msg.Control.buf = NULL;
1087 error = WSASendMsg(sock, &msg, 0, &dwBytes, NULL, NULL);
1088 if( error == SOCKET_ERROR && controlSize != 0){
1095 error = WSASendMsg((SOCKET)sock, &msg, 0, &dwBytes, NULL, NULL);
1096 if( error == SOCKET_ERROR && controlSize != 0){// Debug note : if unexpected WSAEFAULT, check the location of memory allocation of msg. It must be on ortp addresses space.
10891097 int errorCode = WSAGetLastError();
10901098 if( errorCode == WSAEINVAL || errorCode==WSAENETUNREACH || errorCode==WSAEFAULT)
10911099 {
10921100 msg.Control.len = 0;
10931101 msg.Control.buf = NULL;
1094 error = WSASendMsg(sock, &msg, 0, &dwBytes, NULL, NULL);
1095 }
1096 }
1097 return error;
1102 error = WSASendMsg((SOCKET)sock, &msg, 0, &dwBytes, NULL, NULL);
1103 }
1104 }
1105 mTrack = m;
1106 if(error >= 0)
1107 return dwBytes;// Return the bytes that have been sent
1108 else
1109 return error;
10981110 }
10991111 #else
11001112 #ifdef USE_SENDMSG
11011113 #define MAX_IOV 64
1102 static int rtp_sendmsg(int sock,mblk_t *m, const struct sockaddr *rem_addr, socklen_t addr_len){
1114 static int rtp_sendmsg(ortp_socket_t sock,mblk_t *m, const struct sockaddr *rem_addr, socklen_t addr_len){
11031115 struct msghdr msg;
11041116 struct iovec iov[MAX_IOV];
11051117 int iovlen;
12091221 msg.msg_controllen = controlSize;
12101222 if( controlSize==0) // Have to reset msg_control to NULL as msg_controllen is not sufficient on some platforms
12111223 msg.msg_control = NULL;
1212 error = sendmsg(sock,&msg,0);
1224 error = sendmsg((int)sock,&msg,0);
12131225 if( error == -1 && controlSize != 0 && (errno == EINVAL || errno==ENETUNREACH || errno==EFAULT)) {
12141226 msg.msg_controllen =0;
12151227 msg.msg_control = NULL;
1216 error = sendmsg(sock,&msg,0);
1228 error = sendmsg((int)sock,&msg,0);
12171229 }
12181230 return error;
12191231 }
12251237 }
12261238
12271239 int _ortp_sendto(ortp_socket_t sockfd, mblk_t *m, int flags, const struct sockaddr *destaddr, socklen_t destlen) {
1228 int error;
1240 int sent_bytes;
12291241 #if defined(_WIN32) || defined(_WIN32_WCE) || defined(USE_SENDMSG)
1230 error = rtp_sendmsg(sockfd, m, destaddr, destlen);
1242 sent_bytes = rtp_sendmsg(sockfd, m, destaddr, destlen);
12311243 #else
12321244 if (m->b_cont != NULL)
12331245 msgpullup(m, -1);
1234 error = sendto(sockfd, (char*)m->b_rptr, (int)(m->b_wptr - m->b_rptr), 0, destaddr, destlen);
1235 #endif
1236 return error;
1246 sent_bytes = sendto(sockfd, (char*)m->b_rptr, (int)(m->b_wptr - m->b_rptr), 0, destaddr, destlen);
1247 #endif
1248 return sent_bytes;
12371249 }
12381250
12391251 int rtp_session_sendto(RtpSession *session, bool_t is_rtp, mblk_t *m, int flags, const struct sockaddr *destaddr, socklen_t destlen){
15161528 return error;
15171529 }
15181530 #endif
1519
15201531 int rtp_session_rtp_recv_abstract(ortp_socket_t socket, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen) {
15211532 int ret;
15221533 int bufsz = (int) (msg->b_datap->db_lim - msg->b_datap->db_base);
15251536 WSAMSG msghdr = {0};
15261537 WSACMSGHDR *cmsghdr;
15271538 WSABUF data_buf;
1528 DWORD bytes_received;
1529
1539 DWORD bytes_received=0;
1540 int error = 0;
15301541 if (ortp_WSARecvMsg == NULL) {
15311542 return recvfrom(socket, (char *)msg->b_wptr, bufsz, flags, from, fromlen);
15321543 }
15371548 }
15381549 data_buf.buf = (char *)msg->b_wptr;
15391550 data_buf.len = bufsz;
1551 msghdr.dwBufferCount = 1;
15401552 msghdr.lpBuffers = &data_buf;
1541 msghdr.dwBufferCount = 1;
15421553 msghdr.Control.buf = control;
15431554 msghdr.Control.len = sizeof(control);
15441555 msghdr.dwFlags = flags;
16111622 memcpy(&msg->net_addr,from,*fromlen);
16121623 msg->net_addrlen = *fromlen;
16131624 }
1625 }else{
16141626 }
16151627 return ret;
16161628 }
19201932 {
19211933 if (session->on_network_error.count>0){
19221934 rtp_signal_table_emit3(&session->on_network_error,"Error receiving RTP packet",ORTP_INT_TO_POINTER(getSocketErrorCode()));
1923 }else ortp_warning("Error receiving RTP packet: %s, err num [%i],error [%i]",getSocketError(),errnum,error);
1935 #ifdef _WIN32
1936 }else if(errnum!=WSAECONNRESET) ortp_warning("Error receiving RTP packet err num [%i], error [%i]: %s",errnum,error,getSocketError());// Windows spam WSAECONNRESET and is not useful
1937 #else
1938 }else ortp_warning("Error receiving RTP packet err num [%i], error [%i]: %s",errnum,error,getSocketError());
1939 #endif
19241940 #if TARGET_OS_IPHONE
19251941 /*hack for iOS and non-working socket because of background mode*/
19261942 if (errnum==ENOTCONN){
20402056 {
20412057 if (session->on_network_error.count>0){
20422058 rtp_signal_table_emit3(&session->on_network_error,"Error receiving RTCP packet",ORTP_INT_TO_POINTER(getSocketErrorCode()));
2059 #ifdef _WIN32
2060 }else if(errnum!=WSAECONNRESET) ortp_warning("Error receiving RTCP packet: %s, err num [%i],error [%i]",getSocketError(),errnum,error);// Windows spam WSAECONNRESET and is not useful
2061 #else
20432062 }else ortp_warning("Error receiving RTCP packet: %s, err num [%i],error [%i]",getSocketError(),errnum,error);
2063 #endif
20442064 #if TARGET_OS_IPHONE
20452065 /*hack for iOS and non-working socket because of background mode*/
20462066 if (errnum==ENOTCONN){
409409 addr_in6->sin6_port = recvaddr->port;
410410 memcpy(&addr_in6->sin6_addr, &recvaddr->addr.ipi6_addr, sizeof(recvaddr->addr.ipi6_addr));
411411 *socklen = sizeof(struct sockaddr_in6);
412 }else{
413 *socklen = 0;
412414 }
413415 }
414416 void ortp_sockaddr_to_recvaddr(const struct sockaddr * addr, ortp_recv_addr_t * recvaddr) {